第 5 章 · 08 头部注入与路径穿越


文档摘要

第 5 章 · 08 头部注入与路径穿越 本节摘要:本节合并讲两类「输入到达头部或文件路径处理」的失败。头部注入把用户输入变成协议级控制:响应拆分、缓存毒化、session 固定、认证绕过、请求走私都源自一个未规范化的、服务端控制的头部值——bug 通常活在中间层(把请求值复制进响应头部的框架、信任转发头部的代理、按攻击者影响的东西键存的缓存)。路径穿越/LFI/RFI 来自不当的文件路径处理与动态包含,可读取敏感文件、泄露配置/源码、做 SSRF 轴转、经包装器或包含实现代码执行。原则是:把每个到达头部的用户可控值、每个用户可控的路径/名/scheme 都按不受信对待。 内容来源:原项目知识包 与 ,汉化合并并套用体系化模板。

第 5 章 · 08 头部注入与路径穿越

本节摘要:本节合并讲两类「输入到达头部或文件路径处理」的失败。头部注入把用户输入变成协议级控制:响应拆分、缓存毒化、session 固定、认证绕过、请求走私都源自一个未规范化的、服务端控制的头部值——bug 通常活在中间层(把请求值复制进响应头部的框架、信任转发头部的代理、按攻击者影响的东西键存的缓存)。路径穿越/LFI/RFI 来自不当的文件路径处理与动态包含,可读取敏感文件、泄露配置/源码、做 SSRF 轴转、经包装器或包含实现代码执行。原则是:把每个到达头部的用户可控值、每个用户可控的路径/名/scheme 都按不受信对待。

内容来源:原项目知识包 strix/skills/vulnerabilities/header_injection.mdpath_traversal_lfi_rfi.md,汉化合并并套用体系化模板。

⚠️ 仅限授权测试:本节所有 payload 与技术仅用于你自己的应用或有书面授权的渗透测试。未经授权对他人系统使用这些技术是非法的。

学习目标

阅读完本节,你应当能够:

  1. 识别头部注入的攻击面(回显进 Set-Cookie/Location 的输入、信任 X-Forwarded-* 的代理、缓存键与响应内容的割裂)。
  2. 掌握头部注入的关键漏洞:CRLF 响应拆分、缓存毒化、Host 混淆、cookie 操纵、转发头部伪造、Content-Type 混淆
  3. 识别路径穿越/LFI/RFI 的攻击面(路径参数、文件上传、归档解压、模板引擎)。
  4. 掌握路径穿越的绕过技巧(编码、混合分隔符、点号技巧、绝对路径、alias/root 错配)与 LFI 包装器(php://filterzip://data://)。
  5. 用验证步骤确认漏洞、排除误报
  6. 评估这两类漏洞的影响等级

一、攻击面

头部注入的攻击面

到达头部的输入形态:

  • 查询/body/路径值被回显进 Set-CookieLocationContent-TypeContent-DispositionLink、自定义 X-*
  • 请求头部被重新发出进响应(Referer、User-Agent、X-Forwarded-*、自定义关联 ID)
  • 服务端用用户提供的 URL 构造出站请求的 webhook/回调流程(Host、Referer)
  • 来自用户输入的出站邮件头部(To/From/Subject)

导致注入的代码模式:把用户输入直接拼接进头部值而不剥 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 键的多租户路由;文件下载端点;出站通知/邮件系统。

路径穿越/LFI/RFI 的攻击面

  • 路径穿越:经 ../、编码、规范化缺口读取预期根之外的文件
  • 本地文件包含(LFI):把服务端文件包含进解释器/模板
  • 远程文件包含(RFI):包含远程资源(HTTP/FTP/包装器)实现代码执行
  • 归档解压:解压时写到目标目录之外的 Zip Slip
  • 规范化错配:服务端/代理差异(nginx alias/root、上游解码器);OS 特定路径(Windows 分隔符、设备名、UNC、NT 路径、备用数据流)

高价值目标:

  • Unix:/etc/passwd/etc/hosts、应用 .env/config.yaml;SSH 密钥、云凭据、服务配置/日志
  • Windows:C:\Windows\win.ini、IIS/web.config、programdata 配置、应用日志
  • 应用:源码模板与服务端包含;env dump 中的秘密、框架缓存

HTTP 参数面:filepathtemplateincludepageviewdownloadexportreportlogdirthemelang;上传与转换管线(图片/PDF 渲染器、缩略图、Office 转换器);归档解压端点与后台作业;反向代理与静态文件服务器(nginx、CDN)。

💡 核心心法:头部注入与路径穿越的共性是「输入到达了不该到达的协议/文件层」——头部注入活在中间层(框架复制、代理信任、缓存键),路径穿越活在路径拼接与规范化边界。

二、检测通道

头部注入的检测

头部清单:枚举每个随输入变化的响应头部——翻转查询/body/cookie 值,diff Set-CookieLocationContent-TypeContent-DispositionETagVary、自定义 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,某些解析器截断头部值)。

解析器指纹:ServerViaX-Powered-ByX-AspNet-VersionCF-Ray 揭示栈;VaryAgeX-CacheCF-Cache-Status 揭示缓存层与键组成;同一 payload 跨 HTTP/1.1 vs HTTP/2 vs chunked 的差异;HostX-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

请求走私是同一原语在请求层的应用(详见上一节)。

缓存毒化:

  • 未键输入 → 已键响应:影响响应 body 但不影响缓存键的输入(回显进链接的 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 由缓存自身生成,不是新鲜度控制,别动它)
  • Web 缓存欺骗:把缓存引向在公开模样 URL(/account/profile.css)存认证响应,靠追加可缓存扩展名

Host 头部混淆:后端常在构造绝对 URL 时信任 Host(或 X-Forwarded-Host)——密码重置邮件、OAuth redirect_uri、规范 link 标签。发伪造 Host 会产生指向攻击者控制基础设施、但仍带受害者重置 token 的重置链接:

POST /password-reset HTTP/1.1 Host: attacker.tld

还测:HostX-Forwarded-Host 的优先级、IPv6 方括号(Host: [::1]:80)、尾点(Host: example.com.)、端口混淆(Host: example.com:@attacker.tld)。

Cookie / Set-Cookie 操纵:注入 Domain=.example.comPath=/ 扩大攻击者设置 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」检查同时仍用 HTTP
  • X-Real-IPClient-IPTrue-Client-IPCF-Connecting-IPForwarded(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 等价物)。

路径穿越:关键漏洞

穿越绕过:

  • 编码:单/双重 URL 编码、混合大小写、过长 UTF-8、UTF-16、路径规范化怪癖
  • 混合分隔符:Windows 上 /\\;//\\\\ 跨框架抹平差异
  • 点号技巧:....//(双点折叠)、尾点(Windows)、尾斜杠、追加有效扩展名
  • 绝对路径注入:用根路径绕过拼接
  • alias/root 错配:nginx alias 无尾斜杠配嵌套 location 时允许 ../ 逃逸;试 /static/../etc/passwd; 变体(..;)
  • 上游 vs 后端解码:代理/CDN 对 %2f 解码不同;测双重解码与编码点

LFI 包装器与技巧:

  • PHP 包装器:php://filter/convert.base64-encode/resource=index.php(读源码)、zip://archive.zip#file.txtdata://text/plain;base64expect://(启用时)
  • 日志/session 毒化:把 PHP/模板 payload 注入访问/错误日志或 session 文件后包含
  • 上传临时名:在重定位前包含临时上传文件;与扫描器竞态
  • proc 与缓存:/proc/self/environ 与框架特定缓存读取秘密
  • 遗留技巧:旧栈的 null 字节(%00)截断;路径长度截断

模板引擎:PHP include/require;Smarty/Twig/Blade 配动态模板名;Java/JSP/FreeMarker/Velocity;Node.js ejs/handlebars/pug——寻找从用户输入的动态模板解析(theme/lang/template)。

RFI 条件:

  • 远程包含(PHP 的 allow_url_include/allow_url_fopen)
  • 求值/执行获取内容的自定义抓取器
  • SSRF 到执行的桥
  • 协议处理器:http、https、ftp;语言特定流处理器
  • 利用:托管证明代码执行的最小 payload;优先 OAST 信标或确定性输出而非重 shell;远程包含禁用时链上传或日志毒化

归档解压(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-OverrideX-HTTP-Method)在框架先于基于方法的授权咨询覆盖时到达状态变更处理器;从服务端或非浏览器客户端有效(浏览器中触发 CORS 预检,故非 CSRF 原语)。

头部名游戏:针对按精确大小写键控的过滤器做大小写扰乱;头部名中的 null 字节截断(X-Forwarded-For\x00Evil)。

路径穿越的绕过

核心是「找到过滤器拒绝但文件系统/解析器接受」的表示:编码变体(双重解码、过长 UTF-8 %c0%2e、Unicode 点与斜杠)、混合分隔符、点号折叠(....//)、绝对路径注入、alias 错配、..; 变体。

💡 绕过的共性:两类漏洞的绕过都是「编码/规范化层叠」——WAF/过滤器往往只识别一种规范化形态,换一种等价表示(%0d%0a vs U+2028、../ vs %2e%2e%2f vs ....//)就能绕过。代理与后端的解码顺序差异是关键突破口。

五、验证与误报排除

头部注入的验证

  1. 展示两个不同用户(或 session)收到按键于攻击者供应头部的内容——证明缓存毒化。
  2. 捕获指向攻击者控制主机的密码重置/OAuth 链接——证明 Host 注入。
  3. 演示同一端点在有/无伪造转发头部时返回不同认证决策。
  4. 响应拆分:展示下游缓存或代理把注入的第二响应投递给无关请求。
  5. 请求走私:展示一个受害请求看到来自不同请求追加的数据(非仅时间或单发异常)。
  6. 所有发现都应产出持久产物(缓存响应、已发邮件、日志条目、session 变化)——瞬态异常不是验证。

常见误报:随输入变化但缓存键正确的头部(意图个性化、Vary 设置正确);X-Forwarded-* 被反射回但仅用于日志;浏览器拦截 Location: javascript:/Location: data:;CRLF 出现在响应头部但被外层代理在到达任何客户端或缓存前剥掉;走私指示器其实是正常流水线或 keep-alive 行为。

路径穿越的验证

  1. 展示最小穿越读证明越根访问(如 /etc/hosts),配同端点根内对照。
  2. LFI:演示包含良性本地文件或无害包装器输出(php://filter base64 的 index.php)。
  3. RFI:用 OAST 或受控输出证明远程获取;避免破坏性 payload。
  4. Zip Slip:创建含 ../ 条目的归档,展示写到目标之外(如可回读的标记文件)。
  5. 提供前后文件路径、精确请求、内容哈希/长度以便复现。

常见误报:映射不到文件系统的应用内虚拟路径(内容来自安全存储 DB/对象存储);规范化后约束到白名单/根的路径;包装器禁用且仅用常量模板的包含;净化路径并强制目标目录的解压器。

六、影响评估

头部注入的影响

  • 跨用户缓存毒化(篡改、XSS、经缓存认证响应的账户接管)
  • 经 Host 混淆密码重置/OAuth 流程的账户接管
  • 信任转发头部端点的认证绕过
  • 经 session 固定与 cookie tossing 的账户劫持
  • 钓鱼/OAuth redirect_uri 滥用的开放重定向
  • 请求走私(详见上一节)
  • 经头部名与编码技巧的 WAF/检测绕过

路径穿越/LFI/RFI 的影响

  • 敏感配置/源码泄露 → 凭据与密钥妥协
  • 经包含攻击者控制内容或覆盖模板的代码执行
  • 往服务目录投文件的持久化;经泄露秘密的横向移动
  • 报告/模板引擎执行攻击者影响文件时的供应链影响

⚠️ 路径穿越「只能读文件」常被低估——读取 .env.aws/credentials~/.ssh//proc/self/environ 即可获凭据;LFI 经日志毒化或包装器可升级到 RFI 等价的代码执行。头部注入的缓存毒化可波及同栈所有用户,影响等级常达严重。

本节要点回顾

  1. 核心心法:两类漏洞共性是「输入到达了不该到达的协议/文件层」——头部注入活在中间层(框架复制、代理信任、缓存键),路径穿越活在路径拼接与规范化边界;把每个到达头部/路径的用户可控值都按不受信对待。
  2. 头部注入六大漏洞:CRLF 响应拆分/走私、缓存毒化(未键输入 + Vary/X-Forwarded-Host/Cache-Control)、Host 混淆(密码重置/OAuth)、cookie 操纵(tossing/SameSite)、转发头部伪造(X-Forwarded-For/X-Original-URL)、Content-Type 混淆(嗅探/UTF-7)。
  3. 头部注入绕过:CR/LF 编码变体(%0d%0a/U+2028/双重编码)、头部规范化边界(折叠/重复/大小写)、方法覆盖、头部名 null 截断。
  4. 路径穿越绕过:编码(%2e%2e%2f/双重/过长 UTF-8)、混合分隔符、点号折叠(....//)、绝对路径、alias/root 错配、..; 变体。
  5. LFI 包装器:php://filter(读源码)、zip://data://expect://;日志/session 毒化;/proc/self/environ;Zip Slip(归档含 ../)。
  6. RFI 条件:allow_url_include、自定义 eval 抓取器、SSRF 到执行桥;远程禁用时链上传/日志毒化。
  7. 验证:头部注入须产出持久产物(缓存/邮件/日志/session);路径穿越须最小穿越读 + 同端点对照;警惕虚拟路径、白名单规范化、包装器禁用、X-Forwarded-* 仅日志、浏览器拦截 javascript: 的误报。
  8. 影响:头部注入从开放重定向到缓存毒化、账户接管、请求走私;路径穿越从文件泄露到凭据妥协、代码执行、持久化、供应链;两者均可达严重。

至此,第 5 章(注入与执行类漏洞)全部讲完。下一章(第 6 章)转向访问控制与客户端类漏洞——XSS、CSRF、IDOR、SSRF、JWT、业务逻辑等,它们与本章共享「输入到达解释器/边界」的根因,但攻击对象与利用形态不同。


发布者: 作者: 灏天文库 转发
评论区 (0)
U