如果用户控制的数据以不安全的方式插入到应用程序返回的HTTP消息头中,就会出现HTTP消息头注入漏洞。如果攻击者能够在他控制的消息头中注入换行符,他就能在响应中插入其他HTTP消息头,并在响应主体中写入任意内容。
这种漏洞最常见于Location与Set-Cookie消息头中,但也会出现在其他HTTP消息头中。前文已经讲到,应用程序提取用户提交的输入,并将它插入到响应码为3xx的Location消息头中。同样,一些应用程序提取用户提交的输入,把它插入一个 cookie 值中。例如:
在上述任何一种情况下,攻击者都可以使用回车符(0x0d)或换行符(0x0a)构造一个专门设计的请求,在他们控制的消息头中注入一个换行符,从而在下面的行中注入其他数据。例如:
12.3.1 利用消息头注入漏洞
查找消息头注入漏洞的方法与查找XSS漏洞的方法类似,同样需要寻找用户控制的输入重复出现在应用程序返回的HTTP消息头中的情况。因此,在探查应用程序是否存在XSS漏洞的过程中,还应当确定任何应用程序可能易于受到消息头注入的位置。
如果能够在响应中注入任意消息头和消息主体内容,那么这种行为可通过各种方式用于攻击应用程序的其他用户。
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) 代理服务器收到这两个看似单独的响应,并认为其中第二个响应与攻击者的第二个请求相对应,该请求指向URL:http://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,应用程序即可防止攻击者利用任何残留的消息头注入漏洞“毒害”代理服务器缓存。
|
2013年5月30日星期四
12.3 HTTP消息头注入
订阅:
博文评论 (Atom)
没有评论:
发表评论