欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

CVE-2017-7529 Nginx整数溢出漏洞分析

来源:本站整理 作者:银河实验室 时间:2017-07-20 TAG: 我要投稿

1、漏洞描述
在Nginx的range filter中存在整数溢出漏洞,可以通过带有特殊构造的range的HTTP头的恶意请求引发这个整数溢出漏洞,并导致信息泄露。
2、影响程度
攻击成本

危害程度

影响范围
Nginx 0.5.6 – 1.13.2
3 、漏洞原理
3.1   HTTP断点续传:Range
HTTP的Range允许客户端分批次请求资源的一部分,如果服务端资源较大,可以通过Range来并发下载;如果访问资源时网络中断,可以断点续传。
Range设置在HTTP请求头中,它是多个byte-range-spec(或suffix-byte-range-spec)的集合;
byte-range-set  = ( byte-range-spec | suffix-byte-range-spec )*N
byte-range-spec = first-byte-pos "-" [last-byte-pos]
suffix-byte-range-spec = "-" suffix-length
其中,first-bytes-pos指定了访问的第一个字节,last-byte-pos指定了最后一个字节,suffix-length则表示要访问资源的最后suffix-length个字节的内容;例如:
Range:bytes=0-1024 表示访问第0到第1024字节;
Range:bytes=500-600,601-999,-300 表示分三块访问,分别是500到600字节,601到600字节,最后的300字节;
在Response头中设置:
Accept-Ranges:bytes 表示接受部分资源的请求;
Content-Range: bytes START-END/SIZE 表示返回的资源位置;其中SIZE等于Content-Length;如:Content-Range: bytes 500-600/1000
3.2   Nginx Range Multipart
如果一次请求有多个range,返回的数据需要multipart来组织;格式如下:
HTTP/1.1 206 Partial Content
Date: Wed, 15 Nov 1995 06:25:24 GMT
Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT
Content-type: multipart/byteranges; boundary=THIS_STRING_SEPARATES
 
--THIS_STRING_SEPARATES
Content-type: application/pdf
Content-range: bytes 500-999/8000
 
...the first range...
--THIS_STRING_SEPARATES
Content-type: application/pdf
Content-range: bytes 7000-7999/8000
...the second range
--THIS_STRING_SEPARATES--
Nginx对Range的支持包括header处理和body处理,分别用来解析客户端发送过来的Range header和裁剪返回给客户端的请求数据Body。其实现分别由ngx_http_range_header_filter_module和ngx_http_range_body_filter_module两个过滤模块完成。
在ngx_http_range_header_filter_module中调用了ngx_http_range_header_filter函数,而该函数进一步调用了ngx_http_range_parse函数来解析header中的Range字段;分别调用ngx_http_range_singlepart_header和ngx_http_range_multipart_header来生成single range和multi ranges的Response Header; 这次的问题就出现在多个range时,ngx_http_range_parse函数对suffix-length的处 理;
3.3   Nginx Cache
Nginx可以作为缓存服务器,将Web应用服务器返回的内容缓存起来。如果客户端请求的内容已经被缓存,那么就可以直接将缓存内容返回,而无需再次请求应用服务器。由此,可降低应用服务器的负载,并提高服务的响应性能。
下面是使用Nginx作为缓存服务器的一个示例。假设Nginx监听本地80端口,反向代理百度,那么就有如下配置:

此时,我们访问http://127.0.0.1,即可得到百度的返回:

检查页面资源,存在一个静态图片文件/Article/UploadPic/2017-7/2017720151253842.png?www.myhack58.com。由于这类静态文件一般不会发生变化,我们可以将其缓存起来。
Nginx配置缓存主要由以下命令完成:
proxy_cache_key用于区分cache文件。
proxy_cache_path设置cache文件的路径和参数。
cache文件会保存在指定的目录下面,文件名是cache key的MD5值
通过level参数将cache文件分多层目录保存,以避免某个目录下存在大量文件造成的性能开销
通过keys_zone参数指定cache key在内存中的区域及其大小,1M的区域大概可以保存8000条key的信息
proxy_cache_valid对不同返回状态值设定cache有效时间
例如,下面这条配置:

指定了以下信息:
使用协议、请求方法、域名、URI作为cache key
cache文件保存在目录/tmp/Nginx/下,采取两层目录,keys_zone名称为my_zone,大小为10M
对于返回状态值为200的内容,cache有效时间为10分钟
现在,我们配置好了名为my_zone的cache,接下来选择对目录www.baidu.com/img/下的图片做缓存。首先,仍然是设置反向代理:

接下来,我们使用下列命令对img目录下的文件进行缓存:

配置命令解释如下:
proxy_cache指定使用的keys_zone名称,就是之前的my_zone
add_header在Nginx返回的HTTP头中,增加一项X-Proxy-Cache,如果缓存命中其值为HIT,未命中则为MISS
proxy_ignore_headers由于百度对图片的请求也会Set-Cookie设置,而Nginx不会缓存带有Set-Cookie的返回,因此我们这里设置忽略该HTTP头

[1] [2] [3]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载