绕过某通用信息管理系统打一套组合拳实现XSS 本文累计 8596 字, 最后更新时间:2022年01月16日 ### 0X01 说在前面: 实战渗透某站点时遇到的,经过了几天硬磕最终成功绕过限制并打到管理员cookie,特此记录下备忘。 将一些琐碎的trick和知识点进行了实际结合,希望本文能对读者有所帮助, 若有谬误,还请指正。 ~~学Web还是秃头啊..~~ ### 0x02 准备工作: 首先看看站点,事先测过了SQL等漏洞,这里只测试XSS. ![Image.png][1] 先尝试填充一些正常数据以判断是否会回显payload, 经过测试,该站点提交信息会直接跳转回首页,无法查看payload解析执行情况。 注意:测试xss时往往不要一上来就怼` 需要提前准备好一个URL缩短服务: 访问设置url即可 ![Image [4].png][4] 要是有更短的网址缩短服务可以留言分享下,毕竟在测试xss中有时仅仅缩短一个字符便能决定渗透成功与否。 提交payload后我们到后台查看效果。 ![Image [5].png][5] 对比一下: 可以发现 = 与 url中的 / 被过滤掉 并且页面解析了我们的` //ascii编码绕过 其实这里就已经结合了编码绕过的思路,故不再赘述编码绕过 我们这里使用第一个payload,该payload完美的绕过了"="与"/"的限制,因为特殊符号全被编码成了对应的ascii码 提交payload,到后台查看效果 ![Image [6].png][6] 显然,我们的payload执行成功。 你以为这样就完了吗?? 我们现在去目标站测试下 ![Image [7].png][7] 再看看payload的长度 ![Image [8].png][8] ![Image.jpg][9] **所以好戏才刚刚开始啊...** 也许有读者会问为什么同样的payload却遇到了限制呢? 这点可以在管理后台获得解答。 ![Image [9].png][10] 说明目标站的数据项做了长度限制。经过测试,目标站所有的数据项长度都被限制到了40个字符,那么我们来考虑绕过。 这里提供一种巧妙的思路: **将** ** payload ** **分割起来并储存在相应的变量中,拼接变量后执行。** 所用的payload一般为: 注:此payload要求所有字符注入进同一页面。 思路确定了,但是对于目标系统来说,该如何绕过'='与'/'的限制呢? 之前提过,使用编码绕过特殊字符是一座较为有效的思路,那么我们便考虑将分割注入与编码这两种思路相结合。 补充知识: Unicode编码绕过 url编码绕过 Ascii码绕过 hex绕过 八进制 base64绕过 通过观察我们可以发现,url编码,ascii编码,base64编码后的字符在执行时需要相应函数或方法进行解码, 无疑增加了payload的长度,反而在整体长度有限制的情况下不利于执行。 那么有没有一种可被直接解析并且编码后长度适中的编码方式呢? 有! **hex** ** 编码 ** ** 8 ** **进制** **unicode** ** 编码!** 以unicode编码为例(原理与hex, 8进制大同小异,有兴趣的读者可以自行测试) 我们先将'='替换掉 注: 1. 使用unicode,hex,8进制等编码时需要用到eval()函数 2. 其实这里的payload并不可用,还需要经过处理,只是为了展现思路历程 下一步处理一些细节: 1. eval内的引号需要转义 2. 进一步的缩短payload 请大家思考: 只用一个变量z进行存储,在之后的每一步中拼接字符串是否为最优的方法? 个人认为,在总长度允许的情况下,可以将不同的payload存储在不同的变量中, 例如: 这样便可以省去"z+"这两个字符 最后进行拼接 拼接字符时只是单纯的变量加减,并不需要转义等复杂操作增添新的字符,payload的长度还在可以接受的范围内。 如果读者对整个过程存在疑问,推荐自己写一个过滤掉"="与url中"/"的环境进行测试,能帮助你更好的理解本文。 贴一下最终的payload: 你以为这样就完了吗?不!还没完! 我们提交下该payload ![Image [10].png][11] ![Image.jpg][12] 为什么会报错某些变量没有被定义呢? 我们的payload在本地chrome测试是完美成功的啊 不应该存在语法上的错误啊 这就要讲到另一个知识点了: **原来 JS 引擎并非一行行去分析和执行程序,而是一段一段的执行(如3),而且在同一段程序的分析执行中,定义式的函数语句会被优先执行。函数定义执行完以后才会按顺序执行其他语句代码。** **在经过预处理后,js引擎才会从上到下依次执行。** 想想我们的注入顺序? ![Image [11].png][13] 最终执行变量的语句却放在了页面上端,js引擎在执行时自然会报错。 所以把之前的payload倒序注入即可。(相信我这真的是最后一次了) 成功打到cookie. ![Image [12].png][14] ### 0x04 后话: 一次曲折的XSS测试完成了,自己也学到了一些技巧与思路,记录下来做个总结。 很多时候在复杂的环境下单单一种思路是无法成功渗透的,需要自己摸索结合多种思路与技巧,将之结合,打出一套"组合拳",方能取胜。 XSS这块有很多细节需要注意与理解,想要透彻理解本文的话最好还是自己搭建环境动手操作下, 希望本文能带给读者一些绵薄的帮助。 Asteriska,敬上。 [1]: https://hack.best/usr/uploads/2022/01/2547052885.png [2]: https://hack.best/usr/uploads/2022/01/3558408021.png [3]: https://hack.best/usr/uploads/2022/01/3464717768.png [4]: https://hack.best/usr/uploads/2022/01/452638298.png [5]: https://hack.best/usr/uploads/2022/01/4286489949.png [6]: https://hack.best/usr/uploads/2022/01/451613710.png [7]: https://hack.best/usr/uploads/2022/01/2193190124.png [8]: https://hack.best/usr/uploads/2022/01/861841277.png [9]: https://hack.best/usr/uploads/2022/01/1890729057.jpg [10]: https://hack.best/usr/uploads/2022/01/2398255291.png [11]: https://hack.best/usr/uploads/2022/01/2398175292.png [12]: https://hack.best/usr/uploads/2022/01/1890729057.jpg [13]: https://hack.best/usr/uploads/2022/01/1124682287.png [14]: https://hack.best/usr/uploads/2022/01/730126877.png
Comments | NOTHING