HTTP 0.9是第一个版本的HTTP协议,在1991年的时候被正式提出,实际上在更早的时候就已经一直在使用这个版本了。简单来说,它是由客户端上的GET请求和服务端的响应组成,其中,GET请求和现在用的GET请求有点类似。与HTTP 1.0中的响应包不同的是0.9版本的并不是由响应头和响应内容组成,而是只有一个响应体构成。这就意味着不可以构造特殊的数据类型(Content-type),所以响应包只是简单的以与服务器的TCP连接的断开为结束。

在现在的HTTP 1.1中包含了请求头和请求体,如下:
HTTP/1.1 200 ok
Content-type: application/octet-stream
Content-length: 68
some-malware-here
同样的内容,在HTTP 0.9中就没有头部,就像下面一样:
some-malware-here

使用HTTP 0.9进行绕过——解析HTTP逃逸
有趣的是,HTTP 1.1的请求得到的HTTP 0.9响应包会被大多数浏览器接收(除了Safari)即使有些并没有在现在的协议中被定义出来。

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

HTTP 0.9的响应并不像HTTP 1.x的响应包,因为它没有响应头。按我们的想象,防火墙应该要过滤掉这样的响应包,因为它看起来并不符合HTTP协议。谁也不能肯定在如今的网络中不存在依然在使用HTTP 0.9的产品。所以,防火墙能做的只是检测HTTP 0.9响应包并对其做做恶意软件分析。

但是出乎意料的是,大多数防火墙都是简单的让HTTP/0.9的响应包直接通过,而没有做进一步的检测。从排名前10的防火墙测试报告中,我们发现,仅仅只有一小部分的HTTP Evader被拦截,更多的(大概有80%)用这种方式直接通过了防火墙。由于这些防火墙并没有对HTTP 0.9的响应包做恶意软件分析,我们可以这么认为:防火墙只是简单的让所有它无法分析的数据包直接通过。
在HTTP 0.9刚刚被提出来的时候,它仅仅只是用来显示静态页面(不需要其他字段进行说明),这种情况下,这些并不是什么问题,因为他只是用来把页面显示在浏览器中。但是,如果结合使用老版本的HTTP 0.9和HTML 5,如果遇到一个下载页面,执行下载的时候:
 href="http://attacker.test/http09-response" download="malware.exe">

HTTP 0.9响应可以被当成脚本、图片或缺html页面来使用,只要把它嵌入到适当的页面中就行,例如:
 src="http://attacker.test/http09-response.js">
  src="http://attacker.test/http09-response.gif">
  href="http://attacker.test/http09-response.html">
通过这样的方式,任何文件只要以这个结构来传输,都可以直接绕过防火墙。