1. 项目概述:一次针对特定安全软件的XSS绕过实战
最近在安全圈里,一个关于“某安全卫士”的XSS绕过案例引起了我的注意。核心点在于,它绕过了常规的 alert() 弹窗检测,实现了自己的弹窗效果。这听起来像是一个典型的“猫鼠游戏”升级版——防守方在不断加固自己的检测规则,而攻击方则在寻找规则之外的缝隙。对于从事Web安全、渗透测试或者前端开发的朋友来说,这类案例的价值远超一个简单的漏洞报告。它更像是一份绝佳的教学样本,让我们能深入理解现代Web应用安全防护(尤其是客户端脚本过滤)的运作机制、常见盲点以及攻击者的创造性思维。
简单来说,XSS(跨站脚本攻击)的核心是让受害者的浏览器执行攻击者精心构造的恶意JavaScript代码。而 alert() 函数,作为JavaScript中最基础、最显眼的“证据展示”方式,自然成了各类WAF(Web应用防火墙)和客户端安全软件重点监控和拦截的对象。很多安全检测规则会简单粗暴地匹配 alert( 这个字符串。那么,当这条“高速公路”被设卡严查时,攻击者该如何“另辟蹊径”,将攻击载荷(Payload)成功送达并执行呢?这就是本次案例要拆解的核心。
本文将从一个资深安全研究员的视角,彻底复盘这次绕过过程。我们不会停留在“有个漏洞”的层面,而是会深入探讨:为什么常规的 alert() 会被拦截?有哪些经典的、甚至有些“邪道”的绕过思路?在“某安全卫士”这个具体场景下,是哪种思路奏效了?其背后的JavaScript语言特性和浏览器渲染原理是什么?更重要的是,我们能从中提炼出哪些普适性的防御思路和代码审计要点?无论你是想提升自己的渗透技巧,还是想加固自家产品的安全防线,这篇文章都将提供实实在在的干货。
2. 核心思路:为何要绕过 alert() 及常见绕过手法全景
在深入具体案例前,我们必须先建立共识:为什么攻击者要费尽心机绕过 alert() ?直接原因很简单,为了规避检测。但深层原因,是攻防双方在“代码执行”与“行为识别”上的博弈。
2.1 alert() 的“哨兵”角色与检测逻辑
对于防御方(如WAF、安全软件、输入过滤函数), alert() 函数有几个特点使其成为理想的检测标志:
- 高关联性 :在测试或攻击场景中,
alert()是最常用于证明XSS漏洞存在的函数。弹出一个对话框,是最直观的“攻击成功”信号。 - 字符串特征明显 :
alert(这个子串在代码中出现的频率相对较低,且模式固定,易于进行字符串匹配或正则表达式拦截。 - 副作用明显 :它会阻塞浏览器线程并产生一个非常显眼的用户界面变化,容易被动态行为监测捕获。
因此,许多初级或基于正则的过滤规则,会包含类似 /alert\s*\(/i 这样的模式来拦截。然而,JavaScript是一门极其灵活的语言,这种基于固定字符串的检测,从设计上就存在被绕过的可能。
2.2 绕过手法的分类学
根据我多年的渗透测试经验,绕过 alert() 检测的手法主要可以分为以下几大类,理解这些类别有助于我们构建系统的测试向量库。
第一类:字符串混淆与编码 这是最基础也是最常用的方法。核心思想是让“alert”这个字符串在静态扫描时“看起来不像”alert。
- 十六进制/Unicode编码 :例如,
\x61\x6c\x65\x72\x74或\u0061\u006c\u0065\u0072\u0074在运行时都会被JavaScript引擎解码为“alert”。 - HTML实体编码(在特定上下文) :如果输出点位于HTML标签属性内,且未正确解码,
alert可能被解码。 - 字符串拼接与分割 :
'al'+'ert','ale'+'rt', 或者利用数组['a','l','e','r','t'].join('')。 - 利用全局对象 :
window['al'+'ert']或self['ale'+'rt'],通过属性访问的方式调用。
注意 :单纯的字符串混淆对于现代WAF来说效果已经有限,因为很多WAF具备一定程度的解码和规范化能力。但这仍然是组合技中的基础步骤。
第二类:利用替代函数或原生能力 既然 alert() 被盯上了,那就换一个能达到类似“证明效果”甚至更具危害的函数。
- 其他弹窗函数 :
confirm(),prompt()。这是最直接的替代,但也很容易被加入黑名单。 - 非弹窗的证明方式 :
-
console.log():向控制台输出信息,需要受害者打开开发者工具,但隐蔽性好。 -
document.write():直接写入页面DOM,视觉冲击强。 -
location.href或window.open:重定向或
-


397

被折叠的 条评论
为什么被折叠?



