李文皓++李斌勇
【 摘 要 】 針對HTTP協(xié)議Host頭二義性的相關(guān)安全問題,深入分析了近期互聯(lián)網(wǎng)絡(luò)上與HTTP協(xié)議有關(guān)的已知與潛在漏洞。圍繞這些漏洞,分析并發(fā)現(xiàn)了其本質(zhì)是因RFC的制定與具體實施之間的差異所致。利用所造成上述差異的問題本質(zhì),在此基礎(chǔ)上創(chuàng)新性地提出了一種重新組合與利用的漏洞挖掘新思路。論文所提出的這種漏洞挖掘新思路,對網(wǎng)絡(luò)安全研究人員發(fā)現(xiàn)與挖掘新的安全漏洞,具有可行的參考意義。
【 關(guān)鍵詞 】 通信協(xié)議;二義性;網(wǎng)絡(luò)安全;漏洞挖掘
【 中圖分類號 】 TP393
【 文獻標識碼 】 A
A Novel Method of Vulnerability Detection Based on Multiple Host Ambiguities in HTTP
Li Wen-hao Li Bin-yong
(Chengdu University of Information Technology,College of Information Security Engineering SichuanChengdu 610225)
【 Abstract 】 Aiming at understanding the security issues related to multiple host ambiguities in HTTP, an in-depth analysis is carried out on the recent vulnerabilities caused by the flaws of HTTP protocol which are revealed and potentially exist on the Internet. According to the research, the differences between specifications and implementations of RFC essentially contribute to the problem. A novel method of vulnerability detection by reforming and exploiting the flaws is creatively put forward. The method mentioned in this paper carries some practical significance for security researchers to find the new potential vulnerabilities in cyberspace.
【 Keywords 】 communication protocol; ambiguity; network security;vulnerability detection
1 引言
HTTP(Hyper Text Transfer Protocol,超文本傳輸協(xié)議)位于應(yīng)用層,是用于WWW服務(wù)器傳輸?shù)接脩舯镜貫g覽器的無狀態(tài)傳送協(xié)議。服務(wù)器、瀏覽器以及相關(guān)Web應(yīng)用的通信無不依賴于HTTP協(xié)議[1]。RFC(Request For Comments)是一系列以編號排定的文件,基本的互聯(lián)網(wǎng)通信協(xié)議在RFC中均有詳細的說明描述。而在RFC2616中定義了目前Web世界中最廣泛使用的HTTP/1.1。
最近,清華大學(xué)、Berkeley大學(xué)以及華為安全人員研究發(fā)現(xiàn)[2]:在HTTP協(xié)議具體實施中,因沒有嚴格去遵循RFC中相關(guān)定義,HTTP協(xié)議中的Host頭具有二義性,從而造成了一系列安全問題。針對該問題,研究人員向相關(guān)網(wǎng)絡(luò)安全機構(gòu)報告了該問題。
本文旨在從Web安全人員的角度來分析上述文獻中所提到的問題以及其所帶來的一種新的漏洞挖掘思路。尤其是從網(wǎng)絡(luò)安全滲透測試的角度來分析該安全問題的具體威脅與利用場景,以便引起業(yè)界對該安全問題的關(guān)注。
2 Host頭的二義性
為了深入剖析Host頭,首先需要明確HTTP的報文結(jié)構(gòu)及其各結(jié)構(gòu)要素的意義。通常HTTP的報文都有一條來自客戶端的請求或者一條來自服務(wù)端的響應(yīng)。而這兩者分別由起始行、首部、主體三部分構(gòu)成。起始行的作用是對報文的一個描述,而首部則包含了一些屬性,主體則是包含著所要傳遞的數(shù)據(jù)信息。這里需要著重關(guān)注請求報文的首部,因Host頭就在請求首部中。就請求首部中的Host頭而言,其主要用于描述接收請求的服務(wù)器及其相應(yīng)端口(若無端口信息,對于HTTP URL來說便是80端口)。其實,根據(jù)RFC2616協(xié)議的“5.2”請求資源的識別[3],更準確的來說確定所請求的服務(wù)器以及相應(yīng)的端口不是由Host頭唯一確定,還需要決定于Request-URL。若Request-URL是絕對地址,那么即使Host存在值,也依然會被忽略掉。反之,若Request-URL是一個相對地址,且請求頭中包含有Host,那么請求的資源位置就會由Host來確定。
由此分析可見Host頭在請求中扮演著相當重要的角色。除此而外,Host頭也是很多安全檢測的關(guān)鍵切入點,接下來會詳細討論該問題。
在分析Host基礎(chǔ)上,還需了解Host的二義性。由語言學(xué)對于二義性的定義,可較為容易地理解二義性的概念。例如,一句話在同一情景下可能存在兩種(或以上)的含義,就稱這句話是具有二義性的,或者說這句話是存在歧義的。
本質(zhì)上而言,Host的二義性是因為HTTP協(xié)議在具體媒介中實施的時候并未完全遵循RFC標準,在兩個媒介處理同一個HTTP的請求時,對同一個Host頭存在不同的兩種分析處理或解釋行為,從而導(dǎo)致了Host頭可能存在二義性,利用這種差異的不同組合便為一些潛在安全漏洞利用提供了可乘之機。
如圖1所示為攻擊者利用Host頭二義性繞過CDN防護。攻擊者構(gòu)造了一個含有兩個Host頭,且第二個Host頭前存在一個空格的請求數(shù)據(jù)包。對于CDN來說接受了第一個Host,而服務(wù)器接收到了前面有空格的第二個Host頭,從而繞過了CDN。同樣的思路,CDN這里還可以是防火墻等。
來自清華大學(xué)、Berkeley大學(xué)以及華為安全研究人員在論文中給出了闡述:其通過實驗發(fā)現(xiàn)有33個流行應(yīng)用的HTTP實施對于Host頭的解釋有顯著不同的行為,從而導(dǎo)致了三種利用的方法:(1)多個Host頭的利用方法;(2)包含空格的Host頭利用方法;(3)含有絕對路徑請求的利用方法。
針對上述三種利用方法,給出具體闡述。
多個Host頭的利用方法:事實上在RFC2616和RFC7230[4]中都或間接或直接的說明了不允許有多個Host頭,而安全人員實驗發(fā)現(xiàn):測試的33個樣本中其中有25個都不遵循RFC的規(guī)定,沒有拒絕這種具有多個Host的請求。那么就可能存在這種情況:對于A,會接受第一個Host,對于B,會去接受第二個Host。因此,就可以利用這樣一些問題去繞過一些安全限制,就如在上文中所提到的一樣。
包含空格的Host頭利用方法:這種類型具體而言會有三種構(gòu)造的方式。盡管在RFC2616和RFC7230中也幾乎有相應(yīng)對策,但是測試人員發(fā)現(xiàn)具體的實施之中,33個樣本中只有5個遵循RFC2616,2個遵循RFC7230。
含有絕對路徑請求的利用方法:在前文介紹Host之時,可知根據(jù)RFC2616請求的資源位置,在Request-URL含有絕對路徑之時,Host頭將會被忽視。而在RFC7230中則更進一步說明了,即使Request-URL中存在絕對路徑,請求中仍然應(yīng)該具有明確的Host。這里研究者們又發(fā)現(xiàn)一些非常有趣的事情了:就是不論在RFC2616或是RFC7230中,都沒有明確的指出Request-URL中絕對路徑中允許存在的協(xié)議類型。發(fā)現(xiàn)在具體的實施中:有些是支持多種類型的協(xié)議,有些是僅僅支持HTTP或者HTTPS其中之一的。在所做的測試之中,同樣發(fā)現(xiàn)遵循RFCs協(xié)議的非常少。
3 基于HTTP協(xié)議Host頭二義性的漏洞挖掘新思路
在詳細闡述HTTP協(xié)議Host頭的二義性問題,以及舉例說明利用這種二義性可在某些特定環(huán)境下進行繞過CDN和防火墻等進行攻擊的基礎(chǔ)上,本文將論述該問題對于漏洞挖掘所提供的一種新的研究思路。
除了已經(jīng)提到的Host頭,事實上Cookie頭也會存在這樣的問題。若出現(xiàn)兩個同名的Cookie頭,那么不同Server語言在處理過程中將會出現(xiàn)差異。如圖2、圖3所示分別給出了PHP和Python對于兩個同名Cookie頭的滲透處理過程及結(jié)果。
顯然,可以注意到PHP解析后是接收第一個Cookie而Python接收了后者。其實,這與HTTP協(xié)議Host頭二義性的問題在本質(zhì)上是一致的。協(xié)議的說明指定與實際實施之間存在的差異,導(dǎo)致了上述測試差異的出現(xiàn)。
對于使用了Google Analytics的Python Django也存在CSRF繞過問題。首先,通過Google Analytics進行Cookie注入(由于Cookie中存在一個Path參數(shù),而該參數(shù)又直接來源于Referer中,未過濾)。由于Web Server以及瀏覽器對于Cookie的解析過程存在不符合RFC標準的問題,因而最終導(dǎo)致成功的注入。從而可以實現(xiàn)刪除已有Cookie或者覆蓋已存在的Cookie。由此不難發(fā)現(xiàn),很大程度上導(dǎo)致該問題也是因協(xié)議在具體指定和實施之間所存在的差異所致。
Internet Explorer/Edge存在的一個“結(jié)合 host 頭注入和 host的不嚴謹解析,提供惡意數(shù)據(jù)服務(wù)”[5]問題,并且利用這個問題可以成功在Github上面實施了OAuth token的竊取以及對Heroku和Fastly路由混淆[5][6]。
利用這種解析差異,我們甚至還能構(gòu)造出XSS漏洞等。由此可見,所探索上述問題無疑為漏洞研究提供了一條新的思路,并且說明了對于這類漏洞的研究在工業(yè)領(lǐng)域也具有實際運用意義。Browser在Web生態(tài)中扮演著重要的角色,且其與Web Server休戚相關(guān)。而有意思的是,在實際的實施、解析之中往往都沒有去遵循RFC協(xié)議規(guī)定,往往這之間所造成的差異也各具不同。運用這樣的思路,就可以利用實現(xiàn)的不同,從而造成具有現(xiàn)實意義的攻擊。
互聯(lián)網(wǎng)世界里還存在更多的協(xié)定,但是實際應(yīng)用中很可能大量都并沒有去遵循這樣的協(xié)定。對于整個Web互聯(lián)網(wǎng)世界而言,單獨個體對于協(xié)議的不遵循(如瀏覽器和Web Server,Web Server與Web Server等)于自身而言就是漏洞,對這些漏洞點加以組合利用,便最終構(gòu)成了多種潛在的網(wǎng)絡(luò)安全攻擊。為此,尋找協(xié)議的制定與實施之間的差異,并在此基礎(chǔ)上加以組合利用,便成為了一種新的漏洞挖掘思路。
4 結(jié)束語
本文主要分析了一種由于HTTP協(xié)議Host頭具有二義性所造成的安全問題,闡述了具體攻擊場景和利用方式,并且進一步分析了由HTTP協(xié)議Host頭二義性所帶來的一種漏洞挖掘研究的新思路,并輔以網(wǎng)絡(luò)上具體存在的漏洞案例進行論述。事實上,很可能找到諸多不遵循RFC或其他標準的實施,而研究的難點和關(guān)鍵在于:如何將這一系列的網(wǎng)絡(luò)安全漏洞與缺陷進行有效地聯(lián)系或組合起來,從而構(gòu)造出合適的網(wǎng)絡(luò)攻擊場景并發(fā)掘更為深層次的潛在安全危害。這是需要進一步思考與研究的問題;同時通過本文,希望能有更多的安全研究人員能夠關(guān)注協(xié)議與實現(xiàn)之間存在的差異等,以及與之相關(guān)的安全漏洞利用問題。
參考文獻
[1] Gourley D, Totty B. HTTP: the definitive guide[M]. “O'Reilly Media, Inc.”,2002.
[2] Chen J, Jiang J, Duan H, et al. Host of Troubles: Multiple Host Ambiguities in HTTP Implementations[C]//Proceedings of the 2016 ACM SIGSAC Conference on Computer and Communications Security. ACM,2016: 1516-1527.
[3] Fielding R, Gettys J, Mogul J, et al. Hypertext transfer protocol-HTTP/1.1, 1999[J]. RFC2616, 2006.
[4] Fielding R, Reschke J. RFC 7230: Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing[J]. 2014.
[5] Labsdetectify:Combining host header injection and lax host parsing serving maliciousData.https://labs.detectify.com/2016/10/24/combining-host-header-injection-and-lax-host-parsing-serving-malicious-data/.
[6] XSS Jigsaw:Internet Explorer has a URL problem.http://blog.innerht.ml/internet-expl-orer-has-a-url-problem/.
基金項目:
成都信息工程大學(xué)科研基金資助項目(KYTZ201618)。
作者簡介:
李文皓(1996-),男,四川成都人,大學(xué)本科;主要研究方向和關(guān)注領(lǐng)域:信息安全。
李斌勇(1983-),男,四川江油人,博士,講師;主要研究方向和關(guān)注領(lǐng)域:信息安全、云服務(wù)技術(shù)。