HTTP.sys远程代码执行(CVE2015-1635,MS15-034)

HTTP.sys远程代码执行(CVE2015-1635)

漏洞原理

在原来网络不是很好的时候,下载大型文件很不容易,如果下载中断 ,那么只能重头开始下载,为了解决这个问题 HTTP/1.1引入的范围请求。即请求这个文件x~y的字节,指定范围,在请求报文的首部添加Range字段,此字段指定资源的byte范围,告诉服务器,请求资源是哪个范围的内容,让断点续传和并行下载得以实现。

如果服务器支持范围请求,响应包中,会存在Accept-Range字段(且值部位none,bytes为资源范围的单位),并在content-length字段告诉客户端资源的大小范围。

GET /js/site.js HTTP/1.1
Range: bytes=0-18446744073709551615
Cookie: ASPSESSIONIDAQCSSQQQ=AENCJGCBHMLGFOCHOJEBNLCJ
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip,deflate
Host: xxx.xxx.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.21 .....
Connection: Keep-alive

响应:
HTTP/1.1 416 Requested Range Not Satisfiable
Content-Type: application/x-javascript
Last-Modified: Wed, 18 Sep 2013 05:52:53 GMT
Accept-Ranges: bytes
ETag: "963ee15033b4ce1:0"
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET
Date: Sat, 05 Sep 2020 03:16:27 GMT
Content-Length: 362
Content-Range: bytes */1602

.....

如果没有Accept-Ranges字段,则服务器可能不支持范围请求,有的服务器会明确将值设为“none”。

服务器面对范围请求,有三种响应:

请求成功:    响应206 Partial Content
请求范围越界:(范围超过资源的大小)    响应416 Requested Range Not Satisfiable
不支持范围请求:    响应200 OK

而HTTP.sys远程代码执行漏洞正是利用Range字段注入恶意数据。该漏洞的检测,也是利用服务器面对范围请求时的响应特征来判断

漏洞检测

HTTP.sys漏洞的检测比较简单,先判断目标环境是不是Windows+IIS,然后构造Range字段进行检测即可。

检测时,在请求包中添加Range字段,如下:

Range: bytes=0-18446744073709551615

服务器响应400,证明不存在HTTP.sys远程代码执行漏洞。如果响应416,则证明系统存在漏洞。

这里简单说一下Range字段值的含义。18446744073709551615转为十六进制是 0xFFFFFFFFFFFFFFFF(16个F),是64位无符号整型所能表达的最大整数,整数溢出和这个超大整数有关。

另外,Apache几个老版本存在的Apache HTTP Server畸形Range选项处理远程拒绝服务漏洞,也是通过Range字段触发的,有兴趣的校友可以去了解了解。

漏洞修复

升级补丁:

http://technet.microsoft.com/security/bulletin/MS15-034

禁用IIS内核缓存(缓解方案):

https://technet.microsoft.com/en-us/library/cc731903(v=ws.10).aspx

posted @ 2020-09-06 18:19  komomon  阅读(1959)  评论(0编辑  收藏  举报