(OWASP汉化)攻击系列大全(三十四): HTTP响应拆分攻击

最新版本 (mm/dd/yy): 06/29/2016

翻译自HTTP Response Splitting

概述

HTTP 响应拆分(HTTP Response Splitting)攻击发生在:

  • 数据通过一个不可信的源进入web应用程序,最常见的是HTTP请求
  • 这些数据包含在发送给web用户的HTTP响应头中,而没有对恶意字符进行验证。

HTTP响应拆分攻击是达到目的的一种手段,而不是目的本身。在其根源上,攻击是简单直接的:攻击者将恶意数据传递给脆弱的应用程序,应用程序包含HTTP响应头中的数据。

为了成功地开发,应用程序必须允许内容包含CR(回车,或由 %0d ,\r表示的回车 )和LF(换行,或由 %0a ,\n表示的换行 )这些字符的输入进入头部,而底层平台很容易受到这些字符的注入。这些字符不仅可以让攻击者控制应用程序想要发送的响应的其余头部和主体,还允许他们在自己的控制下创建额外的响应。

下面的例子使用了一个Java示例,但是这个问题已经在几乎所有现代Java EE应用服务器中得到了解决。如果您担心这种风险,您应该在关注的平台上进行测试,看看底层平台是否允许将CR或LF字符注入头。我们怀疑,一般来说,这种漏洞在大多数现代应用服务器中都是固定的,不管代码是用什么语言编写的。

实例

下面的代码段从HTTP请求中读取网络日志条目的作者姓名,并将其设置为HTTP响应的cookie头。

String author = request.getParameter(AUTHOR_PARAM);
...
Cookie cookie = new Cookie("author", author);
cookie.setMaxAge(cookieExpiration);
response.addCookie(cookie);

假设一个由标准的字母数字字符组成的字符串,如“Jane Smith”,在请求中提交,包括这个cookie在内的HTTP响应可能采用以下形式:

HTTP/1.1 200 OK
...
Set-Cookie: author=Jane Smith
...

但是,由于cookie的值由未验证的用户输入构成的,因此如果为AUTHOR_PARAM提交的值不包含任何CR和LF字符,则响应将仅维持此表单。 如果攻击者提交恶意字符串,例如“Wiley Hacker \ r \ n Content-Length:45 \ r \ n \ r \ n …”,那么HTTP响应将被分割成冒牌响应,然后原始响应被忽略掉:

HTTP/1.1 200 OK
...
Set-Cookie: author=Wiley Hacker
Content-Length: 999

malicious content... (to 999th character in this example)
Original content starting with character 1000, which is now ignored by the web browser...

攻击者任意构造HTTP响应的能力允许制造各种各样的攻击,包括:跨用户污损(Cross-User Defacement),缓存中毒(Cache Poisoning),跨站点脚本(XSS) 和页面劫持(Page Hijacking)。