HTTP request smuggling 學習筆記
阿新 • • 發佈:2020-10-13
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
參考: