这个漏洞太鸡肋了,那就通过这个漏洞学习整数溢出·······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 就自动被程序修正为负值了。 其实就是产生下溢 来个大神详细解读代码