在HTTP協議層面繞過WAF
PS:本文僅作技術分析,禁止用於其它非法用途
首先,自我介紹一下。小白一名,2017年才接觸Web滲透測試,至於為啥,當然是自己的網站被攻破了……
進入正題,隨著安全意思增強,各企業對自己的網站也更加註重安全性。但很多web應用因為老舊,或貪圖方便想以最小代價保證應用安全,就只僅僅給伺服器安裝waf。所以滲透測試過程中經常遇到惹人煩的web應用防火牆,只有突破這第一道防禦,接下來的滲透才能順利進行。本次從協議層面繞過waf實驗用sql注入演示,但不限於實際應用時測試sql注入(命令執行,代碼執行,文件上傳等測試都通用)。
聲明:這次實驗的思路方法並非自己想出來的,是聽了某大牛的公開課總結學習而來。
原理
給伺服器發送payload數據包,使得waf無法識別出payload,當apache,tomcat等web容器能正常解析其內容。如圖一所示
圖一
實驗環境
本機win10+xampp+某狗web應用防火牆最新版。為方便演示,存在sql注入的腳本中使用$_REQUEST["id"]來接收get,或者post提交的數據。waf配置為攔截url和post的and or 注入,如圖二所示。
圖二
發送get請求或利用hackbar插件發送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. 複製圖五中的數據包黏貼到
id=1 and 1=1
後面如圖六所示。
圖六
4. 接著修改第一個數據包的數據部分,即將
id=1+and+1%3D1
修改為正常內容id=1,再將數據包的Content-Length的值設置為修改後的【id=1】的字元長度即4,最後將Connection欄位值設為keep-alive。提交後如圖七所示,會返回兩個響應包,分別對應兩個請求。
圖七
注意:
從結果看,第一個正常數據包返回了正確內容,第二個包含有效載荷的數據包被某狗waf攔截,說明兩數據包都能到達伺服器,在面對其他waf時有可能可以繞過。無論如何這仍是一種可學習了解的繞過方法,且可以和接下來的方法進行組合使用繞過。二.利用分塊編碼傳輸繞過[該方法可繞某狗]
原理:
在頭部加入 Transfer-Encoding: chunked 之後,就代表這個報文採用了分塊編碼。
這時,post請求報文中的數據部分需要改為用一系列分塊來傳輸。每個分塊包含十六進位的長度值和數據,長度值獨佔一行,長度不包括它結尾的,也不包括分塊數據結尾的,且最後需要用0獨佔一行表示結束。1. 開啟上個實驗中已關閉的content-length自動更新。給post請求包加入
Transfer-Encoding: chunked後,將數據部分
id=1 and 1=1進行分塊編碼(注意長度值必須為十六進位數),每一塊里長度值獨佔一行,數據佔一行如圖八所示。圖八
2.將上面圖八數據包的
id=1 and 1=1
改為
id=1 and 1=2
即將圖八中所標的第4塊的1改為2。如圖九所示沒有返回數據,payload生效。
圖九
注意:分塊編碼傳輸需要將關鍵字and,or,select ,union等關鍵字拆開編碼,不然仍然會被waf攔截。編碼過程中長度需包括空格的長度。最後用0表示編碼結束,並在0後空兩行表示數據包結束,不然點擊提交按鈕後會看到一直處於waiting狀態。
三.利用協議未覆蓋進行繞過[同樣會被某狗攔截]
原理:
HTTP頭
里的Content-Type一般有application/x-www-form-urlencoded,multipart/form-data,text/plain三種,其中multipart/form-data表示數據被編碼為一條消息,頁上的每個控制項對應消息中的一個部分。所以,當waf沒有規則匹配該協議傳輸的數據時可被繞過。
1.將頭部Content-Type改為multipart/form-data; boundary=69 然後設置分割符內的Content-Disposition的name為要傳參數的名稱。數據部分則放在分割結束符上一行。
圖十
由於是正常數據提交,所以從圖十可知數據是能被apache容器正確解析的,嘗試1 and 1=1也會被某狗waf攔截,但如果其他waf沒有規則攔截這種方式提交的數據包,那麼同樣能繞過。
2.一般繞waf往往需要多種方式結合使用,如圖十的示例中,只需將數據部分1 and 1=1用一個小數點"."當作連接符即1.and 1=1就可以起到繞過作用。當然,這只是用小數點當連接符所起的作用而已。如圖十一所示。
圖十一
四.分塊編碼+協議未覆蓋組合繞過
1.在協議未覆蓋的數據包中加入
Transfer-Encoding: chunked ,然後將數據部分全部進行分塊編碼,如圖十二所示(數據部分為1 and 1=1)。
圖十二
注意:
第2塊,第3塊,第7塊,和第8塊。第2塊
中需要滿足長度值
空行
Content-Disposition: name="id"
空行
這種形式,且長度值要將兩個空行的長度計算在內(空行長度為2)。
第3塊
,即數據開始部分需滿足長度值
空行
數據
形式,且需將空行計算在內。
第7塊
即分割邊界結束部分,需滿足長度值
空行
分割結束符
空行
形式,且計算空行長度在內。
第8塊
需滿足
0
空行
空行
形式。如果不同時滿足這四塊的形式要求,payload將不會生效。
結語:
以上是在http協議層面繞過waf,因為比較通用,所以理論上可以用於平時滲透時的方方面面,如命令執行,代碼注入,sql注入等測試。雖然本文中只有分塊編碼真正做到了繞過某狗,但其他兩種方法在其他waf繞過中可能仍然可用,而且可與其他繞過方法結合使用,甚至像四中一樣相互組合使用。
*本文作者:bypassword,本文屬 FreeBuf 原創獎勵計劃,未經許可禁止轉載。
※Windows Sandbox:輕量級桌面環境專為安全運行應用程序而設計
※終端安全 2018年IoT那些事兒
TAG:FreeBuf |