1. 漏洞文件vul.php代碼如下圖,考慮如何利用:(本地測試)
2. 背景知識:
PHP中有一些特殊函數可以自動調用,即它們不需要其它函數的調用即可執行自己的代碼,考慮到這個特性,這些函數通常被稱為魔幻函數或魔幻方法。
最常用的魔幻函數是__construct(),因為PHP版本5中,__construct方法實際上是你所定義的類的構造函數。對於一個給定的類,如果PHP 5找不到 __construct()函數,那么它將搜索一個與類名字相同的函數,這是PHP中編寫構造器的老方法,這種方法中你只需要定義一個名字與類名相同的函數。
下面是PHP中的一些魔幻函數:
__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke(), __set_state(), __clone(), __autoload().
3. 利用過程:
漏洞代碼中,接受參數作為文件名並讀取,然后反序列化。
我們在web目錄下准備test.php文件,內容如下圖:
編寫serial.php文件對其進行序列化,並把結果寫入到test.txt中,代碼如下圖:
test.txt內容如下:
然后訪問漏洞文件:http://localhost/vul.php?filename=test.txt
成功訪問后,test2.txt中會被寫入323232。
因為漏洞文件的AA類中的__destruct函數被自動執行了(具體原理應該是unserialize函數執行時觸發的一些操作,沒深入研究)。
如果把test.php文件內容改為如下:
然后用serial.php進行序列並寫入到test.txt中,再次訪問漏洞文件:http://localhost/vul.php?filename=test.txt
此時,會在web目錄下生成test2.php文件,訪問后執行里面的代碼。進一步利用可以獲取webshell。
利用反序列化漏洞的前提:
unserialize()函數的參數可控;
php文件中存在可利用的類,類中有魔術方法