第 5 章 · 08 头部注入与路径穿越 本节摘要:本节合并讲两类「输入到达头部或文件路径处理」的失败。头部注入把用户输入变成协议级控制:响应拆分、缓存毒化、session 固定、认证绕过、请求走私都源自一个未规范化的、服务端控制的头部值——bug 通常活在中间层(把请求值复制进响应头部的框架、信任转发头部的代理、按攻击者影响的东西键存的缓存)。路径穿越/LFI/RFI 来自不当的文件路径处理与动态包含,可读取敏感文件、泄露配置/源码、做 SSRF 轴转、经包装器或包含实现代码执行。原则是:把每个到达头部的用户可控值、每个用户可控的路径/名/scheme 都按不受信对待。 内容来源:原项目知识包 与 ,汉化合并并套用体系化模板。
本节摘要:本节合并讲两类「输入到达头部或文件路径处理」的失败。头部注入把用户输入变成协议级控制:响应拆分、缓存毒化、session 固定、认证绕过、请求走私都源自一个未规范化的、服务端控制的头部值——bug 通常活在中间层(把请求值复制进响应头部的框架、信任转发头部的代理、按攻击者影响的东西键存的缓存)。路径穿越/LFI/RFI 来自不当的文件路径处理与动态包含,可读取敏感文件、泄露配置/源码、做 SSRF 轴转、经包装器或包含实现代码执行。原则是:把每个到达头部的用户可控值、每个用户可控的路径/名/scheme 都按不受信对待。
内容来源:原项目知识包
strix/skills/vulnerabilities/header_injection.md与path_traversal_lfi_rfi.md,汉化合并并套用体系化模板。
⚠️ 仅限授权测试:本节所有 payload 与技术仅用于你自己的应用或有书面授权的渗透测试。未经授权对他人系统使用这些技术是非法的。
阅读完本节,你应当能够:
Set-Cookie/Location 的输入、信任 X-Forwarded-* 的代理、缓存键与响应内容的割裂)。php://filter、zip://、data://)。到达头部的输入形态:
Set-Cookie、Location、Content-Type、Content-Disposition、Link、自定义 X-*X-Forwarded-*、自定义关联 ID)导致注入的代码模式:把用户输入直接拼接进头部值而不剥 CR/LF;接受头部值为字符串并逐字序列化的框架(无规范化);信任上游任何人都能伪造的 X-Forwarded-*/Forwarded/X-Real-IP 的代理链;越过认证层被尊重的 X-HTTP-Method-Override。
高价值目标:密码重置/账户恢复流程(Host 头部决定发给用户的链接);OAuth/SSO 重定向端点;信任 X-Forwarded-For/X-Real-IP 做 IP 白名单或限流的认证网关;CDN/WAF 缓存;按 Host 或 X-Tenant-Id 键的多租户路由;文件下载端点;出站通知/邮件系统。
../、编码、规范化缺口读取预期根之外的文件高价值目标:
/etc/passwd、/etc/hosts、应用 .env/config.yaml;SSH 密钥、云凭据、服务配置/日志C:\Windows\win.ini、IIS/web.config、programdata 配置、应用日志HTTP 参数面:file、path、template、include、page、view、download、export、report、log、dir、theme、lang;上传与转换管线(图片/PDF 渲染器、缩略图、Office 转换器);归档解压端点与后台作业;反向代理与静态文件服务器(nginx、CDN)。
💡 核心心法:头部注入与路径穿越的共性是「输入到达了不该到达的协议/文件层」——头部注入活在中间层(框架复制、代理信任、缓存键),路径穿越活在路径拼接与规范化边界。
头部清单:枚举每个随输入变化的响应头部——翻转查询/body/cookie 值,diff Set-Cookie、Location、Content-Type、Content-Disposition、ETag、Vary、自定义 X-*;对每个变化的头部,识别来源字段(用户可控 vs 服务端派生)。
CR/LF 与空白变体:裸 LF(%0a)、裸 CR(%0d)、CRLF(%0d%0a);双重编码(%250d%250a);CR/LF 的过长 UTF-8(%c0%8d、%c0%8a);Unicode 行/段分隔符(%e2%80%a8 U+2028、%e2%80%a9 U+2029);tab(%09,RFC 7230 允许 tab 出现在字段值中);null 字节(%00,某些解析器截断头部值)。
解析器指纹:Server、Via、X-Powered-By、X-AspNet-Version、CF-Ray 揭示栈;Vary、Age、X-Cache、CF-Cache-Status 揭示缓存层与键组成;同一 payload 跨 HTTP/1.1 vs HTTP/2 vs chunked 的差异;Host 与 X-Forwarded-Host 的优先级。
直接型:响应 body 泄露文件内容(文本、二进制、base64);错误页回显真实路径。
报错型:异常消息暴露规范化路径或带真实文件系统位置的 include() 警告。
OAST:RFI/LFI 用触发出站获取(HTTP/DNS)的包装器,确认包含/执行。
副作用:归档解压意外写到目标之外,用目录列表或后续读取验证。
CRLF 响应拆分与走私:注入 \r\n\r\n 终止当前响应并前置第二个攻击者控制的响应。缓存或下游代理可能按第一个响应键存,把第二个投递给其他用户:
GET /redirect?to=foo%0d%0aSet-Cookie:%20admin=1%0d%0a%0d%0a<html>poisoned</html> HTTP/1.1
请求走私是同一原语在请求层的应用(详见上一节)。
缓存毒化:
X-Forwarded-Host、未键查询参数)Vary 操纵:注入 Vary 头部过度碎片化(DoS 味)或欠碎片化(跨用户投递)X-Forwarded-Proto/X-Forwarded-Host 毒化:后端用这些构造响应中的规范 URL;CDN 缓存带攻击者控制链接的响应Cache-Control 注入:把 private 翻成 public;注入 max-age=999999 持久毒化,或 max-age=0/no-cache 冲刷(Age 由缓存自身生成,不是新鲜度控制,别动它)/account/profile.css)存认证响应,靠追加可缓存扩展名Host 头部混淆:后端常在构造绝对 URL 时信任 Host(或 X-Forwarded-Host)——密码重置邮件、OAuth redirect_uri、规范 link 标签。发伪造 Host 会产生指向攻击者控制基础设施、但仍带受害者重置 token 的重置链接:
POST /password-reset HTTP/1.1 Host: attacker.tld
还测:Host 与 X-Forwarded-Host 的优先级、IPv6 方括号(Host: [::1]:80)、尾点(Host: example.com.)、端口混淆(Host: example.com:@attacker.tld)。
Cookie / Set-Cookie 操纵:注入 Domain=.example.com 或 Path=/ 扩大攻击者设置 cookie 的范围;注入 SameSite=None; Secure 允许跨站包含;注入 Max-Age=999999999 持久化或 Max-Age=-1 抹掉受害者 session;同名 cookie 影子覆盖(cookie tossing);反射 cookie XSS(cookie 值稍后未转义渲染进 HTML)。
代理与转发头部伪造:X-Forwarded-* 家族是信息性的——协议不保证谁设置的。任何越过其控制边界信任它们的应用都可被利用:
X-Forwarded-For: 127.0.0.1 绕过 IP 白名单或限流X-Forwarded-Proto: https 满足「仅 HTTPS」检查同时仍用 HTTPX-Real-IP、Client-IP、True-Client-IP、CF-Connecting-IP、Forwarded(RFC 7239)——同一原语,不同头部名,全部喷一遍X-Original-URL/X-Rewrite-URL(IIS、ASP.NET)——认证检查后的服务端 URL 重写,经典管理面板认证绕过Content-Type / 编码混淆:注入 Content-Type: text/html 让浏览器嗅探渲染 → XSS;注入 charset=utf-7 做遗留 XSS;注入 Content-Disposition: inline 把下载翻成页内渲染;注入 Content-Encoding: gzip 但不实际压缩。X-Content-Type-Options: nosniff 的缺失是嗅探攻击的使能条件。
经响应头部的 XSS:Location: javascript:alert(1)(浏览器通常拦截,但某些遗留客户端与 Electron 类宿主不拦);Location: data:text/html,<script>...;Refresh: 0; url=javascript:alert(1)(遗留 Refresh 头部是无 JavaScript 的 meta-refresh 等价物)。
穿越绕过:
/ 与 \\;// 与 \\\\ 跨框架抹平差异....//(双点折叠)、尾点(Windows)、尾斜杠、追加有效扩展名../ 逃逸;试 /static/../etc/passwd 与 ; 变体(..;)%2f 解码不同;测双重解码与编码点LFI 包装器与技巧:
php://filter/convert.base64-encode/resource=index.php(读源码)、zip://archive.zip#file.txt、data://text/plain;base64、expect://(启用时)/proc/self/environ 与框架特定缓存读取秘密%00)截断;路径长度截断模板引擎:PHP include/require;Smarty/Twig/Blade 配动态模板名;Java/JSP/FreeMarker/Velocity;Node.js ejs/handlebars/pug——寻找从用户输入的动态模板解析(theme/lang/template)。
RFI 条件:
allow_url_include/allow_url_fopen)归档解压(Zip Slip):归档内含 ../ 或绝对路径的文件逃逸目标解压目录;测多格式(zip/tar/tgz/7z);验证符号链接处理与写前路径规范化;影响:覆盖配置/模板或往服务目录投 webshell。
编码:URL 编码(%0d%0a)与双重编码(%250d%250a)应对解码次数不对的 WAF;单 payload 内混编码(%0d%0A、%D\n、交替大小写);Unicode 换行等价物(U+2028/U+2029)、CR/LF 的过长 UTF-8。
头部规范化边界:头部名与值中的前导/尾随空白与 tab;头部折叠(RFC 7230 的 obs-fold,正式弃用但某些解析器仍接受以空白开头的续行);重复头部——RFC 说用 , 连接,实践中服务器取首、取尾,或与前面的代理不一致。
方法与方法覆盖:X-HTTP-Method-Override: PUT(及 X-Method-Override、X-HTTP-Method)在框架先于基于方法的授权咨询覆盖时到达状态变更处理器;从服务端或非浏览器客户端有效(浏览器中触发 CORS 预检,故非 CSRF 原语)。
头部名游戏:针对按精确大小写键控的过滤器做大小写扰乱;头部名中的 null 字节截断(X-Forwarded-For\x00Evil)。
核心是「找到过滤器拒绝但文件系统/解析器接受」的表示:编码变体(双重解码、过长 UTF-8 %c0%2e、Unicode 点与斜杠)、混合分隔符、点号折叠(....//)、绝对路径注入、alias 错配、..; 变体。
💡 绕过的共性:两类漏洞的绕过都是「编码/规范化层叠」——WAF/过滤器往往只识别一种规范化形态,换一种等价表示(
%0d%0avs U+2028、../vs%2e%2e%2fvs....//)就能绕过。代理与后端的解码顺序差异是关键突破口。
常见误报:随输入变化但缓存键正确的头部(意图个性化、Vary 设置正确);X-Forwarded-* 被反射回但仅用于日志;浏览器拦截 Location: javascript:/Location: data:;CRLF 出现在响应头部但被外层代理在到达任何客户端或缓存前剥掉;走私指示器其实是正常流水线或 keep-alive 行为。
/etc/hosts),配同端点根内对照。php://filter base64 的 index.php)。../ 条目的归档,展示写到目标之外(如可回读的标记文件)。常见误报:映射不到文件系统的应用内虚拟路径(内容来自安全存储 DB/对象存储);规范化后约束到白名单/根的路径;包装器禁用且仅用常量模板的包含;净化路径并强制目标目录的解压器。
redirect_uri 滥用的开放重定向⚠️ 路径穿越「只能读文件」常被低估——读取
.env、.aws/credentials、~/.ssh/、/proc/self/environ即可获凭据;LFI 经日志毒化或包装器可升级到 RFI 等价的代码执行。头部注入的缓存毒化可波及同栈所有用户,影响等级常达严重。
Vary/X-Forwarded-Host/Cache-Control)、Host 混淆(密码重置/OAuth)、cookie 操纵(tossing/SameSite)、转发头部伪造(X-Forwarded-For/X-Original-URL)、Content-Type 混淆(嗅探/UTF-7)。%0d%0a/U+2028/双重编码)、头部规范化边界(折叠/重复/大小写)、方法覆盖、头部名 null 截断。%2e%2e%2f/双重/过长 UTF-8)、混合分隔符、点号折叠(....//)、绝对路径、alias/root 错配、..; 变体。php://filter(读源码)、zip://、data://、expect://;日志/session 毒化;/proc/self/environ;Zip Slip(归档含 ../)。allow_url_include、自定义 eval 抓取器、SSRF 到执行桥;远程禁用时链上传/日志毒化。X-Forwarded-* 仅日志、浏览器拦截 javascript: 的误报。至此,第 5 章(注入与执行类漏洞)全部讲完。下一章(第 6 章)转向访问控制与客户端类漏洞——XSS、CSRF、IDOR、SSRF、JWT、业务逻辑等,它们与本章共享「输入到达解释器/边界」的根因,但攻击对象与利用形态不同。