看一下頁面源碼,發現了提示:
calc.php?num=encodeURIComponent($("#content").val())
$("#content").val() 是什么意思:
獲取id為content的HTML標簽元素的值,是JQuery, $("#content")相當於document.getElementById("content"); $("#content").val()相當於 document.getElementById("content").value;
但是無論怎么注入都是400,403和500,這里用的是一個新的點:PHP的字符串解析特性
步驟:
1.掃一下根目錄,發現flagg文件:
? num=1;var_dump(scandir(chr(47)))
2.列出flagg:
?%20num=1;var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))
解析:
為什么要在num前加一個空格?
答:假如waf不允許num變量傳遞字母,可以在num前加個空格,這樣waf就找不到num這個變量了,因為現在的變量叫“ num”,而不是“num”。但php在解析的時候,會先把空格給去掉,這樣我們的代碼還能正常運行,還上傳了非法字符。
發現過濾怎么辦?
答:用char()轉ascii再進行拼接
PHP的字符串解析特性是什么?
答: PHP需要將所有參數轉換為有效的變量名,因此在解析查詢字符串時,它會做兩件事:1.刪除空白符 2.將某些字符轉換為下划線(包括空格)【當waf不讓你過的時候,php卻可以讓你過】
這題還可以用:http走私
用post模式發一個請求,出現源碼
然鵝我這里復現失敗了Orz,這里貼一份師傅的
方法二
當我們向代理服務器發送一個比較模糊的HTTP請求時,由於兩者服務器的實現方式不同,可能代理服務器認為這是一個HTTP請求,然后將其轉發給了后端的源站服務器,但源站服務器經過解析處理后,只認為其中的一部分為正常請求,剩下的那一部分,就算是走私的請求,當該部分對正常用戶的請求造成了影響之后,就實現了HTTP走私攻擊。添加
Transfer-Encoding: chunked
,在消息體加幾個回車分塊傳輸編碼(Chunked transfer encoding)是超文本傳輸協議(HTTP)中的一種數據傳輸機制,允許HTTP由網頁服務器發送給客戶端的數據可以分成多個部分。分塊傳輸編碼只在HTTP協議1.1版本(HTTP/1.1)中提供
作者:gtfly
師傅用的應該是CL-TE:
所謂
CL-TE
,就是當收到存在兩個請求頭的請求包時,前端代理服務器只處理Content-Length
這一請求頭。后端服務器會遵守RFC2616
的規定,忽略掉Content-Length
,處理Transfer-Encoding
這一請求頭。
參考:
https://blog.csdn.net/weixin_44077544/article/details/102630714
https://www.freebuf.com/articles/web/213359.html