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

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

63
0
0
0

常见问题

什么是XSS?

XSS(Cross-Site Scripting,跨站脚本攻击)是一种Web安全漏洞,攻击者将恶意JavaScript代码注入到受害者的浏览器页面中执行。XSS分为三种类型:反射型XSS通过URL参数将恶意脚本反射到页面中,需要用户点击恶意链接;存储型XSS将恶意脚本永久存储在服务器数据库中,所有访问相关页面的用户都会受影响;DOM型XSS完全在客户端发生,恶意数据不经过服务器直接通过DOM操作渲染到页面。XSS的危害包括窃取用户Cookie和登录凭据、劫持用户会话执行未授权操作、篡改页面内容进行钓鱼攻击、发起CSRF请求等。

为什么黑名单过滤器不安全?

黑名单过滤器的根本问题在于无法穷举所有可能的攻击向量。XSS的载荷构造方式极其多样:可以使用大小写混淆(如ScRiPt)、HTML实体编码(如<script>)、JavaScript进制编码(如javascript:)、事件处理器替代(如onmouseover、onfocus等数十种事件)、SVG和MathML等非标准标签、CSS表达式(expression())、data: URI协议等。每种绕过技术还有无数变体,开发者永远无法列出完整的黑名单。因此,安全领域共识是:基于黑名单的XSS防御方案是不可靠的,应该采用白名单策略、输出编码、CSP等纵深防御手段。

HTML实体编码如何防御XSS?

HTML实体编码将用户输入中的特殊字符(如<、>、&、"等)转换为对应的HTML实体引用,防止浏览器将其解析为HTML标签或属性。例如用户输入<script>alert(1)</script>经过HTML实体编码后变为&lt;script&gt;alert(1)&lt;/script&gt;,浏览器会将其作为纯文本显示而非执行为脚本。但需要注意,HTML实体编码只在HTML标签内容上下文中有效,在属性值、JavaScript代码、URL、CSS等不同上下文中需要使用不同的编码方式。正确做法是根据输出上下文选择适当的编码函数。

CSP内容安全策略是什么?

CSP(Content Security Policy)是一种浏览器安全机制,通过HTTP响应头定义页面可以加载和执行哪些资源。关键的CSP指令包括:script-src控制JavaScript的来源(可设为'self'只允许同源脚本),style-src控制CSS来源,img-src控制图片来源,connect-src控制AJAX请求的目标。CSP可以有效限制XSS攻击的影响,例如设置script-src 'self'可以阻止内联脚本执行和外部脚本加载。CSP还支持nonce和hash机制来允许特定的内联脚本。建议所有Web应用都配置合理的CSP策略。

DOM型XSS和反射型XSS有什么区别?

反射型XSS的数据流经过服务器:恶意载荷包含在URL中发送到服务器,服务器将其回显在响应HTML中,浏览器解析执行。DOM型XSS的数据流完全在客户端:恶意载荷可能来自URL、片段标识符或其他客户端数据源,JavaScript代码读取这些数据后通过DOM操作(如innerHTML、document.write、eval等)将其渲染到页面。关键区别在于DOM型XSS不需要服务器参与,防御也需要在客户端进行。常见的DOM型XSS来源包括location.hash、document.referrer、window.name等客户端可控的数据源。

常见的XSS绕过技巧有哪些?

常见XSS绕过技巧包括:大小写混淆(ScRiPt、jAvAsCrIpT等)绕过大小写敏感的过滤;HTML实体编码(十进制<、十六进制<、命名&lt;)绕过字符匹配过滤;JavaScript进制编码(<、<)绕过关键字检测;事件处理器替代(使用onmouseover、onfocus、onanimationend等非主流事件)绕过常见事件过滤;伪协议URL(javascript:、data:text/html)绕过标签过滤;SVG标签注入(<svg onload>)利用SVG支持脚本执行的特性;MathML标签注入等。每种技术还有多种变体组合方式。

如何正确使用DOMPurify?

DOMPurify是客户端HTML消毒的首选库。基本用法:const clean = DOMPurify.sanitize(dirtyHTML),返回消毒后的安全HTML字符串。高级配置示例:DOMPurify.sanitize(dirty, {ALLOWED_TAGS: ['b', 'i', 'em', 'strong', 'p'], ALLOWED_ATTR: ['class'], FORBID_TAGS: ['style'], FORBID_ATTR: ['on*']})。使用DOMPurify的要点:始终对所有来自不可信来源的HTML内容调用sanitize();不要使用DOMPurify配合eval()或innerHTML直接执行消毒后的内容;定期更新DOMPurify到最新版本以获取最新的安全修复。DOMPurify是目前最可靠和广泛使用的客户端HTML消毒方案。

为什么正则表达式无法完全防御XSS?

正则表达式用于XSS防御存在多个根本性问题。首先,HTML是一种上下文敏感的语言,简单的正则模式匹配无法理解HTML的结构和语义,容易产生误报和漏报。其次,XSS载荷的编码和变形方式无穷无尽——大小写、实体编码、Unicode编码、注释插入、空白字符混淆等组合产生了海量的变体。第三,正则表达式的贪婪/非贪婪匹配、回溯等特性可能导致ReDoS(正则表达式拒绝服务)漏洞。第四,某些正则引擎的Unicode处理不完善,可能被Unicode同形字攻击绕过。正确的XSS防御应使用专门的HTML解析器和消毒库(如DOMPurify),而非依赖正则表达式进行模式匹配。