2013年5月30日星期四

12.3 HTTP消息头注入




如果用户控制的数据以不安全的方式插入到应用程序返回的HTTP消息头中,就会出现HTTP消息头注入漏洞。如果攻击者能够在他控制的消息头中注入换行符,他就能在响应中插入其他HTTP消息头,并在响应主体中写入任意内容。
这种漏洞最常见于LocationSet-Cookie消息头中但也会出现在其他HTTP消息头中。前文已经讲到,应用程序提取用户提交的输入,并将它插入到响应码为3xxLocation消息头中。同样,一些应用程序提取用户提交的输入,把它插入一个 cookie 值中。例如
在上述任何一种情况下,攻击者都可以使用回车符0x0d或换行符0x0a构造一个专门设计的请求,在他们控制的消息头中注入一个换行符,从而在下面的行中注入其他数据。例如
12.3.1 利用消息头注入漏洞
查找消息头注入漏洞的方法与查找XSS漏洞的方法类似,同样需要寻找用户控制的输入重复出现在应用程序返回的HTTP消息头中的情况。因此,在探查应用程序是否存在XSS漏洞的过程中,还应当确定任何应用程序可能易于受到消息头注入的位置。

渗透测试步骤
q   在用户控制的输入被复制到HTTP消息头中的每个位置都可能存在漏洞,确认应用程序是否接受URL编码的回车符(%0d)与换行符(%0a),以及它们是否按原样在响应中返回。
q   注意,是在服务器的响应中而不是换行符的URL编码形式中寻找换行符本身。如果通过拦截代理服务器查看响应,攻击成功的话,应该会在HTTP消息头中看到另外一个新行。
q   如果服务器的响应中仅返回两个换行符中的一个,根据实际情况,仍然能够设计出有效的攻击方法。
q   如果发现换行符被应用程序阻止或净化,那么应该尝试以下攻击方法:
如果能够在响应中注入任意消息头和消息主体内容,那么这种行为可通过各种方式用于攻击应用程序的其他用户。
1. 注入cookie
攻击者可以建立一个URL在请求它的任何用户的浏览器中设定任意cooike。例如
如果进行适当配置,这些cookie可以访问不同的浏览器会话。这时,通过前面利用反射型XSS漏洞时使用的相同传送机制(电子邮件、第三方Web站点等),就可以诱使目标用户访问恶意URL
在某些应用程序中设置一个特殊的cookie可能会破坏应用程序的逻辑给用户造成不利影响例如UseHttps=false而且,建立一个攻击者控制的会话令牌可用于实施会话固定攻击(将在本章后面描述)。
2. 传送其他攻击
因为HTTP消息头注入允许攻击者控制整个响应主体,所以几乎任何针对其他用户的攻击都可以使用它作为传送机制,包括虚拟Web站点置换、脚本注入、任意重定向、针对 ActiveX 控件的攻击等。
3. HTTP响应分割
这 是一种试图通过恶意内容“毒害”代理服务器缓存,从而攻破通过代理服务器访问应用程序的其他用户的攻击技巧。例如,如果一个企业网络中的所有用户通过缓存 代理服务器访问某个应用程序,那么,在代理服务器的缓存中注入恶意内容(显示给任何请求受影响页面的用户),攻击者就可以向它们实施攻击。
攻击者可以通过以下步骤,利用一个消息头注入漏洞传送响应分割攻击。
(1) 攻击者在代理服务器缓存中选择一个他希望“毒害”的应用程序页面。例如,他可能会用一个木马登录表单(用于向攻击者的服务器提交用户证书)代替/admin/位置的页面。
(2) 攻击者确定一个消息头注入漏洞,构造一个请求,在服务器响应中注入一个完整的HTTP主体以及另一组响应消息头和另一个响应主体。第二个响应主体中包含他的木马登录表单的HTML源代码。这样,服务器的响应看起来就像是两个连接在一起的单独HTTP响应。因此这种技巧叫做HTTP响应分割HTTP response splitting),因为攻击者已经把服务器的响应分割成两个单独的响应。例如
(3) 攻击者与代理服务器建立 TCP 连接,传送这个精心设计的请求,后面紧跟着访问被“毒害”的页面的请求。在HTTP协议中,以这种方式连接请求是合法的。
(4) 代理服务器与应用程序建立 TCP 连接,送出这两个以相同方式连接的请求。
(5) 应用程序用攻击者注入的HTTP内容响应第一个请求,它看起来就像是两个单独的HTTP响应。
(6) 代理服务器收到这两个看似单独的响应,并认为其中第二个响应与攻击者的第二个请求相对应,该请求指向URLhttp://wahh-app/admin/。代理服务器把第二个响应作为这个URL的内容保存在缓存中。(如果代理服务器已经在缓存中保存有该页面的副本,那么攻击者就可以在他的第二个请求中插入一个适当的If-Modified-Since消息头,并在注入的响应中插入一个Last-Modified消息头,使得代理服务器重新请求这个URL,用新的内容更新它的缓存。)
(7) 应用程序发布它对攻击者的第二个请求的响应,其中包含URLhttp://wahh-app.com/admin/ 的真实内容。代理服务器并不认为这个URL是对它发布的请求的响应,因而抛弃这个响应。
(8) 一名用户通过代理服务器访问 http://wahh-app/admin/,并收到这个URL保存在代理服务器缓存中的内容。这个内容实际上是攻击者的木马登录表单,因此用户的证书被攻破。
12.3.2 防止消息头注入漏洞
防止HTTP消息头注入漏洞的最有效方法是,不将用户控制的输入插入到应用程序返回的HTTP消息头中。通常我们可以用一些较为安全的方法代替这种行为。
如果不可避免地要在HTTP消息头中插入用户控制的数据,那么应用程序应采取以下这种双重深层防御方法防止漏洞产生。
q   输入确认。应用程序应根据情形,对插入的数据进行尽可能严格的确认。例如,如果根据用户输入设定一个cookie值,那么应当限制这个值仅包含字母字符,最大长度为6B
q   输出确认。应对插入消息头的每一个数据进行过滤,检测可能的恶意字符。实际上,任何ASCII码小于0x20的字符都应被视为可疑的恶意字符,应用程序应拒绝包含这些字符的请求。
通过对所有应用程序内容使用 HTTPS,应用程序即可防止攻击者利用任何残留的消息头注入漏洞“毒害”代理服务器缓存。

没有评论:

发表评论