(CVE-2017-7529)Nginx 越界读取缓存漏洞

本文介绍了一个影响Nginx 0.5.6-1.13.2版本的缓存文件头泄漏漏洞,攻击者可通过构造特定的Range请求来获取敏感信息。文章详细解释了漏洞原理,并提供了复现步骤。

一.漏洞原理

Nginx在反向代理站点的时候,通常会将一些文件进行缓存,特别是静态文件。缓存的部分存储在文件中,每个缓存文件包括"文件头"+“HTTP返回包头”+“HTTP返回包体”。如果二次请求命中了该缓存文件,则Nginx会直接将该文件中的"HTTP返回包体"返回给用户。
如果我的请求中包含Range头,Nginx将会根据我指定的start和end位置,返回指定长度的内容。而如果我构造了两个负的位置,如(-600, -9223372036854774591),将可能读取到负位置的数据。如果这次请求又命中了缓存文件,则可能就可以读取到缓存文件中位于"HTTP返回包体"前的"文件头"、"HTTP返回包头"等内容。
反向代理:说白了就是用户访问nginx反向代理服务器即可访问到目标服务器的内容,反向代理服务器分别存放了目标服务器ABC各自的数据,因此解决了集群不知道先访问谁的问题,但对于用户而言访问代理服务器相当于访问目的服务器
正向代理:就是自己挂个国外或者国内服务器(梯子),然后访问资源

二.漏洞详情

该漏洞影响所有 0.5.6 - 1.13.2版本内默认配置模块的Nginx只需要开启缓存攻击者即可发送恶意请求进行远程攻击造成信息泄露。当Nginx服务器使用代理缓存的情况下攻击者通过利用该漏洞可以拿到服务器的后端真实IP或其他敏感信息。
漏洞原因:是由于对http header中range域处理不当造成。主要代码是ngx_http_range_parse函数中的循环。
了解到HTTP头部range域的表示方式是:bytes=<start>-<end> 范围大概是: bytes=4096-8192,字符串指针p的内容即为bytes的范围。
这段代码是要把“-”两边的数字取出分别赋值给start和end变量,标记读取文件的偏移和结束位置。
也就是说bytes=-这个范围内读取到的是缓存文件内容本身。假如这个缓存文件是有文件头,把start设置成负数呢?很好理解,那么它读取的位置就会往前面移动,导致文件头的信息也会被读取出来。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值