1. 程式人生 > 實用技巧 >HTTP request smuggling 學習筆記

HTTP request smuggling 學習筆記

HTTP request smuggling 原理

HTTP規範提供了兩種不同方式來指定請求的結束位置:Content-Length、Transfer-Encoding。Content-Length以位元組為單位指定訊息內容體的長度,Transfer-Encoding指定訊息體使用分塊編碼,報文由一個或多個數據塊組成,每個資料塊大小以位元組為單位,後跟換行符,然後是塊內容,整個訊息體以大小為0的塊結束。

由於HTTP規範提供了以上兩種不同方法來指定HTTP訊息體的長度,因此單個訊息可以同時使用這兩種方法,這種情況下,它們就會發生相互衝突。

漏洞型別

CL.TE:前端伺服器使用Content-Length頭,後端伺服器使用Transfer-Encoding頭;
TE.CL:前端伺服器使用Transfer-Encoding標頭,後端伺服器使用Content-Length標頭;
TE.TE:前端和後端伺服器都支援採用Transfer-Encoding標頭,但可以通過某種方式對標頭進行模糊構造,導致其中一臺伺服器對它實行處理。

CL.TE

POST / HTTP/1.1
Host: ac6e1f1b1ee1e1dc809704bd008f00c1.web-security-academy.net
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: close1
Transfer-Encoding: chunked
Content-Length: 6

0

G

前端伺服器按照Content-Length標頭處理並確定請求主體長度為6個位元組,直到G結束,並將此請求轉發到後端伺服器。但後端伺服器只支援Transfer-Encoding標頭,因此它會將訊息體視為分塊編碼,它按序處理資料塊,但第一個塊就為0資料塊,因此處理終止,後序訊息體G不會被執行處理,後端伺服器將這些位元組視為序列中下一個請求的開始。此時,如果前端伺服器繼續向後端伺服器轉發請求,那麼後端伺服器下一個接收到的請求就會是:G+POST=GPOST的請求方法,這樣,後端伺服器會返回響應:Unrecognized method GPOST

TE.CL

TE.TE

參考: