當前位置:
首頁 > 新聞 > 在HTTP協議層面繞過WAF

在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 原創獎勵計劃,未經許可禁止轉載。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 FreeBuf 的精彩文章:

Windows Sandbox:輕量級桌面環境專為安全運行應用程序而設計
終端安全 2018年IoT那些事兒

TAG:FreeBuf |