为什么这种响应分裂攻击不起作用?

信息安全 Web应用程序 http http代理 响应分裂 网山羊
2021-08-27 16:17:25

我正在研究 OWASP 的“WebGoat”(5.4 版)易受攻击的 Web 应用程序,但我陷入了与 HTTP 响应拆分有关的最早课程之一。

我已经查看了所有提示和解决方案(甚至所有关于互联网的教程),但我仍然无法让它工作。

我什至完全修改了我的网络服务器对以下内容的响应:

HTTP/1.1 302 Moved Temporarily
Server: Apache-Coyote/1.1
Location: http://localhost/WebGoat/attack?Screen=3&menu=100&fromRedirect=yes&language=en
Content-Length: 0

HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 19
<html>Graeme</html>
Content-Type: text/html;charset=ISO-8859-1
Content-length: 0
Date: Sun, 28 Jul 2013 20:26:13 GMT

我相当有信心这应该让我的浏览器显示“Grezzo”,但它遵循的是第一个响应而不是第二个响应。我什至尝试取出第一个“Content-Length:0”行,但这没有什么区别。

这里发生了什么?我错过了什么吗?也许现代网络浏览器这些天总是遵循第一个响应?

4个回答

最常被忽略的 HTTP 响应拆分 (HRS) 的基本部分是代理。

HRS 不是网络服务器和浏览器之间的攻击,甚至不是浏览器和网络服务器之间的攻击。
攻击针对的是半兼容 HTTP 设备的特性,即 Web 服务器和 Web 代理。
具体来说,攻击利用了这样一个事实:网络服务器看到一组响应(一个响应),而代理看到另一组响应(两个响应),代理将一个请求拆分给受害者,将另一个请求拆分给攻击者(或乙醚)。

因此,为了最好地测试这种攻击,您需要设置:

  1. 网络服务器
  2. 代理人
  3. 受害者浏览器
  4. 攻击者客户端(或浏览器)

我假设你错过了代理部分......

只需确保使用回车即可。PHP Charset Encoder 仅编码 in %0A,但它应该是%0D%0A在响应中获取换行符。只有这样做了,响应才会被解释为HTTP 200 OK(或任何你想要的)。

我也在这里卡了一段时间。事实证明,我们的 WebGoat 是 Linux 版本。Linux 只使用 LF,所以在对参数进行编码时,只使用 %0a,而不是 %0d%0a。

我不是黑客),但我认为这种攻击是依赖于服务器的。因此,当服务器错误地处理请求(或错误地处理响应)时,您的攻击是成功的。

Broswer 总是处理第一个响应(旧的浏览器也处理第一个响应)。

但是,当服务器将一些变量放入其中一个标头(例如:Cookie)时,这种攻击总是有效的。 简单示例:客户端加载具有文本区域和按钮以提交请求的页面。当服务器处理请求时,它将变量从 Textarea 放入 cookie(永远不要这样做)。所以客户端可以在 textarea 上写这个字符串:

some data to cookies
Content-Type: text/html
Content-Length: 16

<H1>Hacked</H1>

因此,当服务器将此字符串放入 cookie 时,来自服务器的答案将如下所示:

Connection:keep-alive
Content-Type:this server content-type (for example: application/json)
Set-Cookie:qqq="some data to cookies
Content-Length:16  -  your length
Content-Type:text/html - your content type 

<H1>Hacked</H1>

这不是服务器错误,这是编写网站的程序员的错误。