XSS跨站脚本攻击漏洞(Cross Site Scripting)

发布于:2025-03-22 ⋅ 阅读:(19) ⋅ 点赞:(0)

前提概要

本文章主要用于分享XSS跨站脚本攻击漏洞基础学习,以下是对XSS跨站脚本攻击漏洞的一些个人解析,请大家结合参考其他文章中的相关信息进行归纳和补充。


XSS跨站脚本攻击漏洞描述

        跨站脚本攻击(XSS)漏洞是一种常见且危害较大的网络安全隐患。它产生的根源主要在于网站对用户输入的验证不足,以及输出处理不当,使得攻击者有机可乘。

        当存在此类漏洞时,攻击者能够将恶意脚本注入目标网站。攻击类型多样,反射型 XSS 攻击者构建含恶意脚本的 URL,诱使用户点击,服务器响应后脚本在用户浏览器执行;存储型 XSS 则是攻击者将恶意脚本存入服务器,众多访问相关页面的用户都会因服务器返回的恶意内容而遭受攻击;DOM 型 XSS 通过篡改页面 DOM 树注入脚本。这些恶意脚本一旦在用户浏览器中执行,可能导致用户信息泄露,如登录凭证被盗取,或是网站被恶意篡改,严重威胁用户隐私与网站安全 。

XSS跨站脚本攻击漏洞原理

XSS 跨站脚本攻击漏洞的原理是攻击者利用网站对用户输入或输出处理不当的漏洞,将恶意脚本注入到目标网站中。当用户访问该网站时,浏览器会误认为这些恶意脚本是合法的,从而执行它们,导致用户的信息泄露、权限被滥用或其他恶意行为发生。根据注入方式和执行机制的不同,XSS 攻击主要分为以下三种类型:

 
  • 反射型 XSS:攻击者构造包含恶意脚本的 URL,诱使用户点击。服务器接收并处理该请求时,将用户输入的恶意脚本反射到响应页面中,返回给用户浏览器。浏览器解析页面时执行恶意脚本,从而实现攻击。这种攻击通常是一次性的,依赖用户主动点击恶意链接。
  • 存储型 XSS:攻击者将恶意脚本提交到目标网站的数据库或其他存储介质中,例如通过留言板、评论区等功能。当其他用户访问包含该恶意脚本的页面时,服务器从存储介质中读取并将恶意脚本发送给用户浏览器,浏览器执行脚本,导致攻击发生。存储型 XSS 攻击的影响范围更广,因为只要有用户访问相关页面,就可能受到攻击。
  • DOM 型 XSS:攻击者通过修改页面的 DOM 结构来注入恶意脚本。这种攻击主要发生在客户端,利用浏览器中 DOM 操作的漏洞,当用户与页面进行交互时,恶意脚本被执行。例如,攻击者通过修改 URL 参数或其他方式,改变页面中某些元素的属性或内容,从而注入并执行恶意脚本。与前两种类型不同,DOM 型 XSS 攻击不依赖服务器端的响应,完全在客户端的浏览器环境中进行。

XSS跨站脚本攻击漏洞场景

  1. URL 参数处理处:服务器或客户端对 URL 参数验证过滤不足,引发反射型 XSS。
  2. 表单输入模块:各类表单元素输入处理不当,易出现反射型或存储型 XSS。
  3. 搜索框功能区:搜索结果页面直接嵌入用户输入,产生反射型 XSS。
  4. 评论与留言系统:存储和展示环节未严格过滤,是存储型 XSS 温床。
  5. 用户资料修改处:对输入验证不充分,导致存储型 XSS。
  6. 富文本编辑器:输入过滤及内容处理不当,引发 XSS 漏洞。
  7. JSONP 回调处理:回调函数名验证缺陷,造成基于 JSONP 的 XSS。
  8. 动态 HTML 模板引擎:渲染时对数据转义过滤不足致 XSS。
  9. 浏览器本地存储操作:存读数据缺安全处理,引发 XSS。
  10. 日志记录与展示:日志未过滤恶意输入,查看时触发 XSS 。

XSS跨站脚本攻击漏洞危害

XSS 跨站脚本攻击漏洞可能导致多方面的危害,主要包括以下几点:

  • 用户信息泄露:攻击者可通过恶意脚本窃取用户的敏感信息,如登录凭证、账号密码、个人资料、联系方式等。这些信息一旦落入攻击者手中,可能会被用于盗刷用户账户资金、冒充用户身份进行网络诈骗、贩卖个人信息等违法活动,给用户带来严重的经济损失和隐私侵犯。
  • 网站被篡改:攻击者利用 XSS 漏洞注入恶意脚本,能够对网站页面进行篡改。他们可能会修改网站的内容,替换正常的页面元素,插入虚假广告、恶意链接或其他有害信息,影响网站的正常运营和形象,降低用户对网站的信任度,同时也可能误导用户进行一些危险操作。
  • 发起钓鱼攻击:通过 XSS 攻击,攻击者可以在目标网站上创建虚假的登录页面或其他欺骗性界面,诱使用户输入敏感信息。由于这些页面看起来与真实的网站页面非常相似,用户很难察觉其中的差异,从而容易上当受骗,进一步导致个人信息和资金的损失。
  • 传播恶意软件:恶意脚本还可以用来传播恶意软件,如病毒、木马等。当用户访问被攻击的网站时,浏览器执行恶意脚本,自动下载并安装恶意软件到用户的设备上,从而控制用户设备,窃取设备中的数据,或者利用用户设备作为跳板进一步攻击其他网络设备。
  • 实施 DDoS 攻击:攻击者可以利用 XSS 漏洞控制大量用户的浏览器,组成僵尸网络,然后向目标服务器发送大量请求,从而导致服务器瘫痪,无法正常提供服务,即分布式拒绝服务(DDoS)攻击。这种攻击不仅会影响网站的正常运行,还可能给网站所有者带来巨大的经济损失和业务影响。

XSS跨站脚本攻击漏洞评级

XSS 跨站脚本攻击漏洞评级主要分四级。严重级能让攻击者完全掌控用户浏览器,窃取关键敏感信息或冒用用户身份执行核心操作。高危级可使攻击者获取大量敏感数据,严重破坏网站核心功能。中危级可被用于篡改页面、展示误导信息等恶意行为,但影响相对有限。低危级利用条件苛刻,仅产生轻微视觉干扰或对用户体验有极小影响,基本不威胁用户数据与网站安全 。

XSS跨站脚本攻击漏洞形式

  • 反射型 XSS:也称为非持久型 XSS。攻击者构造包含恶意脚本的 URL,诱使用户点击。服务器接收请求后,将恶意脚本反射给用户浏览器执行。这种攻击通常是一次性的,脚本不会存储在服务器上(存储在url),如攻击者通过电子邮件发送包含恶意脚本的链接,用户点击后触发攻击。
  • 存储型 XSS:又称持久型 XSS。攻击者将恶意脚本存入服务器,如在论坛发帖、评论等位置输入恶意代码。当其他用户访问相关页面时,服务器会将恶意脚本发送给用户浏览器执行。这种攻击影响范围广,只要访问该页面的用户都会受到攻击。
  • DOM 型 XSS:通过修改页面的 DOM 树来注入恶意脚本。攻击者利用浏览器端脚本对 DOM 操作的漏洞,在用户浏览器本地修改页面结构,插入并执行恶意脚本,不涉及服务器端的数据处理。例如,通过修改 URL 参数导致页面 DOM 被恶意修改,进而执行脚本。

按攻击目标分类

  • 针对用户的 XSS 攻击:主要目的是窃取用户的敏感信息,如登录凭证、个人资料等,或者以用户的身份在网站上执行操作。攻击者通过注入恶意脚本,获取用户在浏览器中输入的信息,然后将这些信息发送到自己的服务器。
  • 针对网站的 XSS 攻击:旨在破坏网站的正常运行,篡改网站的内容,影响网站的声誉和可用性。例如,攻击者可能会利用 XSS 漏洞在网站页面上插入大量广告、恶意链接或破坏页面的布局,使网站无法正常展示给用户。

按攻击载体分类

  • 基于 HTML 的 XSS 攻击:攻击者利用 HTML 标签和属性的特性,注入恶意脚本。例如,通过在<img>标签的src属性中插入恶意脚本,当浏览器加载该图片时,就会执行脚本。
  • 基于 JavaScript 的 XSS 攻击:直接注入 JavaScript 代码,利用浏览器对 JavaScript 的执行机制来实现攻击。这是最常见的 XSS 攻击方式,因为 JavaScript 可以直接操作浏览器的 DOM、发送网络请求等,具有很强的攻击性。
  • 基于 CSS 的 XSS 攻击:虽然 CSS 本身不能直接执行代码,但攻击者可以利用 CSS 的一些特性,如@import规则、url()函数等,来加载恶意的 CSS 文件或执行一些间接的攻击行为,例如通过 CSS 样式改变页面的布局,误导用户进行一些操作。

按传播途径分类

  • 主动式 XSS 攻击:攻击者通过直接发送恶意链接或利用社会工程学手段,诱使用户主动访问包含恶意脚本的页面。例如,通过电子邮件、即时通讯工具等发送钓鱼链接,用户点击后就会触发攻击。
  • 被动式 XSS 攻击:攻击者将恶意脚本隐藏在正常的网站内容中,等待用户访问该网站时自动触发攻击。这种攻击方式通常利用网站的漏洞,将恶意脚本注入到网站的页面中,用户在浏览网站时不知不觉地受到攻击。

XSS跨站脚本攻击漏洞验证

portswigger靶场

1.

2.

3.

4.

<img src=1 onerror=alert(1)>

在这段代码中:
        <img>是 HTML 中的图像标签,用于在网页上显示图片。
        src是<img>标签的一个属性,它指定了要加载的图像的来源(路径或 URL)。这里src的值被设置为1,这不是一个有效的图片路径或 URL,所以浏览器会无法加载该图片,从而引发一个错误。
        onerror是<img>标签的一个事件属性,当图像加载过程中出现错误时,浏览器会触发onerror事件,然后执行onerror后面指定的 JavaScript 代码。在这里,onerror后面跟着alert(1),这是一个简单的 JavaScript 函数调用,alert函数会弹出一个警告框,显示数字1。
如果这段代码被包含在一个网页中,并且用户的浏览器尝试加载这个网页,那么当浏览器解析到这个<img>标签时,由于src属性值无效导致图像加载错误,就会触发onerror事件,进而执行alert(1),弹出警告框。

5.

6.

7.

"onmouseover="alert(1)

8.

9.

'-alert(1)-'

10.

XSS跨站脚本攻击漏洞防御措施

输入验证和过滤
  • 白名单验证:在服务器端,对用户输入的数据进行严格验证,只允许符合预定义规则的字符和内容通过。例如,对于用户的用户名输入,只允许字母、数字和特定的符号,其他字符则拒绝。
  • 过滤特殊字符:对用户输入中的特殊字符进行过滤或转义,如将< 转换为 &lt;> 转换为 &gt;,这样可以防止恶意脚本的注入。例如,在 PHP 中可以使用 htmlspecialchars 函数进行转义。
  • 验证数据类型和长度:确保用户输入的数据类型和长度符合预期。例如,对于年龄输入,验证其是否为数字且在合理范围内。
输出编码
  • HTML 实体编码:在将用户输入的数据输出到 HTML 页面时,进行 HTML 实体编码,将特殊字符转换为对应的 HTML 实体。这样可以确保即使输入中包含恶意脚本,也不会被浏览器执行。
  • JavaScript 编码:如果需要在 JavaScript 代码中输出用户输入的数据,要进行适当的编码,避免脚本注入。例如,使用 JSON.stringify 对数据进行编码。
  • CSS 编码:当将用户输入的数据用于 CSS 样式时,同样需要进行编码,防止恶意的 CSS 注入。
配置 HTTP 头信息
  • Content-Security-Policy(CSP):通过设置 CSP 头信息,限制页面可以加载的资源来源,只允许从指定的域名加载脚本、样式表和其他资源,从而防止恶意脚本的加载和执行。例如,设置 Content-Security-Policy: default-src'self'; script-src'self' trusted - domain.com 表示只允许从当前域名和 trusted - domain.com 加载脚本。
  • X-XSS-Protection:虽然现代浏览器对 XSS 攻击有一定的内置防护机制,但仍然可以通过设置 X-XSS-Protection 头信息来增强防护。例如,设置 X-XSS-Protection: 1; mode = block 可以让浏览器在检测到 XSS 攻击时阻止页面加载。
框架和库的安全使用
  • 使用安全的框架:选择具有良好安全机制的 Web 框架,这些框架通常会提供输入验证、输出编码等功能,帮助开发者避免常见的 XSS 漏洞。例如,Django、Ruby on Rails 等框架都有相应的安全防护措施。
  • 及时更新依赖库:保持框架和库的版本更新,及时修复已知的安全漏洞,避免因使用过时的库而引入安全风险。
前端验证和防护
  • 前端输入验证:在前端页面使用 JavaScript 进行输入验证,给用户提供即时的反馈,提示用户输入不符合要求。但需要注意的是,前端验证不能替代服务器端验证,因为攻击者可以绕过前端验证。
  • 使用 HttpOnly 和 Secure 属性:对于存储敏感信息的 Cookie,设置 HttpOnly 属性可以防止 JavaScript 脚本访问 Cookie,设置 Secure 属性可以确保 Cookie 只通过 HTTPS 协议传输,减少被窃取的风险。
安全意识培训
  • 开发者培训:对开发人员进行安全培训,提高他们对 XSS 攻击的认识和防范意识,使其在开发过程中遵循安全编码规范。
  • 用户教育:向用户宣传 XSS 攻击的风险,提醒用户不要随意点击不明来源的链接,避免在不可信的网站上输入敏感信息。

XSS跨站脚本攻击漏洞相关名词

  1. Blind XSS(盲打型 XSS):攻击者将恶意脚本注入到应用程序中,该脚本不会在正常的页面显示中立即执行,而是在应用程序的其他部分(通常是管理员或其他特权用户访问的后台页面)执行。由于攻击者无法直接看到攻击结果,需要采用一些特殊的技术来确认攻击是否成功,比如利用外部服务器日志记录或监控特定的网络流量。
  2. XSS Chaining(XSS 链):攻击者结合多个不同的 XSS 漏洞或者与其他类型的漏洞(如 CSRF、SQL 注入等)组合使用,以实现更复杂和严重的攻击。例如,先利用一个 XSS 漏洞获取用户的会话信息,再使用这个会话信息进行跨站请求伪造攻击。
  3. XSS Worm(XSS 蠕虫):这是一种特殊的 XSS 攻击,恶意脚本会自我复制并在不同用户之间传播。当一个用户访问包含 XSS 蠕虫的页面时,脚本会自动修改页面内容,将自身传播到其他用户可能访问的链接或页面中,从而迅速感染大量用户。
  4. Anti - XSS Library(反 XSS 库):开发人员可以使用的工具库,用于对用户输入和输出进行安全过滤和编码,防止 XSS 攻击。这些库通常提供了各种函数和方法,帮助开发者处理不同类型的数据,确保数据在使用过程中不会引发 XSS 漏洞。
  5. XSS Auditor:部分浏览器内置的一种安全机制,用于检测和阻止反射型 XSS 攻击。当浏览器检测到可能存在的 XSS 攻击时,会自动阻止脚本的执行,并对页面进行相应的处理,以保护用户的安全。
  6. XSS Payload Generator(XSS 有效载荷生成器):攻击者使用的工具,可根据不同的攻击场景和目标,自动生成合适的恶意脚本(即有效载荷)。这些工具可以帮助攻击者快速构造出能够绕过目标网站防御机制的 XSS 攻击代码。
  7. XSS Obfuscation(XSS 代码混淆):攻击者为了绕过防御机制,会对恶意脚本进行混淆处理,使其看起来不像是正常的脚本代码。例如,使用编码、加密、拆分代码等技术,让 XSS 过滤器难以识别恶意脚本。
  8. Payload(有效载荷):在 XSS 攻击中,指攻击者注入的恶意脚本或代码,用于实现特定的攻击目的,如窃取用户信息、执行非法操作等。
  9. Vector(攻击向量):指攻击者利用 XSS 漏洞进行攻击的方式或途径,例如通过 URL 参数、表单输入、HTTP 请求头字段等将恶意脚本注入到目标系统中。
  10. Sanitization(数据净化):对用户输入的数据进行处理,去除或转义其中可能包含的恶意字符和脚本,以防止 XSS 攻击。这是一种常见的防御措施,通过对输入数据进行严格的验证和过滤,确保数据的安全性。
  11. Encoding(编码):将数据转换为特定的格式,以便在传输和存储过程中避免数据被误解或篡改。在 XSS 防御中,常使用 HTML 编码、URL 编码等方式对用户输入进行处理,将特殊字符转换为安全的表示形式,防止脚本注入。
  12. CSP(Content - Security - Policy,内容安全策略):一种 HTTP 头信息,用于指定页面可以加载的资源来源,限制浏览器从非信任的源加载脚本、样式表、图片等资源,从而有效防止 XSS 攻击。通过 CSP,网站管理员可以明确允许或禁止某些来源的资源加载,增强网站的安全性。
  13. HttpOnly:是 Cookie 的一个属性,设置了 HttpOnly 的 Cookie 不能被客户端脚本(如 JavaScript)访问,只能通过 HTTP 协议由服务器进行读写操作。这可以防止攻击者通过 XSS 攻击窃取用户的 Cookie 信息,从而保护用户的登录状态和其他敏感信息。
  14. Exploit(漏洞利用):指攻击者利用 XSS 漏洞编写的代码或程序,用于触发漏洞并执行恶意操作,以达到攻击目的。
  15. Vulnerability Scanner(漏洞扫描器):一种工具,用于检测网站或应用程序中是否存在 XSS 等安全漏洞。它通过发送各种测试请求,分析响应来发现可能存在的安全隐患。
  16. XSS Filter(XSS 过滤器):用于检测和阻止 XSS 攻击的工具或机制,通常部署在服务器端或网络设备上,对用户输入和输出的数据进行检查,识别并过滤掉可能包含恶意脚本的内容。
  17. JavaScript Injection(JavaScript 注入):XSS 攻击的一种常见形式,攻击者将恶意的 JavaScript 代码注入到目标页面中,使其在用户浏览器中执行,从而实现对用户的攻击。
  18. HTML Injection(HTML 注入):攻击者尝试将恶意的 HTML 代码注入到目标页面中,可能会改变页面的结构和内容,有时也可用于触发 XSS 攻击,例如通过注入包含恶意脚本的 HTML 标签。
  19. Phishing(网络钓鱼):虽然不完全等同于 XSS,但常常与 XSS 结合使用。攻击者通过 XSS 攻击获取用户的敏感信息,如用户名、密码等,然后利用这些信息进行网络钓鱼,冒充合法用户进行各种欺诈活动。
  20. Session Hijacking(会话劫持):攻击者利用 XSS 漏洞获取用户的会话标识(如会话 ID),然后使用该标识冒充用户身份,在用户的会话中执行操作,获取用户的敏感信息或进行其他恶意行为。
  21. Canonicalization(规范化):在处理用户输入时,将数据转换为标准的、规范的形式,以防止攻击者利用不同的字符编码或特殊字符组合来绕过输入验证和过滤机制,从而避免 XSS 攻击。
  22. Polyglot Attack(多语言攻击):攻击者构造的恶意代码可以在多种不同的环境或解释器中执行,例如同时利用 HTML、JavaScript 和 CSS 等多种语言的特性来实施 XSS 攻击,增加攻击的复杂性和隐蔽性。
  23. Web Shell:攻击者通过 XSS 等漏洞上传到目标服务器的一个脚本程序,它可以为攻击者提供一个远程控制服务器的接口,使攻击者能够执行各种命令,进一步控制服务器或窃取数据。

个人疑问

反射型XSS为什么是一次性攻击?
  • 攻击触发机制:反射型 XSS 攻击依赖用户点击包含恶意脚本的特定 URL 来触发。当用户点击该 URL 后,服务器将恶意脚本作为响应的一部分反射给用户浏览器,浏览器执行脚本从而引发攻击。但这个过程仅在用户点击链接的当下发生,一旦用户关闭相关页面或进行其他操作,攻击行为就会停止,不会像存储型 XSS 那样,恶意脚本被存储在服务器端,持续对访问相关页面的用户造成威胁。
  • URL 的一次性特征:攻击所用的恶意 URL 通常是针对特定目标和场景构造的,具有一次性使用的特点。攻击者需要诱骗用户点击这个特定的 URL 才能实施攻击,而用户一旦点击过该 URL,再次点击的可能性较低,且其他用户一般不会轻易点击与自己无关的陌生 URL。所以,从攻击的触发和传播角度来看,反射型 XSS 攻击往往是一次性的,难以形成持续性的攻击效果。
攻击方向不同,使用的恶意代码分别是什么?