XSS绕过-过滤-转换
因为在我们的实际测试过程中,有很多安全系统或多或少,会去做一些安全措施,但是,这些措施,有可能会因为程序员逻辑不够严谨,或者他使用的方法是错的,保证了他的措施起到了一部分作用,但是还是可以被绕过的
0,前端限制绕过,直接抓包重放,或者修改html前端代码
我们的安全措施不要在前端去做,比如输入字符长度限制,这样也引申出一个思想,我们所有的安全措施,永远不要放在前端去做,前端会通过js,会通过属性,起到安全的辅助措施,但是本质上是没有作用的
1.大小写,比如:<SCRIPT>aLeRT(111)</sCRIpt>
在后台对输入进行过滤,会有两种思路,一种是对输入里面的内容进行正则匹配,然后发现符合正则表达式内容的,把他干掉,对输入一整串的内容,用查找去查找,然后有的话,也会把他干掉
一般来说,正则是区分大小写的,如果说,过滤措施只对小写进行处理,没有对大写进行处理,我们可以通过大小写混合的方式绕过措施,大小写混合的输入,在输出到前端的时候,仍然会被正常执行,这是大小写的用法
2,拼凑: <scri<script>pt>alert(111)</scri</script>pt>
后台的逻辑,对于script标签去进行替换,但是一般的逻辑只会替换一次,也就是在输入的内容里面,会把script标签给替换掉,但是我们前后这段,又组合成新的script,他不会重复的做处理,所以导致这样的写法,可以绕过后台的措施
3,使用注释进行干扰:<scri<!--test-->pt>alert(111)</sc <!--test--> ript>
在前端,我们可以插入注释的标签,我们可以通过前端的注释符号,然后在我们输入的payload里面,去进行一个干扰,这一段就是一个script标签,中间这段,不会去执行他的,因为他是一个注释,但是这串内容输入到后台,后台可能会不认识他,所以他并不会认为这是个script标签,从而绕过后台的措施,这是一个常见的转换思路
XSS绕过-过滤-编码
核心思路:
后台过滤了特殊字符,比如
编码不能随便乱用,不能说,我们编码成不认识的,就算成功了,编码的时候,虽然说,你最终输入的时候,绕过了后台,但是你输出的时候,一定要能在输出点被正常翻译,这个编码才是有效的
当浏览器对该编码进行识别时,会翻译成正常的标签,从而执行。
在使用编码时需要注意编码在输出点是否会被正常识别和翻译!
所以对我们有个要求,要知道前端的各种标签属性里面,能够处理那些编码,或者说,我们能够通过那些手段,能够让他正常翻译
XSS绕过-过滤-编码
栗子1:
<img src=x onerror="alert('xss')"将alert('xss')进行URL编码,可以执行吗
<img src=x onerror="alert%28%27xss%27%29" />
img标签是个图片,src是个字符,没法读到这个图片,可以通过oneeror读到js函数,直接调用alert函数
如果说,后台对alert进行过滤,我们可以对他进行编码
并不会执行 ,why,?因为这些属性标签并不会正常解析这些编码
所以不会去弹窗,没有意义
XSS绕过-过滤-编码
栗子2:使用事件属性onxxx();
栗子2:使用事件属性onxxx();
<img src=x onerror="alert('xss')" />可以把alert('xss')进行html编码
因为html编码,输出到浏览器前端会被进行翻译
<img src=x onerror="alert('xss') "/>
翻译成之后,会被当作一个方法来执行,从而来弹这个窗
<img src=x
onmouseover="alert('xss') " />
可以执行
注意,事件标签里面并不会执行<script></script>标签里面的代码。
XSS绕过的姿势有很多,取决于你的思路和对前端技术的掌握程度
因为xss的绕过比较灵活,也并没有某个绕过姿势可以适用所有场景,这里主要是靠我们自己去尝试,可以多通过论坛和一些互联网的博客,去看一些对应的姿势,收集对应的方法,当我们理解了这些绕过姿势,当我们在做防范的时候,或者说,给我们的安全开发人员给建议的时候,我们也能够给出一个比较完整的方案措施,以至于不会出现这些被绕过的漏洞
XSS绕过实验演示
我们打开pikachuxss过滤,同样的在这个地方根据之前的思路,输入一些对应的字符串,看他如何处理
<script>;"7777
我们点提交
我们可以看一下源码,搜7777
我们刚刚输入的script标签貌似被干掉了,那是不是就以为着,后台对我们输入的script标签进行过滤呢,我们根据刚刚的思路,做一个尝试性的绕过,大小写混合
<ScRiPt>alert('111')</ScRiPt>
这就弹出来了,后端只是对小写的script进行过滤,我们看一下后端代码的逻辑
把message用preg_replace这么个方法,在PHP里面,对后面的字符串,去匹配前面的正值,如果匹配到了,就会把他替换为指定的字符,这边指定的是空,就是直接把它干掉的意思,因为正则是区分大小写的,这里只是对小写前面的script进行了过滤,通过大写,就可以绕过它
因为这里过滤了script,所以这里用img标签也可以
<img src=x onerror="alert(111)"/>
所以说,xss绕过,其实是比较灵活的,主要是看我们的知识,够不够风骚,能够绕过管理员的逻辑
html编码
<img src=x onerror="alert('xss')"/>
拼凑
<scri<script>pt>alert(111)</scri</script>pt>
被过滤掉了
注释符
<scri<!--test-->pt>alert(111)</sc <!--test--> ript>