BTS測試實驗室 --- 注入關 --- PHP物件注入
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();";}
,從下圖可以看到,程式碼被成功解析執行