使用HTTP 0.9進(jìn)行繞過(guò)——解析HTTP逃逸

HTTP 0.9是第一個(gè)版本的HTTP協(xié)議,在1991年的時(shí)候被正式提出,實(shí)際上在更早的時(shí)候就已經(jīng)一直在使用這個(gè)版本了。簡(jiǎn)單來(lái)說(shuō),它是由客戶端上的GET請(qǐng)求和服務(wù)端的響應(yīng)組成,其中,GET請(qǐng)求和現(xiàn)在用的GET請(qǐng)求有點(diǎn)類似。與HTTP 1.0中的響應(yīng)包不同的是0.9版本的并不是由響應(yīng)頭和響應(yīng)內(nèi)容組成,而是只有一個(gè)響應(yīng)體構(gòu)成。這就意味著不可以構(gòu)造特殊的數(shù)據(jù)類型(Content-type),所以響應(yīng)包只是簡(jiǎn)單的以與服務(wù)器的TCP連接的斷開(kāi)為結(jié)束。

在現(xiàn)在的HTTP 1.1中包含了請(qǐng)求頭和請(qǐng)求體,如下:
HTTP/1.1 200 ok
Content-type: application/octet-stream
Content-length: 68
some-malware-here
同樣的內(nèi)容,在HTTP 0.9中就沒(méi)有頭部,就像下面一樣:
some-malware-here

使用HTTP 0.9進(jìn)行繞過(guò)——解析HTTP逃逸
有趣的是,HTTP 1.1的請(qǐng)求得到的HTTP 0.9響應(yīng)包會(huì)被大多數(shù)瀏覽器接收(除了Safari)即使有些并沒(méi)有在現(xiàn)在的協(xié)議中被定義出來(lái)。

HTTP 0.9如何被用于逃逸的分析

HTTP 0.9的響應(yīng)并不像HTTP 1.x的響應(yīng)包,因?yàn)樗鼪](méi)有響應(yīng)頭。按我們的想象,防火墻應(yīng)該要過(guò)濾掉這樣的響應(yīng)包,因?yàn)樗雌饋?lái)并不符合HTTP協(xié)議。誰(shuí)也不能肯定在如今的網(wǎng)絡(luò)中不存在依然在使用HTTP 0.9的產(chǎn)品。所以,防火墻能做的只是檢測(cè)HTTP 0.9響應(yīng)包并對(duì)其做做惡意軟件分析。

但是出乎意料的是,大多數(shù)防火墻都是簡(jiǎn)單的讓HTTP/0.9的響應(yīng)包直接通過(guò),而沒(méi)有做進(jìn)一步的檢測(cè)。從排名前10的防火墻測(cè)試報(bào)告中,我們發(fā)現(xiàn),僅僅只有一小部分的HTTP Evader被攔截,更多的(大概有80%)用這種方式直接通過(guò)了防火墻。由于這些防火墻并沒(méi)有對(duì)HTTP 0.9的響應(yīng)包做惡意軟件分析,我們可以這么認(rèn)為:防火墻只是簡(jiǎn)單的讓所有它無(wú)法分析的數(shù)據(jù)包直接通過(guò)。
在HTTP 0.9剛剛被提出來(lái)的時(shí)候,它僅僅只是用來(lái)顯示靜態(tài)頁(yè)面(不需要其他字段進(jìn)行說(shuō)明),這種情況下,這些并不是什么問(wèn)題,因?yàn)樗皇怯脕?lái)把頁(yè)面顯示在瀏覽器中。但是,如果結(jié)合使用老版本的HTTP 0.9和HTML 5,如果遇到一個(gè)下載頁(yè)面,執(zhí)行下載的時(shí)候:
? download="malware.exe">

HTTP 0.9響應(yīng)可以被當(dāng)成腳本、圖片或缺html頁(yè)面來(lái)使用,只要把它嵌入到適當(dāng)?shù)捻?yè)面中就行,例如:
?src="http://attacker.test/http09-response.js">
? src="http://attacker.test/http09-response.gif">
? >
通過(guò)這樣的方式,任何文件只要以這個(gè)結(jié)構(gòu)來(lái)傳輸,都可以直接繞過(guò)防火墻。