7529 Nginx整数溢出漏洞分析

在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端口,反向代理百度,那么就有如下配置:

7529 Nginx整数溢出漏洞分析

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

7529 Nginx整数溢出漏洞分析

检查页面资源,存在一个静态图片文件upload/2017_07/1707191437950121.png。由于这类静态文件一般不会发生变化,我们可以将其缓存起来。

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有效时间

例如,下面这条配置:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/60dc822eb809132081506c27514bb795.html