- 网络安全
- 应用安全
- 渗透测试
【免费下载链接】PayloadsAllTheThings
A list of useful payloads and bypass for Web Application Security and Pentest/CTF
反向代理(Reverse Proxy)位于客户端与后端服务器之间,负责转发请求、隐藏后端基础设施,并提供负载均衡或缓存能力。一旦出现访问控制缺失、
proxy_pass指令缺少输入过滤、或盲目信任X-Forwarded-For等客户端可控头,就会引发未授权访问、目录穿越、内部资源泄露等漏洞。本文以 Reverse Proxy Misconfigurations/README.md 为骨架,系统梳理 HTTP 头欺骗、Nginx 两类经典错误配置与 Caddy 模板注入的完整攻击链,并给出可复制的探测命令、漏洞配置示例与修复建议,读完即可直接用于 Web 应用安全测试与 CTF 实战。
反向代理是什么,错误配置为什么危险
反向代理是部署在客户端与后端服务器之间的中间层:客户端只看到代理,代理根据 URI、Host 或其他条件把请求转发给合适的后端服务,同时承担负载均衡、缓存、TLS 终结等职责。这种"中间层"的设计决定了其安全性高度依赖配置正确性,常见错误配置包括:
- 访问控制缺失:静态资源、管理端路径被错误暴露;
proxy_pass等指令缺乏输入规范化:攻击者利用路径解析差异绕过校验;- 信任客户端可提供的头:如
X-Forwarded-For、X-Real-IP、True-Client-IP,被用来伪造来源 IP、绕过 IP 白名单或限流。
以下内容分别从"工具、方法论(HTTP 头 / Nginx / Caddy)、练习环境"三个层面展开,完整继承原文档的攻击面梳理。
侦察与验证工具
在开始手工测试前,可以先用静态分析与 URL 旁路工具快速定位问题面:
| 工具 | 定位 |
|---|---|
| gixy(Yandex) | Nginx 配置静态分析器,可检测 alias 遍历、变量覆盖、add_header 绕过等常见错误配置 |
| Gixy-Next(MegaManSec) | 社区维护的 Python3 重写分支,兼容新版 Nginx 指令 |
| Kyubi(shiblisec) | 专门发现 Nginx alias 遍历(alias traversal)错误配置的工具 |
| bypass-url-parser(laluka) | 批量测试大量 URL 绕过变体,用于突破返回 40X 的受保护页面 |
bypass-url-parser的典型用法(单目标、批量文件、基于原始请求三种模式):
# 对单个 URL 进行旁路测试,-s 指定 DNS 服务器,-d 开启调试 bypass-url-parser -u "http://127.0.0.1/juicy_403_endpoint/" -s 8.8.8.8 -d # 从文件读取多个 URL,-t 线程数、-T 超时,-H 附加自定义头(可多次使用) bypass-url-parser -u /path/urls -t 30 -T 5 -H "Cookie: me_iz=admin" -H "User-agent: test" # 从原始请求文件构造测试,--request-tls 启用 TLS,-m 指定中间路径/结尾路径组合 bypass-url-parser -R /path/request_file --request-tls -m "mid_paths, end_paths"静态扫描与 URL 旁路只是辅助,真正的漏洞确认仍需要理解底层机制,见下文方法论。
方法论一:HTTP 头信任问题
X-Forwarded-For、X-Real-IP、True-Client-IP本质上都只是普通 HTTP 头。只要客户端能控制流量路径中的一部分——尤其是能直接连接应用服务器,或反向代理没有正确过滤/校验这些头——就可以自行设置或覆盖它们。这通常会导致两种后果:
- 绕过依赖客户端 IP 的访问控制(IP 白名单、管理后台登录限制);
- 绕过基于 IP 的限流(如登录接口的暴力破解防护)。
X-Forwarded-For
X-Forwarded-For是用于标识"经由 HTTP 代理或负载均衡连接 Web 服务器的客户端真实 IP"的 HTTP 头。当客户端经由代理发出请求时,代理会把客户端真实 IP 追加进该头;若链路中存在多个代理(请求依次经过多个节点),每个代理都会把收到请求的源地址以逗号分隔追加到头部末尾,形成一条 IP 链:
X-Forwarded-For: 2.21.213.225, 104.16.148.244, 184.25.37.3从左到右依次是"最初客户端 → 第一跳代理 → 第二跳代理……"。关键问题在于:如果 Nginx 没有用真实连接地址覆盖该头,任何攻击者都可以直接伪造整条链,而应用层若取"最左"值作为客户端 IP 就会被完全欺骗。
Nginx 层面正确的做法是用$remote_addr(与客户端直连的 socket 地址)强制覆盖:
proxy_set_header X-Forwarded-For $remote_addr;仓库实战佐证:伪造 X-Forwarded-For 绕过限流
本仓库 Brute Force Rate Limit/README.md 在 FFUF 爆破示例中直接演示了这一攻击手法——用独立字典对X-Forwarded-For头做 FUZZ,使每次请求呈现为不同"客户端 IP",从而绕过按 IP 统计的失败次数限制:
ffuf -w usernames.txt:USER -w passwords.txt:PASS \ -u https://target.tld/login \ -X POST -d "username=USER&password=PASS" \ -H "Content-Type: application/x-www-form-urlencoded" \ -H "X-Forwarded-For: FUZZ" -w ipv4-list.txt:FUZZ \ -mc all# 单行等价写法(若不用多字典 fuzz) ffuf -w usernames.txt:USER -w passwords.txt:PASS \ -u https://target.tld/login -X POST \ -d "username=USER&password=PASS" \ -H "Content-Type: application/x-www-form-urlencoded" \ -H "X-Forwarded-For: FUZZ" -w ipv4-list.txt:FUZZ -mc all在真实渗透中,同一手法也可用于绕过 GeoIP 限制或基于 IP 的管理入口白名单。作为对照,Brute Force Rate Limit/README.md 还给出了攻击方的进阶对抗手段(HTTP Pipelining、JA3 指纹、代理链),说明仅靠 IP 维度做限流在现代攻击面下是脆弱的。
另一个值得留意的场景是 SSI/ESI(服务器端包含/边缘端包含)注入:仓库 Server Side Include Injection/Files/ssi_esi.txt 提供了一个通过 CRLF 注入在 ESI 请求中夹带X-Forwarded-For: 127.0.0.1的示例,说明该头在服务端内容渲染链路中同样可能被滥用:
<esi:include src="http://google.com%0d%0aX-Forwarded-For:%20127.0.0.1%0d%0aJunkHeader:%20JunkValue/"/>X-Real-IP
X-Real-IP是另一个自定义 HTTP 头,Nginx 及部分代理常用它来转发原始客户端 IP。与X-Forwarded-For的"IP 链"不同,X-Real-IP只包含单个 IP:即连接第一跳代理的客户端地址。它同样完全由代理写入、可被客户端伪造,只要应用层直接信任它做鉴权或限流,攻击者只需:
curl -H "X-Real-IP: 127.0.0.1" https://target.tld/admin即可伪装成 localhost 来源,绕过"仅允许内网/本机访问"的规则。
True-Client-IP
True-Client-IP是部分 CDN/云厂商(典型如 Akamai)为穿透自身基础设施传递"原始客户端 IP"而开发并标准化的头。与前面两者同理:一旦后端应用只认这个头而不验证其来源(例如 CDN 回源时未剥离用户传入的同名头),攻击者就能在直达源站的请求中伪造该头,让源站以为请求来自 CDN 边缘节点或任意指定 IP,从而绕过边缘 WAF 与源站访问控制。
修复建议(针对三类头)
- 在边缘代理(Nginx 等)上用
$remote_addr/real_ip_module覆盖并标准化这三个头,只允许可信代理追加; - 回源时剥离客户端传入的同名头,避免"头叠加";
- 应用层不要直接信任任何可客户端控制的头做鉴权依据,IP 判断一律以 TCP 连接地址为准;
- 限流/风控应综合设备指纹(TLS JA3、Cookie、行为特征)而非单一 IP 维度。
方法论二:Nginx 错误配置
Off By Slash:location 匹配与 alias 路径穿越
Nginx 使用传入请求 URI 与配置中的location块进行匹配,斜杠的有无会直接改变匹配语义:
location /app/:匹配/app/及其下所有路径,如/app/foo、/app/bar/123;location /app(无尾斜杠):匹配/app*,即/application、/appfile等前缀相同的一切路径。
server { location /app/ { # 处理 /app/ 及其下级,例如 /app/foo } location /app { # 仅处理 /app(后面无内容),或路由到 /application、/appzzz 等 } }危险之处在于 location 前缀匹配与alias(将 URI 映射到另一目录)组合时的路径拼接缺陷。以下是一个典型漏洞配置:攻击者请求/styles../secret.txt,实际被解析为/path/css/../secret.txt,从而穿越到别名目录之外读取文件:
location /styles { alias /path/css/; }原因:alias /path/css/会把/styles后的内容原样拼接到/path/css/后面,/styles../secret.txt→/path/css/../secret.txt,其中的..完成了目录上跳,等价于读取/path/secret.txt。
修复要点:location与alias应以一致的尾斜杠搭配(location /styles/ { alias /path/css/; }),或在alias后使用规范化后的$uri拼接,必要时用try_files先做存在性校验。
Missing Root Location:缺失根 location 导致配置与敏感文件泄露
root /etc/nginx;指令设定服务器提供静态文件时的根目录。如果配置中没有独立的根location /,该root会作为全局设置生效——这意味着任何未被其他 location 捕获的请求都会落到该 root 目录下。示例:
server { root /etc/nginx; location /hello.txt { try_files $uri $uri/ =404; proxy_pass http://127.0.0.1:8080/; } }此时请求/nginx.conf会直接解析为/etc/nginx/nginx.conf,Nginx 将主配置文件本身明文返回;同理还可读取/etc/nginx/sites-enabled/*、mime 类型表等。这与 Insecure Management Interface、Directory Traversal 等章节所讲的"静态文件泄露"互为印证,属于 Web 攻击面(参见 Web Attack Surface.md)中的常见枚举项。
修复要点:为静态文件设置精确的 location 根目录(如location /static/ { root /srv/www; }),避免将敏感目录(/etc/nginx、/var/www上级目录)设为全局 root;对所有未匹配路径显式返回 404 或 403。
关联攻击面:Host 头路由
反向代理按Host头做虚拟主机路由时,同样存在配置/信任边界问题。仓库 Virtual Hosts/README.md 指出:HTTP/1.1 起每个请求必须携带Host头,服务器据此决定服务哪个站点;若代理未做白名单校验,攻击者可通过
curl -H "Host: admin.example.com" http://10.10.10.10/命中隐藏虚拟主机,访问本不应暴露的管理功能——这常与"代理只校验了 IP/域名前缀、未校验 Host 全名"的错误配置组合放大危害。
方法论三:Caddy 模板注入(templates 指令)
Caddy 是一个默认启用 HTTPS 的 Go 语言 Web 服务器。其templates指令允许使用Go 模板做动态内容渲染。下面是一段存在漏洞的 Caddy 配置:
:80 { root * / templates respond "You came from {http.request.header.Referer}" }templates会指示 Caddy 把响应字符串当作模板处理,并对其中出现的变量(采用 Go 模板语法{{ ... }})求值——包括来自不可信输入的内容。攻击者在Referer头中注入模板表达式{{readFile "etc/passwd"}}:
curl -H 'Referer: {{readFile "etc/passwd"}}' http://localhost/Caddy 会真的执行readFile读取/etc/passwd并把内容拼入响应:
HTTP/1.1 200 OK Content-Length: 716 Content-Type: text/plain; charset=utf-8 Server: Caddy Date: Thu, 24 Jul 2025 08:00:50 GMT You came from root:x:0:0:root:/root:/bin/sh bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin原理:Caddy 的templates在渲染时会求值花括号内的任何内容,而模板函数集中默认暴露了文件系统与环境相关的函数,攻击者输入因此具备读写文件、列目录、读环境变量的能力。原文档给出的常用攻击模板速查表:
| Payload | 说明 |
|---|---|
{{env "VAR_NAME"}} | 读取环境变量 |
{{listFiles "/"}} | 列出目录内所有文件 |
{{readFile "path/to/file"}} | 读取指定文件内容 |
修复要点:如非必要不要启用templates;若必须启用,绝不要直接渲染由请求头/请求体直接拼接的字符串,先对输入做模板语法转义或使用仅含安全函数子集的模板引擎;同时收紧运行 Caddy 进程的操作系统权限(最小化文件系统可读范围)。
练习与验证环境
下列平台/靶场可用于验证上述攻击面(均在原文档中列出,可用于本地或在线练习):
- Root Me — Nginx Alias Misconfiguration:专项练习 Off By Slash 别名穿越;
- Root Me — Nginx Root Location Misconfiguration:专项练习缺失根 location 的配置泄露;
- Root Me — Nginx SSRF Misconfiguration:Nginx 配置引发的服务端请求伪造;
- Detectify vulnerable-nginx:开源的可本地部署的"脆弱 Nginx"靶场,覆盖多种常见 Nginx 错误配置。
参考资料
- What is X-Forwarded-For and when can you trust it?(Phil Sturgeon,2024-01-31):深入讲解 X-Forwarded-For 的信任边界,是理解头欺骗的基础读物;
- Common Nginx misconfigurations that leave your web server open to attack(Detectify,2020-11-10):系统盘点 Nginx 常见错误配置及其利用方式,与本篇 Off By Slash、Missing Root Location 章节直接对应。
小结
反向代理错误配置的攻击面可归纳为三条主线:信任客户端可控头(X-Forwarded-For/X-Real-IP/True-Client-IP伪造来源 IP,绕过限流与访问控制)、路径拼接缺陷(Nginx 的 Off By Slash 别名穿越、缺失根 location 导致配置泄露)、模板渲染误用(Caddytemplates注入读取文件/环境变量)。测试时可先用 gixy / Gixy-Next 静态扫描配置,再用 bypass-url-parser 与手工 curl 验证,最后结合仓库 Reverse Proxy Misconfigurations/README.md 中的漏洞配置片段在 Root Me、vulnerable-nginx 等靶场复现,形成"发现 → 验证 → 修复"的完整闭环。
- 网络安全
- 应用安全
- 渗透测试
【免费下载链接】PayloadsAllTheThings
A list of useful payloads and bypass for Web Application Security and Pentest/CTF
相关推荐
Cocos粒子系统3步出效果:爆炸、雨丝的保姆级参数清单
Cocos粒子系统3步出效果:爆炸、雨丝的保姆级参数清单 做游戏特效最怕两件事:调了一下午还是"没反应",以及效果出来了但手机发烫。这篇针对 Cocos 引擎的
游戏开发图形学3D渲染10分钟越狱老设备:palera1n完整操作指南
10分钟越狱老设备:palera1n完整操作指南 你的 iPhone 7 停在 iOS 15 再也动不了,却还想要 Sileo 和 tweak——palera1
CLI固件Woodpecker 反向代理配置全指南:Apache / Nginx / Caddy / Traefik 与内网穿透部署实战
Woodpecker 反向代理配置全指南:Apache / Nginx / Caddy / Traefik 与内网穿透部署实战 Woodpecker 是一个开源
CI/CDDevOps
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考