- A+
对于XSS的过滤,在很多网站中都是说,要过滤双引号,要过滤掉尖括号,这样就安全了。难道真的过滤了双引号和尖括号就完全安全了?在导入到Javascript中的变量中,XSS是有非常多方法的,很多时候我们要根据具体的上下文来分析。而不是根据所谓的网上的一些通用方法来进行过滤,网上通用的方法在很多具体环境下都是漏洞百出的。
我们来看下面一个网上的例子:
http://xsst.sinaapp.com/example/test1-2-2.php?page=1
<style> .code{border:1px solid #ccc;background:#ffff77;padding:10px;} </style> <pre> <div class="code" id="test"> <a href="javascript:void(0);">这里只是测试用的链接..</a> <a href="javascript:void(0);">这里只是测试用的链接..</a> <a href="javascript:void(0);">这里只是测试用的链接..</a> </div> <script src="../jq.js"></script> <script name="对面的妹子,看过来,看过来,看过来..."> try{ var page=$('#test a[href="1"]'); var b=document.cookie; }catch(e){ } </script> <div class="code">
在提交的参数中已经过滤了:
“, [, ] , \, <, >
如果是你的话,你会怎样想办法去绕呢,有人给出了一种绕过的方法,有奇效,居然是用加号来达到弹出的目的:
http://xsst.sinaapp.com/example/test1-2.php?page=’%2balert(document.cookie)%2b’
在使用加号做字符串连接的时候,中间的js会被执行,这个是之前好像没有怎么看到过的,能触发alert的操作绝对不止加号这一直,之前在其他文章中也看到过很多类似的技巧。因此在JS中,要过滤XSS,确实是一件比较麻烦的事情,因为需要考虑上下文的影响。
再看另一个:
http://xsst.sinaapp.com/example/test1-2-3.php?page=1
<style> .code{border:1px solid #ccc;background:#ffff77;padding:10px;} </style> <pre> <div class="code" id="test"> <a href="javascript:void(0);">这里只是测试用的链接..</a> <a href="javascript:void(0);">这里只是测试用的链接..</a> <a href="javascript:void(0);">这里只是测试用的链接..</a> </div> <script src="../jq.js"></script> <script name="对面的妹子,看过来,看过来,看过来..."> try{ var page='1'; var b=document.cookie; }catch(e){ } </script>
过滤了:
”, <, >, eval, window, alert
这里的上下文又不同,alert和eval都不能用了,怎么办呢,我们可以看到在页面中引入了jquery,那么应该可以从jquery带的函数下手吧,然后再通过字符串拼接来绕过对于alert的过滤,使用下面的方法来绕:
用到了jQuery.globalEval来做执行,绕过了限制。因此,在XSS的过滤中,上下文确实非常重要,如果没有对于上下文正确的理解,很难做出正确的过滤。看来熟悉Javascript还是非常有用的,准备迟点好好看看Javascript,也可以用来改造博客什么的。
- 我的微信
- 这是我的微信扫一扫
- 我的微信公众号
- 我的微信公众号扫一扫