别再死记 payload 了XSS 的本质其实很简单很多刚学 Web 安全的人一听到 XSS 就开始背scriptalert(1)/script但其实学了半天还是不知道为什么能弹窗为什么会有漏洞为什么能盗号反射型、存储型、DOM 型到底区别在哪我最近在学习 Web 安全的时候也被这些问题绕晕过。所以这篇文章我想尽量用我自己的理解把 XSS 讲清楚。一、什么是 XSSXSS 的全称是Cross Site Scripting跨站脚本攻击简单来说攻击者把恶意 JavaScript 插入到了网页里。然后其他用户打开这个页面时这段 JS 就会在他们浏览器里执行。这里可以背一下哈尤其是想面试的小伙伴比如scriptalert(1)/script如果网站没有做好过滤这段代码就会被浏览器当成正常 JS 执行。于是页面直接弹窗。二、XSS 为什么危险很多新手第一次学 XSS 都会想“不就是弹个窗吗”其实弹窗只是最基础的测试。真正危险的是这里也叫xss的危害面试也会问哦盗 Cookie获取登录状态伪造用户操作钓鱼页面键盘记录获取敏感信息比如document.cookie这行代码就可以读取当前网站的 Cookie。如果网站没有设置HttpOnly攻击者甚至可能直接拿到用户登录状态。所以XSS 的本质不是“弹窗”而是“执行任意 JS”。三、反射型 XSS反射型 XSS 是最常见、也是最容易理解的一种。它的特点是恶意代码不会被保存。而是用户点击链接后服务器把恶意内容“原样返回”到了页面里。例如http://test.com/search?qscriptalert(1)/script如果后端直接把q 参数输出到网页你搜索的内容是scriptalert(1)/script浏览器就会执行它于是弹窗。3.1反射型 XSS 的核心本质其实就一句话用户输入 → 网站直接输出没有过滤。四、存储型 XSS存储型 XSS 比反射型危险得多。因为恶意代码会被“永久保存”。比如评论区用户昵称论坛帖子留言板攻击者提交scriptalert(1)/script网站直接存进数据库。之后所有访问这个页面的人都会自动执行这段 JS。这也是为什么存储型 XSS 往往影响范围更大。举一个很真实的例子假设某论坛的昵称没有过滤。攻击者把昵称改成scriptalert(document.cookie)/script那么所有看到他发言的人都可能触发这段代码。这时候事情就不是“弹窗”这么简单了。五、DOM 型 XSS这是很多新手最容易懵的一种。因为漏洞不一定发生在服务器而是发生在前端 JavaScript。比如document.body.innerHTML location.hash如果 URL 是http://test.com/#scriptalert(1)/script前端 JS 会把 hash 内容直接插入页面。于是浏览器执行恶意代码。5.1DOM 型 XSS 的核心重点是前端 JS 操作 DOM 时不安全。它甚至可能不经过服务器完全在浏览器里触发所以很多时候抓包都看不出来。六、三种 XSS 的区别6.1 反射型 XSS特点不存储需要用户点击链接一次性触发6.2 存储型 XSS特点会保存到数据库所有人访问都会触发危害最大6.3 DOM 型 XSS特点前端 JS 导致不一定经过服务器发生在浏览器 DOM 操作阶段七、为什么现在很多网站不容易出现 XSS 了因为现代网站都会做输入过滤输出编码CSPHttpOnly前端框架转义比如Set-Cookie: sessionidxxx; HttpOnly这样 JS 就无法读取 Cookie。即使存在 XSS危害也会小很多。八、学习 XSS 时最容易踩的坑我自己目前最大的感受是很多人一上来就背 payload找弹窗跑工具但其实根本不理解浏览器怎么解析 HTMLJS 为什么会执行Cookie 为什么重要DOM 到底是什么最后学着学着就会特别乱。所以我现在更推荐先理解 Web 工作原理再学漏洞。可以看我前面的文章里面都有写这样很多东西会突然串起来。九、推荐几个适合新手的 XSS 靶场1. Pikachu界面简单对新手友好。2. DVWA经典 Web 漏洞靶场。十、总结以前我一直觉得“XSS 不就是弹窗吗”后来才发现真正重要的不是 payload。而是浏览器DOMCookieSession前后端交互这些东西理解之后很多漏洞才会真正看得懂。如果文章里有理解不对的地方也欢迎大家一起交流学习