redirect_comment_link函数中的HTTP响应拆分漏洞 2012-10-05 wordpress 12 条评论 13448 次阅读 没事儿用360检查了一下自己的网站,居然发现有很大的漏洞,汗啊。对于这方面不太懂,查了一下,据说“HTTP响应拆分漏洞”还挺严重的。查找了一下资料修补了一下这个漏洞。 漏洞主要是在redirect_comment_link这个函数中,想来很多朋友在function中加入了这个函数来使链接跳转。不知道这个漏洞是否真的能起到作用,不过还是按照网上说的,把它修复吧。 在此特别提醒wordpress中添加了这个函数的童鞋,赶紧加上过滤吧。还有用d4主题(改动的文件在inc\function-opt.php)的朋友哦,也要注意咯,虽然不懂这个漏洞怎么用,但是防患于未然。 解决方法如下: 在function.php中查找 `$redirect = $_GET['r'];` 在下面加上 ```php $redirect = trim(str_replace("\r","",str_replace("\r\n","",strip_tags(str_replace("'","",str_replace("\n", "", str_replace(" ","",str_replace("\t","",trim($redirect))))),"")))); ``` 这一句。 还可以参考如下资料: 转载(一) http://www.huangkeye.com/?page=传递的参数。 于是,我赶紧查看了一下这个插件。在它的一个页面里面我看到了两行代码: `$post = $_GET['p'];、$download = $_GET['download'];` 对参数$post和$download运用PHP语法中的正则表达式ereg_replace或者字符串处理函数str_replace进行操作。代码如下: ```php $post = trim($post); $post = strip_tags($post,""); //清除HTML如等代码 $post = ereg_replace("\t","",$post); //去掉制表符号 $post = ereg_replace("\r\n","",$post); //去掉回车换行符号 $post = ereg_replace("\r","",$post); //去掉回车 $post = ereg_replace("\n","",$post); //去掉换行 $post = ereg_replace(" ","",$post); //去掉空格 $post = ereg_replace("'","",$post); //去掉单引号 ``` 或者 ```php $post = trim($post); $post = strip_tags($post,""); //清除HTML如等代码 $post = str_replace("\n", "", str_replace(" ", "", $post));//去掉空格和换行 $post = str_replace("\t","",$post); //去掉制表符号 $post = str_replace("\r\n","",$post); //去掉回车换行符号 $post = str_replace("\r","",$post); //去掉回车 $post = str_replace("'","",$post); //去掉单引号 $post = trim($post); ``` 转自http://www.huangkeye.com/archives/20.html 转载(二) 一:前言 “HTTP响应头拆分漏洞”是一种新型的web攻击方案,它重新产生了很多安全漏洞包括:web缓存感染、用户信息涂改、窃取敏感用户页面、跨站脚本漏洞。这项攻击方案,包括其衍生的一系列技术产生,是由于web应用程序没有对用户的提交进行严格过滤,导致非法用户可以提交一些恶意字符,更具体来说,是对用户输入的CR 和LF字符没有进行严格的过滤。 “HTTP响应头拆分漏洞”及其相关的攻击手段可以在很多的web环境中实现,包括微软的asp、asp.net,IBM WebSphere,BEA WebLogic,Jakarta Tomcat,Macromedia oldFusion/MX,Sun Microsystems SunONE;流行的Squid和Apache服务器;流行的微软IE6.0浏览器。我不是在吹牛,很多大的站点都存在这样的漏洞,这让我大吃一惊。 这篇文章将描述攻击的概念并且提供一些使用实例分析。 二:介绍 在HTTP响应头拆分攻击中具体牵涉到三个对象: 漏洞服务器:即存在漏洞的服务器。 攻击工具:比如浏览器,类似IE6.0。 攻击者:发动攻击的人。 HTTP响应头拆分攻击本质是:攻击者可以发送一个或几个HTTP指令迫使漏洞服务器产生一个攻击者构想好的输出。它可以让服务器误把几条HTTP请求看成一次完成的HTTP请求来解释。第一条请求也许攻击者部分控制着一部分,但这并不是危险的;危险的是,攻击者完全控制着第二条HTTP请求,即从HTTP状态行一直到HTTP请求的尾部。如果这样可行,攻击者就会发送多个请求指令到目标系统:第一条使得服务器完全接受两个HTTP响应,第二条响应通常是在服务器上请求一些非法资源,而服务器将会自动匹配到第二条响应,输出攻击者想要请求的资源,从而达到攻击者的目的。 通过这个思路,我们可以构造出形形色色的攻击,具体来说: 1 跨站脚本攻击(XSS):这是一个非常普通和老式的漏洞,它可以让用户通过运行了一段javascript或者html代码后,可以截取该用户的cookie和session。但是到现在,通过一些重定向脚本发起一次XSS攻击是很困难的,尤其是当用户使用最新补丁的IE浏览器的时候,除非位置头是完全控制的。但是当结合HTTP响应头攻击确是可以非常简单实现,即使只是部分控制位置头。 2 web缓存中毒(我们称之为web损耗):这是一个新的攻击技术,攻击者强迫服务器高速缓存中记录了第二次HTTP请求,而服务器中的高速缓存记录的第二次请求是经过攻击者精心构造的。这将成功的对目标站点进行损耗,当其他人访问目标站点时,他们仅仅读取了高速缓存里的数据,造成站点被“黑”的假象。当然,除了站点损耗之外,攻击者也可以偷取用户的session和cookie。 3 通过对用户的攻击:这是第二种方式的一个特殊情况。它对单个用户的欺骗、对服务器单个页面的损耗,和暂时的磨损,也可以偷取到特定用户的session和cookie。 4 劫持具体用户的页面敏感信息:攻击者欺骗服务器,并取得敏感用户的权限,并进入其用户的状态,访问到一些秘密信息。 5 浏览器高速缓存中毒:这也是一项最新的攻击方式,它这和跨站脚本攻击方式有点类似,唯一的差别就是攻击者强迫浏览器高速缓存中记录一个长和持续的磨损的网页,直到浏览器的高速缓存已经清洁。 对于这些我将在后面一一作介绍。 三:web高速缓存中毒的实现 由于这是一个新兴的技术,所以这个段落我将对web高速缓存中毒的实现做进一步的分析。 1 毒害反向代理高速缓存:即电子涂写。在这种方式中,攻击者将直接面向网站。当然最厉害的手法是磨损该网站的首页,这样所有客户端将都受到影响,这也是最漂亮的手段,但是这样很容易被发现。 2 毒害一台中间高速缓存服务器:迂回。这种方式被发现是很困难的,中间缓存服务器是有很多的,而且漏洞服务器不可能占有所有的中间缓存服务器,这些服务器很有可能不是在同一个地方,比如我们攻击台湾的站点,我们很有可能会先攻击一台位于美国的中间缓存服务器,即使被调查到了也是要很久的,也许我们早就有时间把所有的信息给清除。 3 毒害浏览器高速缓存:一针见血。攻击者很有可能会瞄准到一个特殊用户,例如从一个很富有的用户那里偷取到证书,这样的攻击将会变得很独特而且很难实施。因为,它不同于跨站脚本攻击,而且被毒害的页面要始终保持在高速缓存中以等待受害者(即你所瞄准的用户)来装载,有时候受害者从来都不会登陆到那个页面,或者是受害者浏览器禁止了JAVA脚本的执行等等,都会造成无法成功。 四:HTTP响应头漏洞攻击基本技术。 HTTP响应头攻击把代码嵌入到用户信息中并放在HTTP头部,也发生在把用户信息和代码嵌入到重定向到的URL中,或者把脚本嵌入到cookie值或者name里。在第一条响应中,重定向的URL是HTTP响应头的一部分,第二条响应是确定cookie,cookie中的name/value是响应头中set-cookie的一部分。 由于攻击的特殊性,在实现攻击前,我们先来了解一下这两个字符的编码: ```php CR = %0d = /r LF = %0a = /n 比如,我们考虑以下jsp页面(/isno.jsp),内容如下: <% response.sendRedirect("/isno.jsp?lang="+request.getParameter("lang")); %> ``` 假如使得parmeter lang=ivory,程序将会重定向到/isno.jsp?lang=ivory。通常一个标准的HTTP请求会如下: ```php HTTP/1.1 302 Moved Temporarily/r/n Date: Wed, 1 Mar 2005 12:53:28 GMT/r/n Location: http://192.168.0.1/isno.jsp?lang=ivory/r/n Server: WebLogic XMLX Module 8.1 SP1 Fri Jun 20 23:06:40 PDT 2003 271009 with/r/n Content-Type: text/html/r/n Set-Cookie: JSESSIONID=1pMRZOiOQzZiE6Y6iivsREg82pq9Bo1ape7h4YoHZ62RXjApqwBE!- 1251019693; path=//r/n Connection: Close/r/n 302 Moved Temporarily/r/n /r/n This document you requested has moved temporarily./r/n It's now at http://192.168.0.1/isno.jsp?lang=ivory./r/n/r/n/r/n ``` 这样我们能清楚的看出lang所赋的值被嵌入在Location响应头中。 好,我们来实行HTTP响应头攻击,再将lang赋值,这次并不是ivory,而是给另外一个东西。 ```php /isno.jsp?lang=Allyesno%0d%0aContent-Length:%200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%2024%0d%0a%0d%0aI’m%20isno! ``` 这样的话,HTTP将会如下发送: ```php HTTP/1.1 302 Moved Temporarily/r/n Date: Wed, 1 Mar 2005 15:26:41 GMT/r/n Location: http://192.168.0.1/isno.jsp?lang=Allyesno/r/n Content-Length: 0/r/n HTTP/1.1 200 OK/r/n Content-Type: text/html/r/n Content-Length: 24/r/n I’m%20isno!/r/n Server: WebLogic XMLX Module 8.1 SP1 Fri Jun 20 23:06:40 PDT 2003 271009 with/r/n Content-Type: text/html/r/n Set-Cookie: JSESSIONID=1pwxbgHwzeaIIFyaksxqsq92Z0VULcQUcAanfK7In7IyrCST9UsS!- 1251019693; path=//r/n Connection: Close/r/n 302 Moved Temporarily/r/n /r/n This document you requested has moved temporarily./r/n It's now at http://192.168.0.1/isno.jsp?lang=Allyesno/r/n Content-Length: 0/r/n HTTP/1.1 200 OK/r/n Content-Type: text/html/r/n Content-Length: 24/r/n <html>I’m%20isno!</html>./r/n /r/n ``` 不同的地方我用颜色标识出来了,但是这里我还是作一些解释: 这里提交了两个请求,第一个指向的URL是 ```php /isno.jsp?lang=Allyesno%0d%0aContent-Length:%200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%2024%0d%0a%0d%0aI’m%20isno! ``` 第二个指向的URL是 /index.html 这样服务器会给第一个请求匹配到第一个响应: ```php HTTP/1.1 302 Moved Temporarily/r/n Date: Wed, 1 Mar 2005 15:26:41 GMT/r/n Location: http://192.168.0.1/isno.jsp?lang=Allyesno/r/n Content-Length: 0/r/n ``` 对第二个请求(/index.html)自动匹配到第二个响应: ```php HTTP/1.1 200 OK/r/n Content-Type: text/html/r/n Content-Length: 24/r/n <html>I’m%20isno!</html>./r/n