XSS过滤绕过速查表
时间:2019-09-05 16:39 来源:网络整理 作者:采集插件 点击:次
第一次翻译长篇文档,如有疏漏还请各位大牛指正。OWASP的这篇速查表虽然时间比较久了,但还在更新,所以还是翻译出来了。翻译完发现里面还是有一些值得借鉴的思路,用来涨知识还是可以的。由于篇幅较长,推荐各位可以收藏起来,用的时候再来查= ̄ω ̄= 1.介绍 这篇文章的主要目的是给专业安全测试人员提供一份跨站脚本漏洞检测指南。文章的初始内容是由RSnake提供给 OWASP,内容基于他的XSS备忘录:。目前这个网页已经重定向到OWASP网站,将由OWASP维护和完善它。OWASP 的第一个防御备忘录项目:XSS (Cross Site ing)Prevention Cheat Sheet 灵感来源于 RSnake 的 XSS Cheat Sheet,所以我们对他给予我们的启发表示感谢。我们想要去创建短小简单的参考给开发者以便帮助他们预防 XSS漏洞,而不是简单的告诉他们需要使用复杂的方法构建应用来预防各种千奇百怪的攻击,这也是OWASP 备忘录系列诞生的原因。 2.测试 这份备忘录是为那些已经理解XSS攻击,但是想要了解关于绕过过滤器方法之间细微差别的人准备的。 请注意大部分的跨站脚本攻击向量已经在其代码下方给出的浏览器列表中进行测试。 2.1. XSS定位器 在大多数存在漏洞且不需要特定XSS攻击代码的地方插入下列代码会弹出包含“XSS”字样的对话框。使用URL编码器来对整个代码进行编码。小技巧:如果你时间很紧想要快速检查页面,通常只要插入“<任意文本>”标签,然后观察页面输出是否明显改变了就可以判断是否存在漏洞: 2.2. XSS定位器(短) 如果你没有足够的空间并且知道页面上没有存在漏洞的Java,这个字符串是一个不错的简洁XSS注入检查。注入后查看页面源代码并且寻找是否存在或<XSS字样来确认是否存在漏洞 2.3. 无过滤绕过 这是一个常规的XSS注入代码,虽然通常它会被防御,但是建议首先去测试一下。(引号在任何现代浏览器中都不需要,所以这里省略了它): 2.4. 利用多语言进行过滤绕过 2.5. 通过Java命令实现的图片XSS 图片注入使用Java命令实现(IE7.0 不支持在图片上下文中使用Java 命令,但是可以在其他上下文触发。下面的例子展示了一种其他标签依旧通用的原理): 2.6. 无分号无引号 2.7. 不区分大小写的XSS攻击向量 2.8. HTML实体 必须有分号才可生效 2.9. 重音符混淆 如果你的Java代码中需要同时使用单引号和双引号,那么可以使用重音符(`)来包含Java 代码。这通常会有很大帮助,因为大部分跨站脚本过滤器都没有过滤这个字符: 2.10. 畸形的A标签 跳过HREF标签找到XSS的重点。。。由DavidCross提交~已在Chrome上验证 此外Chrome经常帮你补全确实的引号。。。如果在这方面遇到问题就直接省略引号,Chrome会帮你补全在URL或脚本中缺少的引号。 2.11. 畸形的IMG标签 最初由Begeek发现(短小精湛适用于所有浏览器),这个XSS攻击向量使用了不严格的渲染引擎来构造含有IMG标签并被引号包含的XSS攻击向量。我猜测这种解析原来是为了兼容不规范的编码。这会让它更加难以正确的解析HTML标签: 2.12. fromCharCode函数 如果不允许任何形式的引号,你可以通过执行Java里的fromCharCode函数来创建任何你需要的XSS攻击向量: 2.13. 使用默认SRC属性绕过SRC域名过滤器 这种方法可以绕过大多数SRC域名过滤器。将Java代码插入事件方法同样适用于注入使用elements的任何HTML标签,例如Form,Iframe, Input, Embed等等。它同样允许将事件替换为任何标签中可用的事件类型,例如onblur,onclick。下面会给出许多不同的可注入事件列表。由David Cross提交,Abdullah Hussam(@Abdulahhusam)编辑。 2.14. 使用默认为空的SRC属性 2.15. 使用不含SRC属性 2.16. 通过error事件触发alert 2.17. 对IMG标签中属性进行编码 2.18. 十进制HTML字符实体编码 所有在IMG标签里直接使用java:形式的XSS示例无法在Firefox或Netscape8.1以上浏览器(使用Gecko渲染引擎)运行。 2.19. 不带分号的十进制HTML字符实体编码 这对于绕过对“&#XX;”形式的XSS过滤非常有用,因为大多数人不知道最长可使用7位数字。这同样对例如$tmp_string =~s/.*\&#(\d+);.*/$1/;形式的过滤器有效,这种过滤器是错误的认为HTML字符实体编码需要用分号结尾(无意中发现的): 2.20. 不带分号的十六进制HTML字符实体编码 Thisis also a viable XSS attack against the above string $tmp_string =~s/.*\&#(\d+);.*/$1/; which assumes that there is a numeric characterfollowing the pound symbol – which is not true with hex HTML characters). 这是有效绕过例如$tmp_string =~ s/.*\&#(\d+);.*/$1/;过滤器的方法。这种过滤器错误的认为#号后会跟着数字(十六进制HTML字符实体编码并非如此) 2.21. 内嵌TAB 使用TAB来分开XSS攻击代码: 2.22. 内嵌编码后TAB 使用编码后的TAB来分开XSS攻击代码: 2.23. 内嵌换行分隔XSS攻击代码 (责任编辑:admin) |