您好,登錄后才能下訂單哦!
Parse_str()函數引起的變量覆蓋漏洞
parse_str() 函數用于把查詢字符串解析到變量中,如果沒有array 參數,則由該函數設置的變量將覆蓋已存在的同名變量。 極度不建議 在沒有 array參數的情況下使用此函數,并且在 PHP 7.2 中將廢棄不設置參數的行為。此函數沒有返回值
一、分析題目源碼:
1、 error_reporting()函數規(guī)定不同級別錯誤,這里為關閉錯誤報告
2、 show_source()函數,別名highlight_file()高亮顯示文件。
3、 empty()函數姜茶一個變量是否為空,所以動我們發(fā)送請求的時候一定帶有id參數
4、 include(‘flag.php’)調用flag.php文件,應該就是存放flag的文件
5、 @parse_str($id)把查詢字符串解析到變量中,沒有使用array選項,若有同名變量,將原來的覆蓋。這里明顯將原來的$a的值給覆蓋掉。
6、 $a[0] != 'QNKCDZO' && md5($a[0]) == md5('QNKCDZO')判斷$a[0]的值不是QNKCDZO并且$a[0]的MD5值要和QNKCDZO的MD5值相同。我們知道很難找出這樣的字符串。
二、構造我們的payload
整體源碼已經分析過了,現在唯一要做的就是需要找出字符串不同,但MD5值相同的值。這很難找出。這個時候可以利用php處理MD5哈希字符串的缺陷進行處理。
缺陷的原理:利用php弱語言特性?!?0”==“1e1”嗎?這樣看是不等于的,但是到了php處理的時候,他會將1e1看做科學計數法來計算1e1=1*10^1=10,那這樣是不是就相等了。
題目這里給出的QNKCDZO的MD5值為:0e830400451993494058024219903391。經過php處理后會認為0*10^n。所以結果為零。
所以,我們可以找到字符串MD5加密后結果開頭為0e的即可。這里有篇文章記錄了很多這樣的字符串:http://www.cnblogs.com/Primzahl/p/6018158.html
所以我們的payload為
?id=a[]=s878926199a(s878926199a的MD5值為0e開頭的字符串)
三、測試結果。
將payload用get方法傳輸:
得到flag哈。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。