浅谈HTTP响应拆分攻击(一)

简介:
在本文中,我们将探讨何谓HTTP响应拆分以及攻击行为是怎样进行的。一旦彻底理解了其发生原理(该原理往往被人所误解),我们就可以探究如何利用响应拆分执行跨站点脚本(简称XSS)。接下来自然就是讨论如果目标网站存在响应拆分漏洞,我们要如何利用这一机会组织CSRF(即跨站点伪造请求)攻击。最后,我们一起来看看哪些预防措施能够抵御这些攻击行为。如果大家对这个话题感兴趣,不妨继续读下去。什么是HTTP响应拆分? 
首先让我们设想一下某个具备多种语言选项的页面。该页面的默认语言为英语,但其中同时具备一个下拉菜单,允许我们在选定其中对应的其它语种后,整个页面的语言也同时发生切换。比方说根据初始页面的配置,302重新指向的结果为 http://www.abc.com/index.php?lang=en 。但对于来自德国的用户而言,当然希望页面内容以德语呈现,这时他们就可以从下拉菜单的备用语言中进行选择。这使得302重新指向将被发往服务器上的德语页面—— http://www.abc.com/index.php?lang=german 。用户的浏览器会遵循重新指向的引导,并将德语页面正常呈现出来。 
现在让我们思考一下HTTP 302重新指向响应的主体内容。内容大体如下: 
HTTP/1.1 302 Moved Temporarily 
Location:  http://www.abc.com/index.php?lang=en
或者是: 
HTTP/1.1 302 Moved Temporarily 
Location:  http://www.abc.com/index.php?lang=german
大家可能已经发现了,惟一产生变化的只有lang参数的值。也就是说,这个值是由用户所控制,我们可以将该值设置为任何想要的内容。正是这种特性导致了HTTP响应拆分攻击的发生。 
此时我们不再把参数值设定为"german",而是按照下列内容进行设定: 
a) The value 'german' 
b) CR/LF - %0d%0a 
c) A response with Content Length 0 [这里之所以设长度为0,是因为这一段其实无关紧要] 
d) CR/LF - %0d%0a 
e) A response which contains malicious content [举例来说,可以设定JavaScript会在页面被访问时自动下载恶意软件] 
先来看看c)的内容--这也是首个响应。HTTP协议的工作方式是一个请求对应一个响应,因此针对该请求——即 http://www.abc.com/index.php?lang=german 的响应是经过精心设计的。其实我们并不关心这个响应本身及其内容,我们想要的只是将Content-Length: 0设为其响应头。 
CR/LF(即回车换行符)是响应之间的分界符。所以只要我们如d)中所示加入CR/LF内容,那么第二轮响应即会启动,且根据HTTP协议的规定这是完全正常的。在新一轮响应中我们可以添加大量信息。举例来说,如果我们打算显示一条"Hello, you have been phished"(意为'你好,你已然中招了')的消息,此时面前已经完全没有任何阻碍了。只需输入如下所示的内容,即可轻松实现: 
HTTP/1.1 200 OK 
Content-Type: text/html 
Content-Length: 41 
Hello, you have been phished 
还是觉得有点迷糊?让我们再总结一次。攻击者控制参数并发送一个将产生两次响应的请求;这两次响应都由攻击者组织,并以服务器为目标。首个响应旨在回应将页面转化为德语的请求,而第二个响应(到目前为止)还未经解释,它只是暂时挂起--因为该响应还没有能够映射的对应请求。请记住,HTTP需要响应(无论内容代码是什么),但它需要的是一个能对应所有请求的响应。因此挂起中的HTTP响应是无法工作的。 
现在请仔细阅读…因为这部分正是大多数人(连我自己在很长一段时间内也是如此)没有搞清楚的内容。为了处理第二个挂起中的响应,攻击者会迅速对服务器上的页面发送一条有效的公开访问(通常是这样)请求,比如说branches.html。 
这里假设他发送的请求为: 
GET /branches.html HTTP/1.1 
Host:  www.abc.com
就在发出首个包含"可完全自定内容"参数的请求之后,他会旋即发出上述第二条请求,而这也正是"Hello, you have been phished"字段的映射对象。两条请求对应两次响应,大家明白了吗? 
哈哈,恐怕各位还是有些困惑。尽管大家可能已经了解整个映射的发生过程,但仍然没闹明白这种攻击是如何影响其他人的。毕竟,攻击者的这一切行动都发生在他自己的计算机上,所修改的请求也只限于他个人…也就是说,会受影响的只有他自己。说实话,为什么攻击者要对自身展开攻势?这似乎毫无道理可言啊。不过我要指出的是,这对位于中间帧及缓存中的代理服务器或者某些设备而言,可以说是接纳请求及响应的关键性一环。 
攻击者必须躲在代理服务器之后,并借助代理将他的请求发送到互联网上的目标服务器处。如果他想感染其它用户,这些被害用户也必须处于同样的代理服务器之后。因此,让我们再来总结一次(请保持耐性…) 
a)攻击者发送一条包含一个值及两次响应的请求,使用%0d%0a进行分隔。在本文的例子中,请求的内容如下: 
http://www.abc.com/index.php?lang=german%0d%0aContent - Length:%200%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%2041%0d%0aHello, you have been phished 
b)该请求的发送目的地为 www.abc.com …不过重要的是,它是通过中间代理服务器进行传递的。因此现在在代理服务器上,第一个请求被映射在第一次响应上,而第二次响应则由于没有能够匹配的请求而处于挂起状态。 
c)在首个请求发出后,攻击者会立即向目标网站(同样通过代理服务器)发出新请求(第二个请求),内容如下: 
GET /branches.html HTTP/1.1 
Host:  www.abc.com
d)代理服务器会在收到branches.html后,第一时间将其映射至第二次响应中(即'You have been phished ')。因此接下来发往branches.html的请求将不再显示银行的分支机构名单,而是指向恶意网页。没错,对于每位访问者毕竟是如此,而不仅仅针对攻击者。为什么会这样?因为这正是缓存代理服务器的处理方式…常发请求缓存响应。也就是说,如果某个发往branches.html的请求始终产生同一份关于银行支行信息的静态列表,那么代理服务器几乎肯定会调用缓存对该请求进行响应。换言之,下一次指向branches.html的请求将自动返回来自缓存的响应。而在攻击者的安排下,代理服务器的缓存内容遭受感染,并被迫返回恶意响应而非原本的静态列表……这种状况将持续下去直到缓存过期。 

希望经过上面的详细介绍,大家会对HTTP响应拆分有一个明确的概念。这里是文章的重中之重,所以不妨多读几遍。关键在于,攻击者发出的第二条请求会迫使代理服务器遵从第二条请求对应第二次响应的映射模式。一旦理解了这一点,整个概念应该就比较清晰了。


本文转自    geekwolf   51CTO博客,原文链接:http://blog.51cto.com/linuxgeek/998970


相关文章
|
2月前
Servlet 教程 之 Servlet 服务器 HTTP 响应 2
Servlet教程讲解了如何通过HttpServletResponse设置HTTP响应,包括编码URL、添加cookie、设置报头、控制缓冲区、发送错误或重定向响应。方法如encodeURL、addCookie、sendError、sendRedirect等,涉及状态码、报头、字符编码和内容长度的管理。
32 2
|
2月前
|
XML Java 数据格式
Servlet 教程 之 Servlet 服务器 HTTP 响应 3
`Servlet`教程示例展示了如何创建一个HTTP响应,使用`@WebServlet("/Refresh")`的`Refresh`类继承`HttpServlet`。在`doGet`方法中,设置了`Refresh`头以每5秒自动刷新,并用`setContentType("text/html;charset=UTF-8")`设定内容类型。还使用`Calendar`和`SimpleDateFormat`获取并格式化当前时间显示。相应的`web.xml`配置指定了Servlet路径。当访问此Servlet时,页面将每5秒更新一次显示的系统时间。
37 4
|
2月前
状态码对于理解HTTP请求和响应的流程,以及调试网络问题非常重要
【5月更文挑战第15天】HTTP状态码由三位数字表示,分为1xx-5xx五类。1xx为信息响应,2xx表示成功,如200(请求成功)、201(创建成功)。3xx是重定向,如301(永久移动)、302(临时重定向)。4xx表示客户端错误,如400(坏请求)、404(未找到)。5xx是服务器错误,包括500(内部服务器错误)和503(服务不可用)。这些状态码用于理解请求响应流程和调试网络问题。
33 1
|
8天前
|
Shell Python
`pytest-httpserver`是一个pytest插件,它允许你在测试期间启动一个轻量级的HTTP服务器,并模拟HTTP请求和响应。
`pytest-httpserver`是一个pytest插件,它允许你在测试期间启动一个轻量级的HTTP服务器,并模拟HTTP请求和响应。
|
10天前
|
JSON 网络协议 数据格式
网络协议基础:HTTP请求与响应详解
【7月更文挑战第11天】HTTP协议作为Web通信的核心,其请求与响应机制是理解网络通信的关键。本文详细介绍了HTTP请求与响应的格式、过程以及常用的请求方法,帮助读者更好地理解HTTP协议的工作原理和应用场景。在实际应用中,HTTP协议的可定制性和灵活性使其能够适应多种
|
27天前
|
XML 开发框架 前端开发
http请求响应的contentType
http请求响应的contentType
25 5
|
28天前
|
缓存
HTTP响应首部字段释义
【6月更文挑战第23天】响应首部字段是由服务器端向客户端返回响应报文中所使用的字段。
|
1月前
|
XML JSON 前端开发
HTTP 请求参数与响应参数的关键区别
在 Web 的开发领域,无论你是前端开发还是后端开发人员,把握请求与响应参数的核心差异是极其重要的。这些参数在客户端和服务器之间的互动中扮演着关键角色。
|
2月前
|
存储 缓存
ETag的值是如何在HTTP响应中传递给客户端的
ETag的值是如何在HTTP响应中传递给客户端的
|
2月前
|
JSON JavaScript 中间件
使用 Node.js 开发一个简单的 web 服务器响应 HTTP get 请求
使用 Node.js 开发一个简单的 web 服务器响应 HTTP get 请求