在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的处
理;
Nginx可以作为缓存服务器,将Web应用服务器返回的内容缓存起来。如果客户端请求的内容已经被缓存,那么就可以直接将缓存内容返回,而无需再次请求应用服务器。由此,可降低应用服务器的负载,并提高服务的响应性能。
下面是使用Nginx作为缓存服务器的一个示例。假设Nginx监听本地80端口,反向代理百度,那么就有如下配置:
检查页面资源,存在一个静态图片文件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有效时间
例如,下面这条配置: