三句題外話,第一句是終于放假了,在考試周活了下來,最后一周面臨3門考試,我仍然做了2道比較基礎(chǔ)的題目,現(xiàn)在重做一下順便寫wp,不敢說是熱愛,勉強(qiáng)說是興趣,矢志web。第二句是感謝通信原理老師給了我過,對(duì)于從沒接觸過通信的我來說,上課完全聽不懂,最后靠黨性,衷心感謝老師。第三句,寒假還是要學(xué)點(diǎn)習(xí)的(坐等真香),尤其是追求自己的喜歡的。
進(jìn)入正題,打開即是源碼,
將參數(shù)f改成phpinfo即可調(diào)用phpinfo()函數(shù),看到幾個(gè)比較敏感的點(diǎn),
我想到了幾個(gè)問題:
1.源碼里,沒有session_start(),phpinfo()里,session.auto_start也是off的,這樣的話,在session這個(gè)問題上,每個(gè)頁面頂多只能讀取本身頁面的$_SESSION數(shù)組。所以對(duì)于本題來講應(yīng)該只需要對(duì)這個(gè)頁面做文章,不用想別的頁面了。我們要搞清楚PHP中session機(jī)制的工作流程,同時(shí)我們也要明白這個(gè)題目里根本沒有讀取session文件,這個(gè)題只是把$_SESSION數(shù)組進(jìn)行了serialize(),這種地方不要因?yàn)榭吹絧hp處理器而犯迷糊。
2.雖然使用的是php處理器,但按上面所講顯然不存在解析器差異帶來的對(duì)象注入問題;
3.過濾函數(shù)filter()是對(duì)serialize($_SESSION)進(jìn)行過濾,濾掉一些關(guān)鍵字
4.正常傳img參數(shù)進(jìn)去會(huì)被sha1加密,我認(rèn)為這里應(yīng)該不存在有一個(gè)字符串,它sha1加密后的結(jié)果能與dog_flag.php這種名字碰撞,故我們應(yīng)該用別的方法控制$_SESSION中的參數(shù);
5.引用一位大佬的一句話:任何具有一定結(jié)構(gòu)的數(shù)據(jù),只要經(jīng)過了某些處理而把自身結(jié)構(gòu)改變,則可能會(huì)產(chǎn)生漏洞。
本來挺好的序列化的字符串,按某種去掉了一些關(guān)鍵字,本身就不對(duì),本身就涉及到可能破壞原有結(jié)構(gòu)而無法正常反序列化的問題。這里是利用反序列化長度逃逸控制了img參數(shù)。之前有一道題目是關(guān)鍵字替換導(dǎo)致字符串長度變長,把后面的原有參數(shù)擠出去了,本題是關(guān)鍵字被置空導(dǎo)致長度變短,后面的值的單引號(hào)閉合了前面的值的單引號(hào),導(dǎo)致一些內(nèi)容逃逸。
因?yàn)槲覀兡芸刂频氖?_SESSION的參數(shù),payload只能以字符串形式傳進(jìn)去,然后想辦法將它前面的控制符? s:xx: 閉合到一個(gè)字符串中取,這樣就能將后面的payload作為獨(dú)立的一個(gè)鍵和值。
我們要注意一點(diǎn),如果 s:40:被閉合了,前面的s:5:"xxxxx";s:40:"只是一個(gè)鍵,而沒有值(先不考慮長度問題),會(huì)反序列化失敗,所以我們的payload的里應(yīng)額外包含一個(gè)鍵值對(duì),
";s:64: 這幾個(gè)控制字符長度為7,";s:7:"xxxxxxx"這幾個(gè)控制字符(和數(shù)據(jù))長度為13,為了將他們閉合進(jìn)前面的字符串,
由此以來的話,payload為
;s:14:"phpflagphpflag";s:7:"xxxxxxx";s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";}
傳入即可,
心得:接觸一個(gè)題時(shí)思路還是要發(fā)散的,通過題目去猜測出題人的引導(dǎo),去排除,再加上多多積累多多見識(shí)多多實(shí)踐,(不難的)題目一般都可以做。不得不說安洵杯的題確實(shí)比較友好,考點(diǎn)不難而且也比較直接,不拐彎抹角。