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

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

缺陷编号:wooyun-2012-012746

漏洞标题:网易微博存储型XSS 1

相关厂商:网易

漏洞作者: 心伤的胖子

提交时间:2012-09-26 16:11

修复时间:2012-11-10 16:11

公开时间:2012-11-10 16:11

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

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2012-09-26: 细节已通知厂商并且等待厂商处理中
2012-09-27: 厂商已经确认,细节仅向厂商公开
2012-10-07: 细节向核心白帽子及相关领域专家公开
2012-10-17: 细节向普通白帽子公开
2012-10-27: 细节向实习白帽子公开
2012-11-10: 细节向公众公开

简要描述:

发微博处有个地方没有进行转义处理,存在存储型XSS漏洞。

详细说明:

好吧我承认我是无意中发现的,然后才跟踪出来问题的。
1、在首页发微博,截获包然后修改。

content=test&isRetweet=0&replyOriginal=0&replyIt=0&flag=0&imageUrl=&voteUrl=bbb"><>


修改了voteUrl参数为bbb"><>,然后提交。
2、回到首页,已经发布了一条微博。但是在Burp中有一个下面这样的请求:
http://163.fm/getOriginal?callback=jQuery16109319937340915203_1348642196756&q=T7n6r0L&_=1348642200976
(这个地址是我后来抓取的,不过已经能够说明问题了)
内容为
jQuery16109319937340915203_1348642196756("bbb"><>");
这是一个jsonp的请求,但是问题来了,这个数据没有进行任何处理。并且这段代码肯定是要加载到首页作为js代码执行的,我们构造闭合callback的代码,后面再插入我们自己的js代码肯定能够在首页执行的。
3、然后在发送一条微博,voteUrl参数改为");alert(document.cookie);//,再次访问首页,发现没有弹框,也没有和之前类似的请求了。不过我们之前忽略一个问题就是,content这个参数为微博的内容,但是我们发的微博却包含一个网易微博的短链接地址 http://163.fm/T7n6r0L ,鼠标移到上面,奇迹出现,弹出了我们插入的js代码。
4、voteUrl这个参数从字面上理解应该是投票地址,初步分析是网易微博没有对该参数校验就直接转换为短链接地址。从http://163.fm/getOriginal?callback=jQuery16109319937340915203_1348642196756&q=T7n6r0L&_=1348642200976这个地址返回的内容也能够判断出,传入到callback的参数就是我们voteUrl的值。
5、执行了js代码,但是并不知道为什么执行?先在firebug中查找getOriginal,在
http://img2.cache.netease.com/t/cssjs/439756/script/page/home.js
中有找到:

define("utils/DataSource",
function(a, b, c) {
var d = a("external/jquery"),
e = a("model/UserData"),
f = a("utils/log/Logger"),
g = {
keyFrom: null,
requestMap: {
longUrl: {
url: "http://163.fm/getOriginal",
login: !1
},


这个只是定义,在home.js中再查找longUrl,有如下代码:

define("task/shortURL",
function(a, b, c) {
var d = a("task/TaskManager"),
e = a("task/Task");
d.add(new e("shortURL",
function() {
var b = a("external/jquery"),
c = a("utils/DataSource");
b(document.body).delegate(".short-url:not(.processed)", "mouseenter",
function(a) {
var d = b(a.target),
e = d.addClass("processed").text();
if (e.indexOf("http://163.fm") === 0) {
var f = e.substr(14);
c.get("longUrl", {
q: f
},
function(a) {
d.attr("title", a)
},
"jsonp")
}
})
}))
});


在上面的代码中我们大致可以知道问题产生的原因:
a) 修改参数voteUrl发微博
b) voteUrl会转换成一个短链接地址,短链接对应的长链接地址为voteUrl的值
c) 微博中包含这个短链接地址,当鼠标移动到短链接地址会触发mouseenter事件
d) 响应mouseenter事件后会先取短链接后面的7个字符,把这7个字符作为q参数的值,然后通过ajax去http://163.fm/getOriginal请求资源。在这一步中执行我们的js代码。
e) 最后把短链接所对应真是的长链接地址放到微博中a标签的title属性。

漏洞证明:

修复方案:

1、对voteUrl参数进行判断
2、通过jsonp调用的时候先对voteUrl的值进行js转义。

版权声明:转载请注明来源 心伤的胖子@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:15

确认时间:2012-09-27 11:05

厂商回复:

感谢您对网易的关注,漏洞已经修复。

最新状态:

暂无


漏洞评价:

评论

  1. 2012-09-26 18:41 | goderci ( 普通白帽子 | Rank:542 漏洞数:47 | http://www.yunday.org)

    2呢

  2. 2012-09-26 18:43 | 心伤的胖子 ( 普通白帽子 | Rank:308 漏洞数:29 | 因为心伤,所以胖子。)

    @goderci 你在等么?

  3. 2012-09-26 21:41 | goderci ( 普通白帽子 | Rank:542 漏洞数:47 | http://www.yunday.org)

    @心伤的胖子 是的

  4. 2012-09-26 22:49 | 心伤的胖子 ( 普通白帽子 | Rank:308 漏洞数:29 | 因为心伤,所以胖子。)

    @goderci 你要的2来了,虽然还在审核不过不过你会看到的。 WooYun: 网易微博存储型XSS 2