无需登录 数据私有 本地保存

XSS 过滤器绕过测试场 - 安全编码演示

10
0
0
0

XSS 过滤器绕过测试场

输入XSS攻击载荷,观察不同级别过滤器的防御效果与绕过方式。用于安全编码演示与教育目的。

长度:0 字符 绕过:0/6 个过滤器
预设载荷(点击快速填充):
安全编码最佳实践
1
始终使用HTML实体编码

< > " ' & 转义为对应的HTML实体。

2
采用白名单而非黑名单

黑名单容易被绕过,白名单更安全可靠。只允许明确安全的输入通过。

3
部署内容安全策略(CSP)

通过HTTP头限制脚本来源,即使XSS注入成功也难以执行恶意代码。

XSS 安全知识库 (FAQ)

XSS(Cross-Site Scripting,跨站脚本攻击)是一种常见的Web安全漏洞,攻击者通过将恶意脚本注入到网页中,当其他用户浏览该网页时,恶意脚本在用户浏览器中执行,从而窃取用户信息、劫持会话、篡改页面内容或进行钓鱼攻击。XSS通常分为三类:反射型XSS(恶意脚本通过URL参数等即时反射)、存储型XSS(恶意脚本被存储在服务器数据库中)、DOM型XSS(通过客户端JavaScript操作DOM触发)。

黑名单过滤试图阻止已知的危险关键词(如scriptalertonerror等),但攻击者可以通过多种方式绕过:大小写变体(如<SCRIPT>)、嵌套标签(如<scr<script>ipt>)、编码绕过(URL编码、Unicode编码)、使用替代函数(如用prompt替代alert)、使用不常见的事件处理器(如onfocusonblurontoggle)等。黑名单永远无法穷举所有可能的攻击向量。

HTML实体编码将特殊字符转换为对应的HTML实体表示:<&lt;>&gt;"&quot;'&#x27;&&amp;。这样,浏览器会将它们当作普通文本显示,而不会将其解释为HTML标签或属性。例如,<script>alert('XSS')</script>经过实体编码后变为&lt;script&gt;alert('XSS')&lt;/script&gt;,浏览器会将其显示为纯文本,不会执行脚本。这是防御XSS最基础且最有效的方法之一。

CSP(Content Security Policy,内容安全策略)是一种浏览器安全机制,通过HTTP响应头Content-Security-Policy或HTML的<meta>标签来声明允许加载的资源来源。例如,script-src 'self'只允许加载同源的脚本,阻止内联脚本执行。CSP可以有效减轻XSS攻击的影响,即使攻击者成功注入了脚本标签,如果该脚本不符合CSP策略,浏览器也会拒绝执行。CSP还可以限制eval()、内联事件处理器等危险行为。

反射型XSS:恶意脚本通过HTTP请求(如URL参数)发送到服务器,服务器将脚本"反射"回响应页面,浏览器解析响应时执行脚本。数据流经服务器端。

DOM型XSS:恶意脚本完全在客户端执行,不经过服务器。攻击利用客户端JavaScript代码(如innerHTMLdocument.write()eval()等)不安全地处理用户输入,直接在DOM中执行恶意代码。服务器日志中可能完全没有记录。DOM型XSS更难被传统WAF检测到。

常见的XSS绕过技巧包括:
  • 大小写混淆:使用<SCRIPT>绕过区分大小写的过滤
  • 嵌套标签<scr<script>ipt>使简单替换失效
  • 编码绕过:HTML实体编码、URL编码、Unicode编码
  • 事件处理器替代:使用onfocusonblurontoggle等不常见事件
  • 函数替代:用prompt()confirm()替代alert()
  • 换行/Tab字符:在标签名或属性中插入空白字符
  • 空字节注入:在过滤关键词中插入\0
  • SVG/HTML5新标签:利用<svg><details>等标签

DOMPurify是一个广泛使用的开源JavaScript库,专门用于清理HTML内容以防止XSS攻击。它使用白名单方式,只允许安全的HTML标签和属性通过,自动移除所有危险的元素和属性。使用示例:const clean = DOMPurify.sanitize(dirtyHtml);。DOMPurify支持高度自定义配置,可以指定允许的标签、属性,并处理各种边缘情况。对于需要富文本输入的场景,使用DOMPurify比手动实现过滤器更安全可靠。

HTML是一种极其灵活和复杂的语言,浏览器在解析HTML时具有很高的容错性。简单的正则表达式(如/<[^>]*>/g)无法处理以下情况:不完整的标签属性中的特殊字符编码变体浏览器特定的解析差异嵌套结构等。正则表达式不是解析HTML的正确工具——HTML需要专门的解析器。因此,依赖正则表达式过滤用户输入是脆弱且不推荐的。正确做法是使用HTML实体编码或成熟的清理库如DOMPurify。