Nginx系列之整数溢出漏洞(CVE-2017-7529)

这个漏洞太鸡肋了,那就通过这个漏洞学习整数溢出·······start

版本:Nginx njs <=0.7.0

1、首先了解这个  Nginx Cache

Nginx可以作为缓存服务器,将Web应用服务器返回的内容缓存起来。如果客户端请求的内容已经被缓存,那么就可以直接将缓存内容返回,而无需再次请求应用服务器。由此,可降低应用服务器的负载,并提高服务的响应性能。

这些都是通过代码实现,那么程序员总会有几个粗心,由此可能引发溢出

2、什么是整数溢出

计算机中整数变量有上下界,如果在算术运算中出现越界,就会出现两类整数溢出。超出整数类型的最大表示范围,数字便会由一个极大值变为一个极小值或直接归零,这叫“上溢”,即上面例子中提到的a+1=0;超出整数类型的最小表示范围的话,数字便会由一个极小值或者零变成一个极大值,即上述0-1=a,这叫做“下溢”。所谓物极必反就是这个道理。我们哲学中常常讲到的“度”在此处就是个很典型的示范。

阿坝阿坝阿坝·······难懂就讲个故事

A山里的一群猴子只会从0数到9,数完9之后就从头开始数0。有一天从B山跑来一只猴子叫桃桃,他发现了这个问题。桃桃来到A山居住,每次向管家爷爷要10只桃子。管家爷爷只会数到9,第10只桃子他就数0。这样一来桃桃每次拿桃子的记录为零。但是两个月后储备的桃子全没了,管家爷爷的账本中记录的是桃桃一共拿了0只桃子,但实际上桃子已经被他拿光了。

是不是感觉好怪,这是极其危险的

3、浅谈溢出代码(以CVE-2017-7529为例)

3.1、首先认识HTTP中Range

我们有时候在听一首歌的时候,如果听到一半(网络下载了一半),网络断掉了,为什么短时间再听不需要下载呢?因为有Range支持的话,客户端应该记录了之前已经读取的文件范围,网络恢复之后,则向服务器发送读取剩余Range的请求,服务端只需要发送客户端请求的那部分内容,而不用整个文件发送回客户端,以此节省网络带宽。

那么Range可以控制我们的资源读取,那么我们可以构造恶意Range值读取敏感信息

3.2、Range工作流程

Range头域  
  Range头域可以请求实体的一个或者多个子范围。例如,  
  表示头500个字节:bytes=0-499  
  表示第二个500字节:bytes=500-999  
  表示最后500个字节:bytes=-500  
  表示500字节以后的范围:bytes=500-  
  第一个和最后一个字节:bytes=0-0,-1  
  同时指定几个范围:bytes=500-600,601-999 

3.3、Nginx中代码和Range关系

HTTP头部range域的内容大约为Range: bytes=4096-8192bytes=<start>-<end>字符串指针p中即为“bytes=”后面的内容 start为地址开始读取位置,end为结束,对于一般的页面文件这两个值怎么玩都没关系。但对于有额外头部的缓存文件若start值为负(合适的负值)那么就意味着缓存文件的头部也会被读取。

那么我们可以通过 Range 中设 end 值大于content_length(真正文件的长度),这样 start 就自动被程序修正为负值了。

其实就是产生下溢

来个大神详细解读代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值