[WEB安全] HTTP 請求走私


0x01 簡介

HTTP請求走私這個漏洞在幾年前就已經被提出來了,但是人們幾乎很少去重視它,而現實中越來越多的人開始使用類似於CDN加速技術對網站性能進行優化,這個時候就出現了眾多的反向代理服務器真實網絡環境。

當我們向代理服務器發送一個比較模糊的HTTP請求時,由於兩者服務器的實現方式不同,可能代理服務器認為這是一個HTTP請求,然后將其轉發給了后端的源站服務器,但源站服務器經過解析處理后,只認為其中的一部分為正常請求,剩下的那一部分,就算是走私的請求,當該部分對正常用戶的請求造成了影響之后,就實現了HTTP走私攻擊。

0x02 詳解

HTTP規范提供了兩種不同方式來指定請求的結束位置,它們分別是 Content-Length 標頭和 Transfer-Encoding 標頭,Content-Length標頭簡單明了,它以字節為單位指定消息內容體的長度,Transfer-Encoding標頭用於指定消息體使用分塊編碼(ChunkedEncode)。

也就是說消息報文由一個或多個數據塊組成,每個數據塊大小以字節為單位衡量,后跟換行符,然后是塊內容,最重要的是:整個消息體以大小為0的塊結束,也就是說解析遇到0數據塊就結束,在這個過程中攻擊者就可以借助其中的邏輯間隙發起 HTTP 請求走私攻擊。

請求走私攻擊包括將內容長度頭和傳輸編碼報頭進入單個HTTP請求並對這些請求進行操作,以便前端服務器和后端服務器處理請求的方式不同。具體的方式取決於這兩個服務器的行為:

CL.TE:前端服務器使用Content-Length頭,后端服務器使用Transfer-Encoding頭
TE.CL:前端服務器使用Transfer-Encoding標頭,后端服務器使用Content-Length標頭。
TE.TE:前端和后端服務器都支持Transfer-Encoding標頭,但是可以通過以某種方式模糊標頭來誘導其中一個服務器不處理它。

CRLF:這是兩個ASCII字符,大小為一個字符,CR回車(ASCII 13, \r) LF換行(ASCII 10, \n),不會在屏幕有任何輸出,但在Windows中廣泛使用來標識一行的結束,而在Linux/UNIX系統中只有換行符。

0x03 服務器處理方式

3.1 CL.TE

CL.TE按着上面介紹到的前后端服務器的處理方式,第一次發包的時候,由於前段識別了Content-Length,就讀取了六個字節,分別是 CRLF 0 CRLF CRLF G CRLF 。然后后端通過識別Transfer Encoding,識別到了0 CRLF CRLF就結束了,從G后面的數據就沒有被閉合,但是響應的數據是正常的。

所以我們再發送一次,G就會拼接到POST,就造成了如下圖"Unrecognized method GPOST"的報錯信息:

3.2 TE.CL

同樣的道理,只不過這次的前端服務器識別到 Transfer-Encoding:chunked,然后傳輸一整個分塊截止到 0 CRLF CRLF,后端接收到之后只識別 Content-Length ,也就是 CRLF 5e CRLF ,所以在 5e之前的請求在第一次發包是可以正常相應的。

由於第一次提交的惡意請求,后面的GPOST沒有被處理,所以我們第二次發包即可直接識別第二個數據包的內容,也就是GPOST方法。最后響應的數據為:"Unrecognized method GPOST"

3.3 TE.TE

TE.TE 通過使用兩個 Transfer-encoding,前端識別到第一個正確的 Transfer-Encoding:chunked 然后就把截止到 0 CRLF CRLF 的第一個含有一個數據塊的請求傳給了后端,后端在處理的時候,識別到了 content-length 為 4 ,然后繼續看 TE ,看到第二個 TE 也就是 Transfer-encoding:cow 就無法識別了,所以后端就會只處理 Content-Length:4 。所以也就只處理到 CRLF 5 e CRLF ,也就是截止到 GPOST 之前的數據作為第一個數據包。再發一次包,即可再次識別到 GPOST 方法的數據包,得到"Unrecognized method GPOST" (注意0后面還有兩個CRLF)

0x04 攻擊案例

利用 CL.TE 繞過瀏覽器限制訪問,構造請求刪除目標用戶:首先通過 CL.TE 得到相應控制參數:

構造刪除請求參數:

走私過去的請求也必須是一個完整的請求,最后的兩個 \r\n 不能丟棄。

0x05 防御措施

HTTP請求走私原因主要來自,前置服務器與后置服務器復用同一個網絡連接,並且兩個服務器就請求數據包的邊界沒有達成一致。

  • 兩個服務器間禁止復用連接,使得每個請求單獨對應一個網絡連接
  • 使用數據包邊界定義清晰的HTTP/2
  • 前后端服務器使用相同的web服務器軟件,保證數據包邊界定義清晰

0x06 參考鏈接

淺談HTTP請求走私

記一次請求走私學習

協議層的攻擊——HTTP請求走私


免責聲明!

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



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