fbpx

Citrix ADC HTTP請求 Smuggling 詳解

專案背景

專案中遇到罕見的故障現象,客戶生產環境中的Citrix ADC,系統版本為升級到12.1.60.16後,部分HTTP協定的VS會出現業務訪問失敗的情況。

 經過排查

1、Citrix ADC的配置未發生改變,配置是基本的HTTP業務,並無其他高級功能;
2、Citrix ADC收到伺服器http request後主動發起reset給用戶端和伺服器;
3、HTTP業務中部分業務正常,部分受影響。

1.1     問題定位
初步定位,Citrix ADC在12.1的60版本後,啟用了更加嚴格的RFC7230策略。在RFC7230中規定

Content-Length和Transfer-Encoding不能同時出現!!

但是在12.1.57.18以前的版本中,允許上述這兩個欄位同時出現。這兩個欄位的同時出現,牽扯到一個技術名詞“HTTP Request Smuggling”。

1.2     如何解決該問題
* 建議使用者調整應用程式,使得Content-Length和Transfer-Encoding不會同時出現。
*通過Citrix ADC來解決,經測試方法有下列幾個可行:
– VS的協議類型由HTTP修改為TCP(如果使用了Content Switch則該方法不可用)
– 將Citrix ADC到後端伺服器Rewrite HTTP request version修改為HTTP/1.0(某些場景可能不適用)
– 版本降至12.1的57版本(建議方法)

1.3     如何判斷是否命中該故障
驗證是否命中本文中描述的雷區,通過以下幾方面來參考

2.  原理部分講解
2.1     [RFC7230](#_RFC7230)(點擊跳轉連結)
GITHUB中RFC7230對“Transfer-Encoding”和“Content-Length”的定義中有一句是發送者不得\在任何包含Transfer-Encoding頭欄位的消息中發送Content-Length頭欄位”。
2.2     [Content-Length](#_Content-Length)(點擊跳轉連結)
HTTP頭部Content-Length用於描述HTTP消息實體長度和傳輸長度,流覽器對比Content-Length和HTTP請求或者回應body長度判斷一次完整的HTTP傳輸過程。當請求某一個url時,伺服器已經知道了資源的大小,就會使用Content-Length來告訴流覽器,你請求url的body大小是多少,比如說body是1024B,流覽器傳輸1024B之後,本次任務就結束。通常伺服器已經資源的大小,一般是一些圖片,或者是靜態的腳本等。所以header中如果存在Content-Length,實體長度和傳輸長度不相等(比如說設置了Transfer-Encoding),那麼則不能設置Content-Length。如果設置了Transfer-Encoding,那麼Content-Length將被忽視”,可以理解為Transfer-Encoding的priority高於Content-Length(該說法在本文中的第四章節“Rewrite http request version”被證實)。

發表迴響

Powered by WordPress.com.

Up ↑

%d 位部落客按了讚: