三句題外話伞梯,第一句是終于放假了玫氢,在考試周活了下來,最后一周面臨3門考試谜诫,我仍然做了2道比較基礎(chǔ)的題目漾峡,現(xiàn)在重做一下順便寫wp,不敢說是熱愛喻旷,勉強(qiáng)說是興趣生逸,矢志web。第二句是感謝通信原理老師給了我過且预,對于從沒接觸過通信的我來說槽袄,上課完全聽不懂,最后靠黨性锋谐,衷心感謝老師遍尺。第三句,寒假還是要學(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ù)組夷野。所以對于本題來講應(yīng)該只需要對這個(gè)頁面做文章,不用想別的頁面了荣倾。我們要搞清楚PHP中session機(jī)制的工作流程悯搔,同時(shí)我們也要明白這個(gè)題目里根本沒有讀取session文件,這個(gè)題只是把$_SESSION數(shù)組進(jìn)行了serialize()舌仍,這種地方不要因?yàn)榭吹絧hp處理器而犯迷糊妒貌。
2.雖然使用的是php處理器,但按上面所講顯然不存在解析器差異帶來的對象注入問題铸豁;
3.過濾函數(shù)filter()是對serialize($_SESSION)進(jìn)行過濾灌曙,濾掉一些關(guān)鍵字
4.正常傳img參數(shù)進(jìn)去會被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)改變蚣驼,則可能會產(chǎn)生漏洞魄幕。
本來挺好的序列化的字符串,按某種去掉了一些關(guān)鍵字隙姿,本身就不對梅垄,本身就涉及到可能破壞原有結(jié)構(gòu)而無法正常反序列化的問題。這里是利用反序列化長度逃逸控制了img參數(shù)输玷。之前有一道題目是關(guān)鍵字替換導(dǎo)致字符串長度變長队丝,把后面的原有參數(shù)擠出去了,本題是關(guān)鍵字被置空導(dǎ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è)鍵损晤,而沒有值(先不考慮長度問題)软棺,會反序列化失敗,所以我們的payload的里應(yīng)額外包含一個(gè)鍵值對尤勋,
";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í)比較友好,考點(diǎn)不難而且也比較直接茴恰,不拐彎抹角颠焦。