五个案例“熄灭”Nginx漏洞隐患( 二 )


  •  
http://x.x.x.x/logo.jpg/x.phphttp://x.x.x.x/logo.jpg%00x.php因此隐藏 Nginx 的版本号 , 可以在一定程度上提高安全性 。
漏洞修复
? 在配置文件nginx.conf里面,设置如下:server_tokens off 。
 
05
整数溢出漏洞
漏洞介绍
在Nginx的range filter中存在整数溢出漏洞 , 可以通过带有特殊构造的range的HTTP头的恶意请求引发这个整数溢出漏洞 , 并导致信息泄露 。
HTTP的Range允许客户端分批次请求资源的一部分 , 如果服务端资源较大 , 可以通过Range来并发下载;如果访问资源时网络中断 , 可以断点续传 。Range设置在HTTP请求头中 , 它是多个byte-range-spec(或suffix-byte-range-spec)的集合 , 如下所示:
五个案例“熄灭”Nginx漏洞隐患

文章插图
 
 
其中 , 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
 
如果一次请求有多个range , 返回的数据需要multipart来组织;格式如下:
五个案例“熄灭”Nginx漏洞隐患

文章插图
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;
本次复现利用使用Nginx-1.12.0作为缓存服务器 , 缓存配置同上文 , 访问的目标文件仍然是http://www.baidu.com/img/bd_logo1.png。
首先 , 不指定range , 得到该图片文件的长度为7877 , 如下所示:
五个案例“熄灭”Nginx漏洞隐患

文章插图
设置第一段range为-8500 , 此时的start为7877-8500=-623 , 即图片在Cache文件偏移之前的623 bytes也会被返回 , 而这623 bytes中就包含了Cache文件头部 。
下一步 , 按照上文所说 , 第二段range的长度需要将总长度溢出 。我们的目标总和size为0×8000000000000000 , 第一段range长度为8500 , 故第二段range长度为0×8000000000000000-8500=9223372036854767308 。
于是 , 使用curl命令 , 配合-r参数指定bytes range:
五个案例“熄灭”Nginx漏洞隐患

文章插图
 
 
可以看到返回内容中 , 第一段即为-8500的range , 而这一段中我们就看到了Cache文件头部 , 例如cache key以及后端服务器返回的HTTP头 。
漏洞修复
? 综合来看 , 这个漏洞就是整数溢出漏洞的利用 , 能够从Cache文件中获取Cache头的信息 。在某些配置的情况下Cache头中会存在IP地址信息 , 造成信息泄露 。就Nginx模块以及常用的第三方模块本身来说 , 无法通过这个整数溢出来对内存进行操作或者远程执行 。
? 建议升级到1.13.3和1.12.1版本;如果不能升级 , 可以在Nginx配置文件中添加max_ranges 1 , 从而禁用multipart range 。

【五个案例“熄灭”Nginx漏洞隐患】


推荐阅读