零基础也能看懂:什么是 XSS 跨站脚本攻击
前言
XSS 全称跨站脚本攻击(Cross-Site Scripting),是 Web 安全里最经典、高频出现的漏洞之一。很多新手刚接触 Web 安全,经常疑惑:XSS 到底是什么?为什么插入 JS 代码就能攻击网站?它能造成什么危害?
本文避开晦涩难懂的专业术语,用通俗的例子讲清楚 XSS 原理、分类、利用场景和防御方案,零基础也能看懂,适合 Web 安全入门学习。
免责声明:本文仅用于授权环境安全学习。禁止在任何未授权网站插入恶意脚本进行测试,违规操作将承担相应法律责任。
一、一句话理解 XSS
简单来说:网站没有对用户输入的内容做过滤,攻击者可以把恶意 JS 代码提交到网站,当其他用户访问页面时,这段 JS 代码会在受害者浏览器里执行。
重点:JS 代码是在访客浏览器执行,不是在服务器执行。
举个生活化例子:
论坛支持留言功能,正常用户留言:今天天气不错。
攻击者输入一段 JS:<script>alert('XSS')</script>。
网站直接把留言原样展示在页面上,没有过滤。别的用户打开这条留言,浏览器就会执行这段 JS,弹出弹窗。这就是最简单的 XSS。
很多人误解:XSS 是攻击服务器。不对!XSS 目标是访问页面的用户浏览器。
二、XSS 的三大类型
1. 存储型 XSS(持久化 XSS,高危)
恶意代码存入服务器数据库,永久保存。只要有人访问对应页面,恶意 JS 就执行。
常见场景:论坛留言、评论区、文章投稿、用户资料。
攻击流程:
- 攻击者提交包含恶意 JS 的评论,存入数据库;
- 其他用户访问这条评论页面;
- 页面加载,取出数据库中的恶意代码,浏览器执行 JS;
危害最大,一次植入,所有访问者都会中招。
2. 反射型 XSS(非持久化)
恶意代码不会存入数据库,需要诱导受害者点击带有 payload 的链接,代码随请求传给服务器,直接返回页面。
常见场景:搜索框、页面跳转、URL 参数。
例子:
链接:xxx.com/search?q=<script>alert(1)</script>
服务器拿到 q 参数,直接输出到页面,用户点开这个链接,JS 执行。
特点:必须诱骗用户点击特制链接,不会永久保存在网站,危害次于存储型。
3. DOM 型 XSS
DOM XSS不需要和服务器交互,恶意代码完全由前端 JS 处理,直接在浏览器页面 DOM 中渲染。
后端不会接收、存储 payload,抓包看服务器返回源码时,看不到恶意脚本。
场景:前端直接读取 URL 参数,插入页面 DOM。
比如前端 JS 代码:document.getElementById("text").innerHtml=location.search
URL 参数里的恶意代码直接被前端渲染执行。
区分小技巧:
存储型:恶意代码进数据库;
反射型:参数传给后端,后端返回 payload;
DOM 型:纯前端处理,后端不参与。
三、XSS 能做什么?不只是弹弹窗
alert(1)只是验证漏洞存在的测试 payload,真实攻击可远不止弹窗:
- 窃取 Cookie
执行 JS 拿到用户 Cookie,发送到攻击者服务器。攻击者拿到 Cookie,直接登录受害者账号,不需要账号密码(会话劫持)。 - 钓鱼伪造页面
弹出假登录框,欺骗用户输入账号密码。 - 窃取页面数据
读取当前页面信息、用户手机号、订单等敏感页面内容。 - 诱导操作
利用受害者身份,在当前页面执行操作,比如发帖、修改密码、添加管理员。 - 配合其他漏洞组合攻击。
弹框只是证明漏洞存在,窃取 Cookie 才是 XSS 最常用的攻击方式。
四、简单 Payload 示例(靶场测试使用)
基础测试 payload:
<script>alert('xss')</script>如果页面直接执行,就证明存在 XSS。
很多场景<script>标签会被过滤,可以使用其他标签绕过:
<img src=x onerror=alert(1)>原理:图片地址 x 不存在,触发 onerror 事件执行 JS。
<a href=javascript:alert(1)>点击我</a>五、新手容易踩的误区
❌ 误区 1:XSS 只是弹个窗,危害不大
弹窗只是验证。一旦能执行 JS,就能盗取 Cookie 接管账号,存储型 XSS 属于高危漏洞。
❌ 误区 2:后端做了过滤,前端就不用处理
前端过滤很容易绕过,所有输入过滤必须在后端做,前端过滤只能做辅助。
❌ 误区 3:输入加引号就安全,只过滤<script>就够了
攻击者可以使用 img、svg、onclick、onerror 等事件,不一定需要 script 标签,只过滤 script 很容易被绕过。
❌ 误区 4:DOM XSS 漏洞是后端问题
DOM XSS 由前端代码引起,后端没有接收恶意代码,需要前端做输出编码。
❌ 误区 5:只有输入框才存在 XSS
URL 参数、页面展示内容、返回 JSON、前端渲染都可能产生 XSS。
六、XSS 防御方案(开发必看)
1. 输入过滤
对用户提交内容进行过滤,删除< >、事件关键词等危险标签。但单纯过滤容易被绕过,不能单独依靠。
2. 输出编码(最核心!推荐方案)
在把内容输出到 HTML 页面时,进行 HTML 实体编码<转为<>转为>"转为"
编码后浏览器会当成普通文本展示,不会解析成 JS 代码。
3. 使用 CSP(内容安全策略)
设置 CSP 响应头,限制页面只能加载指定域名的 JS 脚本,禁止内联 JS 执行。就算成功注入 JS,也无法运行。
4. Cookie 设置 HttpOnly 属性
Cookie 加上 HttpOnly,JS 无法读取 Cookie。就算存在 XSS,攻击者拿不到 Cookie,大幅降低危害。
注意:HttpOnly 不能阻止 XSS,只是阻止 Cookie 窃取。
七、简单测试思路(靶场练习)
- 在输入框提交
<script>alert(1)</script>; - 观察页面是否弹出窗口;
- 查看网页源码,看输入内容有没有原样输出;
- 如果 script 被过滤,尝试 img 标签等其他 payload;
- URL 参数位置测试反射型 XSS;
- 测试 DOM XSS,观察前端 JS 是否读取 URL 参数渲染页面。
总结
XSS 的本质:网站把用户可控内容直接当成 HTML 代码输出到页面,浏览器将这段内容解析执行 JS 脚本。
三大类型:存储型、反射型、DOM 型。存储型危害最高,DOM 型容易被忽略。
防御核心思路:不要信任任何用户输入,输出的时候做 HTML 编码,搭配 CSP、HttpOnly 等防护手段。
看懂 XSS 之后,再结合 HTTP 包的知识,就能理解 payload 怎么通过请求包提交到服务器。XSS 也是 Web 安全入门必须吃透的基础漏洞。
记住:用户输入永远不可信,输出编码是防御 XSS 的核心手段。
了解网络安全,首先要搞清楚下面这些前提
- 网络安全到底包含哪些技术?是否需要会编程?
- 网络安全行业有哪些职业方向?“我”该如何选择?
- 网络安全的职业发展和成长路线是什么?
如果你是准备学习网络安全(黑客)或者正在学习,下面这些你应该能用得上:
①网络安全学习路线
②20份渗透测试电子书
③安全攻防357页笔记
④50份安全攻防面试指南
⑤安全红队渗透工具包
⑥网络安全必备书籍
⑦100个漏洞实战案例
⑧安全大厂内部视频资源
⑨历年CTF夺旗赛题解析
一、网络安全(黑客)学习路线
网络安全(黑客)学习路线,形成网络安全领域所有的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、网络安全教程视频
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。
三、网络安全CTF实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这里带来的是CTF&SRC资料&HW资料,毕竟实战是检验真理的唯一标准嘛~
四、网络安全面试题
最后,我们所有的作为都是为就业服务的,所以关键的临门一脚就是咱们的面试题内容,所以面试题板块是咱们不可或缺的部分,这里我给大家准备的就是我在面试期间准备的资料。
网安其实不难,难的是坚持和相信自己,我的经验是既然已经选定网安你就要相信它,相信它能成为你日后进阶的高效渠道,这样自己才会更有信念去学习,才能在碰到困难的时候坚持下去。
机会属于有准备的人,这是一个实力的时代。人和人之间的差距不在于智商,而在于如何利用业余时间,只要你想学习,什么时候开始都不晚,不要担心这担心那,你只需努力,剩下的交给时间!
这份完整版的网络安全学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】