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>
    

攻击条件

  1. 用户输入未被严格过滤,且被直接拼接到HTTP响应头中(如LocationSet-Cookie等)。
  2. 输入中包含\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. 防御措施

  1. 输入验证:严格过滤用户输入中的\r\n等控制字符。
  2. 编码输出:在将输入拼接到响应头前,对特殊字符进行编码或转义。
  3. 使用安全API:避免手动拼接HTTP响应,使用标准库(如HttpServletResponse.setHeader())自动处理分隔符。
  4. 设置字符白名单:对重定向URL等参数,只允许字母、数字和有限符号(如/-.)。

6. 实际案例

早期Apache Tomcat的CVE-2005-1080漏洞允许通过%0a注入响应头,导致XSS攻击。现代框架(如Spring、Django)已内置防护机制,但自定义HTTP处理代码仍需警惕此类漏洞。

通过理解HTTP协议规范与输入验证的重要性,可有效防范响应头拆分攻击。

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