HTTP响应头拆分攻击(HTTP Response Splitting)详解
字数 991 2025-11-27 06:22:42
HTTP响应头拆分攻击(HTTP Response Splitting)详解
1. 攻击描述
HTTP响应头拆分攻击是一种利用输入验证漏洞,通过注入特殊字符(如换行符\r\n)来篡改HTTP响应头的攻击。攻击者可通过构造恶意输入,在服务器生成的HTTP响应中插入额外的响应头或拆分响应,从而实现会话劫持、缓存投毒、跨站脚本(XSS)等后续攻击。
2. 漏洞原理
关键点:HTTP响应结构
- HTTP响应由头部(Headers)和主体(Body)组成,头部与主体之间以空行(即连续的两个换行符
\r\n\r\n)分隔。 - 每个响应头以
\r\n结尾,例如:HTTP/1.1 200 OK\r\n Content-Type: text/html\r\n \r\n <html>...</html>
攻击条件
- 用户输入未被严格过滤,且被直接拼接到HTTP响应头中(如
Location、Set-Cookie等)。 - 输入中包含
\r\n(CRLF)字符,攻击者可利用其插入伪造的响应头或拆分响应。
3. 攻击步骤示例
假设某网站通过URL参数设置重定向路径:
http://example.com/redirect?url=/home
服务器返回如下响应:
HTTP/1.1 302 Found\r\n
Location: /home\r\n
\r\n
攻击者构造恶意输入:
http://example.com/redirect?url=/home%0d%0aX-Forwarded-For:%20127.0.0.1%0d%0a%0d%0a<script>alert('XSS')</script>
(注:%0d%0a是URL编码后的\r\n)
服务器响应被篡改为:
HTTP/1.1 302 Found\r\n
Location: /home\r\n
X-Forwarded-For: 127.0.0.1\r\n
\r\n
<script>alert('XSS')</script>
此时,攻击者成功插入了一个伪造的X-Forwarded-For头,并在响应体中注入XSS代码。
4. 进阶利用场景
响应拆分(Response Splitting)
通过注入两个\r\n提前结束头部,后续内容会被视为新的HTTP响应:
url=/home%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0a%0d%0a<h1>Fake Page</h1>
服务器可能返回两个响应,导致缓存投毒或客户端解析混乱。
会话劫持
通过注入Set-Cookie头覆盖用户会话:
url=/home%0d%0aSet-Cookie:%20sessionid=attacker_token%0d%0a
5. 防御措施
- 输入验证:严格过滤用户输入中的
\r\n等控制字符。 - 编码输出:在将输入拼接到响应头前,对特殊字符进行编码或转义。
- 使用安全API:避免手动拼接HTTP响应,使用标准库(如
HttpServletResponse.setHeader())自动处理分隔符。 - 设置字符白名单:对重定向URL等参数,只允许字母、数字和有限符号(如
/、-、.)。
6. 实际案例
早期Apache Tomcat的CVE-2005-1080漏洞允许通过%0a注入响应头,导致XSS攻击。现代框架(如Spring、Django)已内置防护机制,但自定义HTTP处理代码仍需警惕此类漏洞。
通过理解HTTP协议规范与输入验证的重要性,可有效防范响应头拆分攻击。