最近也是在一直看過waf相關的資料,本次主要是想寫寫HTTP協議層面過WAF的一些技巧,來與大家一同探討
原理
給服務器發送payload數據包,使得waf無法識別出payload,當apache,tomcat等web容器能正常解析其內容。如圖所示
實驗環境
本機win10+phpstudy2018+某狗web應用防火牆最新版
本次演示的站點是我自己用php寫的一個post型sql注入類型的站
安全狗需要做一下配置
勾選檢測POST,就可檢測post類型的注入
發現發送post請求的payload被攔截
一、利用pipline繞過[該方法經測試會被某狗攔截]
原理
http協議是由tcp協議封裝而來,當瀏覽器發起一個http請求時,瀏覽器先和服務器建立起連接tcp連接,然后發送http數據包(即我們用burpsuite截獲的數據),其中包含了一個Connection字段,一般值為close,apache等容器根據這個字段決定是保持該tcp連接或是斷開。當發送的內容太大,超過一個http包容量,需要分多次發送時,值會變成keep-alive,即本次發起的http請求所建立的tcp連接不斷開,直到所發送內容結束Connection為close為止。
1. 關閉burp的Repeater的Content-Length自動更新,如圖四所示,點擊紅圈的Repeater在下拉選項中取消update Content-Length選中。這一步至關重要!!!
2. burp截獲post提交
id=1 and 1=1
被WAF攔截
3.重新構造數據包
將數據包的Content-Length的值設置為id=2+and+1%3D2的長度即為12,最后將Connection字段值設為keep-alive。提交后如圖所示,會返回兩個響應包,分別對應兩個請求。
注意:從結果看,第一個正常數據包返回了正確內容,第二個包含有效載荷的數據包被某狗waf攔截,說明兩數據包都能到達服務器,在面對其他waf時有可能可以繞過。無論如何這仍是一種可學習了解的繞過方法,且可以和接下來的方法進行組合使用繞過。
二、利用分塊編碼傳輸繞過[該方法可繞某狗]
原理
在頭部加入 Transfer-Encoding: chunked 之后,就代表這個報文采用了分塊編碼。這時,post請求報文中的數據部分需要改為用一系列分塊來傳輸。每個分塊包含十六進制的長度值和數據,長度值獨占一行,長度不包括它結尾的,也不包括分塊數據結尾的,且最后需要用0獨占一行表示結束。
1. 開啟上個實驗中已關閉的content-length自動更新。給post請求包加入Transfer-Encoding: chunked后,將數據部分id=1 and 1=1進行分塊編碼(注意長度值必須為十六進制數),每一塊里長度值獨占一行,數據占一行如圖所示。
將上面的數據包 id=1 and 1=1 改為 id=1 and 1=2
沒有回顯,說明payload生效
注意:分塊編碼傳輸需要將關鍵字and,or,select ,union等關鍵字拆開編碼,不然仍然會被waf攔截。編碼過程中長度需包括空格的長度。最后用0表示編碼結束,並在0后空兩行表示數據包結束,不然點擊提交按鈕后會看到一直處於waiting狀態。
三、協議覆蓋WAF繞過
首先將數據包轉換為文件上傳包格式,使用bp工具change body encoding
繞過
1.添加參數filename,filename =1.jpg,等於號前需要加個空格
2.加雙引號繞過
3.邊界混淆繞過
這是原始的邊界
進行混淆后
或者有
四、分塊編碼+協議未覆蓋組合繞過
在協議未覆蓋的數據包中加入Transfer-Encoding: chunked ,然后將數據部分全部進行分塊編碼
附上我的payload吧
3 --8 22 Content-Disposition: name="id" 5 -1 1 u 6 nion s 6 elect 8 1,2,data 6 base() 9 --8-- 0
最后用0表示編碼結束,並在0后空兩行表示數據包結束,不然點擊提交按鈕后會看到一直處於waiting狀態。
五、Content-type編碼繞過
利用特殊編碼對payload進行轉義,從而繞過WAF對特殊關鍵詞的過濾
六、http頭格式的繞過
http頭部的問題導致各種奇怪的格式繞過
如:
Host字段回車加TAB
混亂特殊字符繞過
注意:只能位於chunked字符之前加入字符
加入雙::號