XSS Cross-Site Scripting 跨站脚本
把恶意 JavaScript 注入到合法网站,让其他用户的浏览器替攻击者执行代码的注入攻击。
XSS 不攻击服务器,攻击的是访问这个网站的其他用户。一旦执行,攻击者能读 cookie、劫持 session、伪造请求、改页面骗用户输密码。
三大变种
| 变种 | 恶意脚本存哪 | 触发方式 | 典型场景 |
|---|---|---|---|
| Stored XSS | 服务器(数据库) | 受害者访问普通页面就触发 | 评论区、论坛、留言板被注入 <script> |
| Reflected XSS | URL/请求参数里 | 受害者点恶意链接才触发 | 钓鱼链接 ?q=<script>... 被服务端原样回显 |
| DOM-based XSS | 不经服务器,纯前端 | 浏览器执行 JS 把不安全数据塞进 DOM | 前端用 innerHTML 拼接 location.hash |
Stored 最致命(被动触发、影响所有访客),DOM-based 最难检测(服务器日志看不到,WAF 也拦不住)。
攻击者拿到 XSS 能干什么
- 偷 cookie、session token → 接管账号
- 伪造请求(CSRF 升级版)
- 键盘记录、表单劫持
- 改页面骗用户输信用卡
- 加载更多 payload(BeEF 框架)
防御
| 手段 | 解决什么 |
|---|---|
| 输出转义(HTML escape) | 把 < 变成 <,最根本的修法 |
| Content Security Policy(CSP) | 浏览器层面禁掉内联脚本和外部脚本源 |
| HttpOnly cookie | JS 读不到 session cookie |
| 框架默认安全(React、Vue) | 默认转义,除非你主动用 dangerouslySetInnerHTML |
| 输入校验 | 减少入口,但不能替代输出转义 |
关联
- OWASP Top 10 长期上榜
- 属于 注入攻击 大类(和 SQL injection 同源思想:数据被当代码执行)