昨晚,一個名為 httpoxy 的漏洞在安全圈内廣泛傳播。雲盾攻防對抗團隊第一時間對此漏洞進行了深入分析,發現其本質是一個 cgi 環境變量劫持漏洞,對 cgi 的環境變量 http_proxy 變量進行劫持。如果 cgi 在運作過程中依賴 http_proxy,那麼攻擊者将能夠擷取到程式敏感資料,甚至僞造傳回包對 cgi 程式實作欺騙。
這個漏洞實際上 cgi 程式對變量命名不規範導緻的。cgi 程式在接收到 http header 後,會把部分 header 的資訊存入以 http_ 開頭的變量中。header 中要是出現了 proxy 頭,那麼 proxy 頭中的資訊會存放在 http_proxy 的變量中。巧合的是,cgi 程式環境變量中本身就定義了一個 http_proxy 變量,作用是為 cgi 程式設定代理。是以,如果我們在請求中帶上了 proxy 頭,那麼 http_proxy 變量将會被我們發送的内容覆寫,實作 http_proxy 變量劫持。需要注意的是,覆寫的變量隻對當次請求有效,不會對全局的 http_proxy 變量造成影響。
我們在 x.x.27.216 上用 nc 監聽 23333 端口,然後向受害網站 x.x.25.84 發送的請求中加入 proxy 頭 "x.x.27.216:23333"。如下圖所示,受害網站在向 restapi.amap.com 請求資料,而這個請求被我們的機器截獲到了,漏洞利用成功。同時,這個請求将網站在 restapi.amap.com 使用的 key 暴露出來了,造成敏感資訊洩漏。

這裡分享一下我們想到的兩個利用場景:
1、cgi 程式與其它網站通信時,需要 cgi 程式帶上某些身份資訊的,如 accesstoken、gsid、key 等,那麼這些敏感資訊将會被非法的代理伺服器接收到,造成敏感資訊洩漏。
2、對于電商類網站,若通過設定 proxy 頭能截獲到它向支付網關發送的請求,那麼就可以篡改這個請求的傳回包,如“将支付失敗改為支付成功”,對原網站進行欺騙。
理論上這個漏洞影響所有以 cgi 方式運作的程式。但漏洞利用受到以下限制:
1、cgi 程式不會對外發送請求;
2、cgi 程式不依賴 http_proxy 變量;
3、cgi 程式與外部使用非 http 協定(如 https)進行通信。
如果符合上述其中一種情況,漏洞将無法利用。<b>我們認為,此漏洞的危害程度沒有外界宣傳的那麼高。</b>
proxy 并非一個規範的 http header,是以我們沒必要去處理 http 請求中 proxy 頭的内容。 由于每個應用的修複方案不一樣,下面以 nginx 和 apache 進行舉例:
nginx:在調用 fastcgi 的地方将 http_proxy 置為空。
apache:借助 mod_headers 子產品将 proxy 頭置為失效。
其它應用的修複方案請參考應用官方公告或 0x04 中的參考資料。