QQ空间某功能缺陷导致日志存储型XSS

`1 日志的功能都快被测光了。。。只好把目光放在了一个不是很可能出XSS的地方,还是有,有木有!1. 发布一个日志,插入一张图片,保存日志。当鼠标移动到图片上时,可以看到下面的东东。

 

2. 查看对应部分的源码,可以看到 转发部分的代码里,有这个图片的URL。

 

3. 这里可以猜测到,这部分代码的实现,大概是将图片的src取出来,然后通过字符串连接到代码里。

 

如果图片的地址里带有 " ,并且没有被过滤的话,是不是就可以导致XSS了呢?

 

4. 我们来试试。

 

日志,HTML模式,写入以下代码。
<div style="text-align:center"><img src=http://www.idianyun.com/uploadfile/2013/0504/20130504105051342.jpg#"><img style=display:none src=1 onerror="alert(1)//" alt="图片" style="width:466px;height:700px"></div>
复制代码
5. 没弹出,查看DOM代码,可以看到,腾讯对外部图片做了一定的措施。
6. 要绕过这个限制,我们到相册里自己上传以下,得到一个腾讯站内地址试试。
<div style="text-align:center"><img src="http://b254.photo.store.qq.com/psb?/01d1295e-6c2f-4efd-825e-e15c2a77c787/mPEZeaUmy4PfIqxb9UclFShCdxmBJup1fOa6uKTgL80!/b/dJyTa5cOCQAA&bo=0gG8AgAAAAABAEo!#"><img style=display:none src=1 onerror="alert(1)//" alt="图片" style="width:466px;height:700px"></div>
复制代码

 

7. 再次查看日志,当鼠标移动到【日志内的美女图片上时】,可以看到,弹出了1。

 

8. 通过DOM代码附近的 InfoManager.twitterImage ,我们可以定位到 http://ctc.qzs.qq.com/qzone/app/blog/v6/script/blog_content.js

 
..
tip_str += (['<a id="qzblog_twitter_img_btn" class="forward" href="javascript:void(0);"><i class="icon_forward"></i>转发</a>']).join('');
..
oTip.innerHTML = QZBlog.Util.formatMsg(tip_str, [imgObj.src]);
..

(In http://ctc.qzs.qq.com/qzone/newblog/v5/script/common.js)
QZBlog.Util.formatMsg = (function(msg, values, filter) {
var pattern = /\{([\w-]+)?\}/g;
return function(msg, values, filter) {
return msg.replace(pattern,
function(match, key) {
return filter ? filter(values[key], key) : values[key];
});
}
} ());

 

进一步可以看出,图片的src取出后,经过formatMsg函数,进入tip_str最终进入oTip.innerHTML

 

9. 最后补充下一个小细节,在本地XSS中,图片地址后面,我们用#,而没有用 ?,这是为什么呢?

 

因为在chrome下,xxx.src取出图片地址时,会对地址进行编码,

 

如果用 xxx.jpg?"><img 就会变成 xxx.jpg?%22%3E%3cimg,如下图。

而用#号则不会被编码。 这也是决定是否可以利用成功的一个小技巧,故在此说明一下。

 

1. IE和chrome下均可,

 

2. 当用户进入日志后,鼠标移动到日志中插入的图片上时,即会触发XSS。

 

3. 虽然这是一个 onmouseover xss,但是从用户查看日志的习惯上来说,

 

当图片SIZE非常大,图片内容有吸引力,以及用户一些移动鼠标的误操作, 会使得该XSS的触发成功率会非常高,和自动触发差距不大。

 

THE END
分享
二维码
< <上一篇
下一篇>>