不一样的SRC挖洞思路: HTTP请求拆分漏洞实战
字数 1408 2025-08-19 12:40:55
HTTP请求拆分与走私漏洞实战教学文档
1. 漏洞概述
HTTP请求拆分(HTTP Request Splitting)和HTTP请求走私(HTTP Request Smuggling)是两种密切相关的Web安全漏洞,它们利用HTTP协议解析的差异性,通过精心构造的恶意请求来破坏请求处理流程。
1.1 核心概念
- HTTP请求拆分:通过注入CRLF(回车换行)字符,将一个HTTP请求拆分成多个请求
- HTTP请求走私:利用前后端服务器对HTTP请求解析的差异,将恶意请求"走私"到后端
1.2 国内现状
- 普遍认为国内难以挖掘这类漏洞
- 实际案例较少,主要来自国外
- 作者证实国内存在这类漏洞,并已通过挖掘获得超过10万元赏金
2. 漏洞原理
2.1 CRLF注入
CRLF(回车换行,即\r\n)是HTTP协议中用于分隔头部和正文的标准分隔符。攻击者通过注入这些控制字符,可以:
- 提前结束当前请求
- 插入额外的请求头
- 创建全新的请求
2.2 请求处理流程差异
漏洞通常出现在多层代理架构中,当不同层级的服务器对请求的解析不一致时:
客户端 --> 反向代理1 --> 反向代理2 --> 后端服务器
2.3 案例中的架构分析
作者发现的案例架构如下:
client ----> 反向代理1 --CRLF--> 反向代理2 --Host--> (web server1 | web server2 | web server3 | ...)
关键特点:
- 反向代理1和反向代理2之间支持HTTP流水线(pipeline)
- 反向代理2根据Host头将请求路由到不同的后端服务器
3. 漏洞利用技术
3.1 基本利用方法
通过URL编码的CRLF字符构造恶意请求:
https://case.target.cn/%20HTTP/1.1%0d%0aHost:case.target.cn%0d%0a%0d%0aPOST%20/%3fid=%20HTTP/1.1%0d%0aHost:targ
解码后相当于:
GET / HTTP/1.1\r\n
Host: case.target.cn\r\n
\r\n
POST /?id= HTTP/1.1\r\n
Host: targ...
3.2 多层代理的利用
- 反向代理1将恶意请求转发给反向代理2
- 反向代理2将CRLF注入的请求解析为两个独立请求
- 第二个请求可能被路由到不同的后端服务器
3.3 响应处理特性
- 反向代理1会将多个响应合并为一个返回给客户端
- 这使得攻击者可以获取到原本无法直接访问的后端响应
4. 漏洞挖掘方法
4.1 测试流程
- 寻找CRLF注入点:测试所有用户可控的输入点
- 验证注入是否会影响请求解析
- 尝试构造能产生两个有效请求的payload
- 观察响应是否包含多个请求的结果
4.2 测试要点
- 测试不同位置的可控输入:URL路径、参数、头部等
- 尝试不同的编码方式:URL编码、Unicode编码等
- 观察服务器对畸形请求的处理行为
5. 防御措施
5.1 开发层面
- 严格验证用户输入,过滤CRLF等特殊字符
- 使用标准库进行HTTP协议解析
- 禁用HTTP流水线(pipeline)支持
5.2 配置层面
- 统一所有代理服务器的HTTP解析配置
- 限制请求行和头部的最大长度
- 使用最新版本的代理软件
5.3 监控层面
- 监控异常的HTTP请求格式
- 记录并分析包含特殊字符的请求
- 设置针对连续CRLF的告警规则
6. 实战技巧
6.1 目标识别
- 多层代理架构的系统风险更高
- 使用不同技术栈的代理组合更容易出现解析差异
- 支持HTTP/1.1流水线的系统更易受攻击
6.2 漏洞验证
- 先尝试简单的CRLF注入测试响应变化
- 逐步增加复杂的请求构造
- 使用时间延迟技术判断请求是否被拆分
6.3 利用扩展
- 尝试绕过身份验证
- 尝试访问内部API
- 尝试缓存投毒(Web Cache Poisoning)
7. 总结
HTTP请求拆分和走私漏洞在国内确实存在,且危害严重。通过理解多层代理架构中的请求处理流程差异,安全研究人员可以有效地挖掘这类漏洞。防御方面需要开发、运维和安全团队的协同努力,从输入验证、协议解析到系统监控多个层面进行防护。