變量覆蓋漏洞----parse_str()函數

Parse_str()函數引發的變量覆蓋漏洞php

parse_str() 函數用於把查詢字符串解析到變量中,若是沒有array 參數,則由該函數設置的變量將覆蓋已存在的同名變量。 極度不建議 在沒有 array參數的狀況下使用此函數,而且在 PHP 7.2 中將廢棄不設置參數的行爲。此函數沒有返回值

1、分析題目源碼:html

變量覆蓋漏洞----parse_str()函數

一、 error_reporting()函數規定不一樣級別錯誤,這裏爲關閉錯誤報告ide

二、 show_source()函數,別名highlight_file()高亮顯示文件。函數

三、 empty()函數薑茶一個變量是否爲空,因此動咱們發送請求的時候必定帶有id參數測試

四、 include(‘flag.php’)調用flag.php文件,應該就是存放flag的文件加密

五、 @parse_str($id)把查詢字符串解析到變量中,沒有使用array選項,如有同名變量,將原來的覆蓋。這裏明顯將原來的$a的值給覆蓋掉。3d

六、 $a[0] != 'QNKCDZO' && md5($a[0]) == md5('QNKCDZO')判斷$a[0]的值不是QNKCDZO而且$a[0]的MD5值要和QNKCDZO的MD5值相同。咱們知道很難找出這樣的字符串。code

2、構造咱們的payloadhtm

總體源碼已經分析過了,如今惟一要作的就是須要找出字符串不一樣,但MD5值相同的值。這很難找出。這個時候能夠利用php處理MD5哈希字符串的缺陷進行處理。blog

缺陷的原理:利用php弱語言特性。「10」==「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開頭的字符串)
3、測試結果。

將payload用get方法傳輸:

變量覆蓋漏洞----parse_str()函數

獲得flag哈。

相關文章
相關標籤/搜索