標題:Burpsuit分塊傳輸插件繞WAF原理和技巧(轉)

taibeihacker

Moderator

0x00 原理​

給服務器發送payload數據包,使得waf無法識別出payload,當apache,tomcat等web容器能正常解析其內容。如圖一所示
在HTTP协议层面绕过WAF

0x02 实验环境

本機win10+xampp+某狗web應用防火牆最新版。為方便演示,存在sql注入的腳本中使用$_REQUEST['id']來接收get,或者post提交的數據。 waf配置為攔截url和post的and or 注入,如圖所示:
在HTTP协议层面绕过WAF

發送get請求或利用hackbar插件發送post請求payload均被攔截,如圖所示:
在HTTP协议层面绕过WAF

0x03 绕过WAF方法​

一马云惹不起马云 利用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選中。这一步至关重要!!!
在HTTP协议层面绕过WAF

2. burp截獲post提交
id=1 and 1=1
,顯示被waf攔截如圖五所示。
在HTTP协议层面绕过WAF

3. 複製圖五中的數據包黏貼到
id=1 and 1=1
後面如圖六所示。
在HTTP协议层面绕过WAF

4. 接著修改第一個數據包的數據部分,即將
id=1+and+1%3D1
修改為正常內容id=1,再將數據包的Content-Length的值設置為修改後的【id=1】的字符長度即4,最後將Connection字段值設為keep-alive。提交後如圖七所示,會返回兩個響應包,分別對應兩個請求。
在HTTP协议层面绕过WAF

注意:從結果看,第一個正常數據包返回了正確內容,第二個包含有效載荷的數據包被某狗waf攔截,說明兩數據包都能到達服務器,在面對其他waf時有可能可以繞過。無論如何這仍是一種可學習了解的繞過方法,且可以和接下來的方法進行組合使用繞過。

二.利用分块编码传输绕过[该方法可绕某狗]​

原理:在頭部加入Transfer-Encoding: chunked 之後,就代表這個報文采用了分塊編碼。這時,post請求報文中的數據部分需要改為用一系列分塊來傳輸。每個分塊包含十六進制的長度值和數據,長度值獨占一行,長度不包括它結尾的,也不包括分塊數據結尾的,且最後需要用0獨占一行表示結束。
1. 開啟上個實驗中已關閉的content-length自動更新。給post請求包加入Transfer-Encoding: chunked後,將數據部分id=1 and 1=1進行分塊編碼(注意長度值必須為十六進制數),每一塊里長度值獨占一行,數據佔一行如圖八所示。
在HTTP协议层面绕过WAF
2.將上面圖八數據包的
id=1 and 1=1
改為
id=1 and 1=2
即將圖八中所標的第4塊的1改為2。如圖九所示沒有返回數據,payload生效。
在HTTP协议层面绕过WAF

注意:分塊編碼傳輸需要將關鍵字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為要傳參數的名稱。數據部分則放在分割結束符上一行。
在HTTP协议层面绕过WAF

由於是正常數據提交,所以從圖十可知數據是能被apache容器正確解析的,嘗試1 and 1=1也會被某狗waf攔截,但如果其他waf沒有規則攔截這種方式提交的數據包,那麼同樣能繞過。
2.一般繞waf往往需要多種方式結合使用,如圖十的示例中,只需將數據部分1 and 1=1用一個小數點”.”當作連接符即1.and 1=1就可以起到繞過作用。當然,這只是用小數點當連接符所起的作用而已。如圖十一所示。
在HTTP协议层面绕过WAF

四.分块编码+协议未覆盖组合绕过​

1.在協議未覆蓋的數據包中加入Transfer-Encoding: chunked ,然後將數據部分全部進行分塊編碼,如圖十二所示(數據部分為1 and 1=1)。
在HTTP协议层面绕过WAF
注意:第2塊,第3塊,第7塊,和第8塊。
第2块中需要滿足
長度值空行Content-Disposition: name='id' 空行
這種形式,且長度值要將兩個空行的長度計算在內(空行長度為2)。
第3块,即數據開始部分需滿足
長度值空行數據
形式,且需將空行計算在內。
第7块即分割邊界結束部分,需滿足
長度值空行分割結束符空行
形式,且計算空行長度在內。
第8块需滿足
0 空行空行
形式。如果不同時滿足這四塊的形式要求,payload將不會生效。

0x04 绕过WAF技巧​

一、技巧1:使用注释扰乱分块数据包​

一些如Imperva,360等比較好的WAF已經對傳輸編碼的分塊傳輸做了處理,可以把分塊組合成完整的HTTP數據包,這時直接使用常規的分塊傳輸方法嘗試繞過的話,會被WAF直接識別並阻斷。
我們可以在[RFC7230]中查看到有關分塊傳輸的定義規範。
Chunked Transfer Coding: The chunked transfer coding wraps the payload body
in order to
transfer it as a series of chunks, each with its own size indicator,
followed by an OPTIONAL trailer containing header fields. Chunked
enables content streams of unknown size to be transferred as a
sequence of length-delimited buffers, which enables the sender to
retain connection persistence and the recipient to know when it has
received the entire message.
chunked-body=*chunk
last-chunk
trailer-part
CRLF
chunk=chunk-size [ chunk-ext ] CRLF
chunk-data CRLF
chunk-size=1*HEXDIG
last-chunk=1*('0') [ chunk-ext ] CRLF
chunk-data=1*OCTET ; a sequence of chunk-size octets
The chunk-size field is a string of hex digits indicating the size of
the chunk-data in octets. The chunked transfer coding is complete
when a chunk with a chunk-size of zero is received, possibly followed
by a trailer, andfinally terminated by an empty line.
A recipient MUST be able to parse and decode the chunked transfer
coding.
Chunk Extensions:
The chunked encoding allows each chunk to include zero or more chunk
extensions, immediately following the chunk-size, for the sake of
supplying per-chunk metadata (such as a signature or hash),
mid-message control information, or randomization of message body
size.
chunk-ext=*( ';' chunk-ext-name [ '=' chunk-ext-val ] )
chunk-ext-name=token
chunk-ext-val=token/quoted-string
The chunked encoding is specific to each connection andis likely to
be removed or recoded by each recipient (including intermediaries)
before any higher-level application would have a chance to inspect
the extensions. Hence, use of chunk extensions is generally limited
通過閱讀規範發現分塊傳輸可以在長度標識處加上分號“;”作為註釋,如:
9;kkkkk 1234567=1 4;ooo=222 2345 0 (兩個換行)
幾乎所有可以識別傳輸編碼數據包的WAF,都沒有處理分塊數據包中長度標識處的註釋,導致在分塊數據包中加入註釋的話,WAF就識別不出這個數據包了。
現在我們在使用了Imperva的應用防火牆的網站測試常規的分塊傳輸數據包:
POST /
 
返回
上方