0x01 挑戰1
提到對象注入,首先就要了解對象的序列化與反序列化,所以對象注入漏洞也有人稱作反序列化漏洞。有關序列化與反序列的內容,在這裏做簡單說明。
序列化的參數類型表示說明
String
s:size:value
Integer
i:value
Boolean
b:value
Null
N
Array
a:size:{key define;value define}
Object
O:strlen(class name):“class name”:object size:{type:len:value;,}
整個對象的序列化形式就是以"T-L-V"形式來表示的,即類型-長度-值來表示的。
比如下面這個例子
回到題目再看題目中的輸出
可以看到,頁面將序列化字符串中的一個參數輸出了,我們來解析一下這個字符串:
a:3:{i:0;s:4:%22java%22;i:1;s:1:%22C%22;i:2;s:4:%22Perl%22;}
url解碼得到:
a:3:{i:0;s:4:"java";i:1;s:1:"C";i:2;s:4:"Perl";}
按照"T-L-V"的格式來解析,即手動反序列化
a
T(類型):表示參數的類型是一個數組
3
L(長度):表示這個數組的大小是3,即數組中有三個參數
{i:0;s:4:"java";i:1;s:1:"C";i:2;s:4:"Perl";}
V(參數值):表示這個數組的3個值
以上是最大的"T-L-V"結構,接下來分析數組內部的參數,參數列表中的參數是以;
來分割的
三個參數:i:0;s:4:"java"
;i:1;s:1:"C"
;i:2;s:4:"Perl"
i
數組的索引:0,1,2
s
T(類型):該數組元素類型爲字符串
4
、1
、4
L(長度):指字符串的長度,三個字符串元素的長度分別是4
、1
、4
java
、C
、Perl
V(值):數組中三個值分別爲java
、C
、Perl
綜上所述:這個數組就是ayyay[3]={'java','C','Perl'}
可以在代碼中輸出驗證一下:
再回到題目中,可以看到頁面將這個數組的第一個元素輸出了出來,也就是說,在這裏我們可以控制反序列化的字符串,即我們可以自己構造序列化字符串,然後交給服務器去執行反序列化操作,從而達到我們需要的效果。
接下來審計代碼,可以看到,代碼中存在一個DeleteFile類,其中有一個公有變量cache_file,還有一個析構函數,這個函數在對象銷燬的時候會自動被調用執行,從而自動執行這個函數中的語句,即刪除一個在臨時目錄下的一個文件
我們看看這個臨時目錄/btslab/tmp/
下有什麼
存在兩個文件,所以接下來我們構造一個序列化字符串來讓服務器執行反序列化操作去刪除其中一個文件,比如test1.txt
payload:http://127.0.0.1/btslab/vulnerability/injection/obj.php?array=O:10:"DeleteFile":1:{s:10:"cache_file";s:9:"test1.txt";}
注入成功,文件test1.txt
被刪除
0x02 挑戰2
array參數的值爲a:3:{i:0;s:8:%22Assembly%22;i:1;s:1:%22C%22;i:2;s:4:%22Perl%22;}
url解碼得到:a:3:{i:0;s:8:"Assembly";i:1;s:1:"C";i:2;s:4:"Perl";}
審計源碼,可以看到有一個RunCode
類,其中有一個公有參數code
,還有一個魔幻函數__wakeup()
,在這個函數中會把變量code
傳入eval()
函數的參數去執行
所以,接下來我們就可以構造一個序列化字符串,給code
賦值,讓eval
去解析執行
payload:http://127.0.0.1/btslab/vulnerability/injection/obj1.php?array=O:7:"RunCode":1:{s:4:"code";s:10:"phpinfo();";}
,從下圖可以看到,代碼被成功解析執行