博客

程序员攻克安全难题:分享与学习——跨站脚本攻击 (XSS)

September 25, 2024
Jaap Karan Singh

自 21 世纪初以来,跨站脚本攻击 (XSS) 一直是安全专业人员的心头大患。令人遗憾的是,几十年过去了,它依然是代码层面最常见的威胁之一。这类软件漏洞长期困扰着我们,而 CISA 最近作为其“安全设计”(Secure-by-Design) 运动的一部分,发布了一项旨在彻底根除该漏洞的警报。他们的全球使命是在大规模范围内消除各类漏洞,这种对开发者驱动型安全的关注确实能够产生深远影响。但这需要那些致力于为开发者创造安全成功环境的智慧企业共同努力。

那么,XSS 到底是什么?

网络浏览器或许是我们通往精彩在线世界的门户,但遗憾的是,并非所有信息都是安全的。浏览器固有的行为模式可能成为安全漏洞的催化剂。浏览器最初的设计逻辑是无条件信任并执行所接收到的标记语言。在功能被恶意利用之前,这看起来一切正常……但攻击者最终还是发现了利用这一特性来达成其邪恶目的的方法。

跨站脚本攻击利用浏览器对网站的信任以及用户对安全防范的疏忽,窃取数据、劫持账户并篡改网页;这是一种可能迅速演变成严重安全问题的漏洞。

让我们来看看 XSS 是如何工作的,它会造成哪些损害,以及如何预防它:

XSS 是如何工作的?

当不可信的输入(通常是数据)在页面上呈现为输出,却被误解为可执行代码时,就会发生 XSS。攻击者可以将恶意可执行代码(HTML 标签、JavaScript 等)放入输入参数中,当这些参数返回给浏览器时,它们会被执行,而不是作为数据进行显示。

如上所述,该漏洞源于浏览器的核心运行机制,即难以区分数据与可执行代码。Web 的运行模式如下:

  1. 用户访问网页
  2. 页面告知浏览器加载哪些文件以及执行哪些内容
  3. 浏览器无条件执行页面上的所有内容

这种功能带来了我们在网络上享受到的许多精彩、互动的体验。但硬币的另一面是,它也导致了代价高昂的漏洞和攻击。

当攻击者将恶意脚本添加到易受攻击的网站时,它会被无条件执行。系统既没有进行深入调查,也没有部署检测措施。

Custom javascript code could be executed in the browsers of your users

XSS 分为三种类型:

  • 存储型 XSS
  • 反射型 XSS
  • DOM 型 XSS

存储型 XSS 指攻击者能够将恶意脚本持久地存储在应用程序的数据字段中(例如存储用户手机号码的字段)。每当该数据字段在应用程序中显示时,这段恶意脚本就会被发送到用户的浏览器中。

这种攻击常见于论坛或评论系统。攻击者在评论中输入恶意脚本,砰——每个查看该评论的用户都会在不知情的情况下执行该脚本。

反射型 XSS 指用户输入被原样反射回用户的浏览器。例如,搜索框在获取搜索结果时向用户显示“您搜索了……”。

现在,想象一下搜索功能是通过将搜索词作为查询参数放在 URL 中来实现的。恶意攻击者可以向受害者发送一个在这些参数中嵌入了恶意脚本的链接,说实话,大多数网络用户几乎不会察觉到这一点。

受害者点击链接后被重定向到一个钓鱼网站,并在不知情的情况下输入了该网站的密码。他们几乎没有意识到,攻击者刚刚窃取了他们账户的钥匙。

DOM 型 XSS 是该漏洞中相对较新的一种。它利用了 Angular 和 React 等许多 UI 框架中复杂的模板结构。

这些模板允许动态内容和丰富的 UI 应用。如果使用不当,它们就可能被用来执行 XSS 攻击。

好了,这就是 XSS 的概况。让我们深入探讨它如何被用于破坏性目的。

为什么 XSS 如此危险?

XSS 可用于将用户重定向到恶意网站、窃取 Cookie 并搜寻会话数据。基本上,JavaScript 能做的事情,XSS 攻击也都能做到。

以下是三个 XSS 攻击的例子:

  1. 雅虎邮箱用户的会话 Cookie 被窃取,使用的是 2015 年的 XSS 漏洞。
  2. Samy 蠕虫是通过 MySpace 的 XSS 漏洞传播的。它至今仍是有史以来传播速度最快的恶意软件,在短短 20 小时内感染了 100 万用户。
  3. eBay 曾允许在产品描述中包含恶意脚本。这导致了针对 eBay 用户的 XSS 攻击。

XSS 攻击看似简单,实则非常严重。它们可能导致会话、用户凭据或敏感数据的窃取。声誉受损和收入下降是这些攻击带来的主要危害。即使只是篡改网站,也可能给企业带来不良后果。

然而,像您这样精明的安全战士完全可以击败 XSS。修复方法并不复杂,自 XSS 成为常用攻击手段以来,行业已经取得了长足的进步。

您可以击败 XSS。

击败 XSS 的关键在于理解上下文。具体来说,就是用户输入被渲染回客户端的上下文,以及它被渲染回的位置。是在 HTML 代码内部,还是在 JavaScript 片段内部。

如果用户输入不需要发送回浏览器,那是最好的。但如果必须发送,通常应该进行 HTML 编码。对输出进行 HTML 编码会告诉浏览器将内容按原样显示,而不是执行它。

输入验证也很重要。然而,验证和白名单并不是万无一失的解决方案。编码更进一步,阻止浏览器执行恶意脚本。验证和白名单策略未捕获的内容,编码都能处理。

许多框架现在会自动对 HTML 输出进行编码。
Angular、ASP.NET MVC 和 React.js 都是默认使用 HTML 编码的框架。您必须通过调用特定方法明确告知这些框架不要进行编码。

大多数其他框架(例如 Django 和 Spring)都有标准的 XSS 防御库,您可以轻松地将其集成到代码中。

最大的挑战是学会分析用户输入进入系统的所有途径,以便时刻保持警惕。查询参数和 POST 参数都可能携带攻击。跟踪数据在整个应用程序中的流动,不要信任任何来自外部的数据。

像边境巡逻一样思考。拦截每一条数据,检查它,如果看起来可疑就拒绝进入。然后在渲染时进行编码,以确保任何漏网之鱼也不会造成问题。

执行这些策略,您的用户就能免受 XSS 攻击。查看 OWASP 备忘单,获取更多保护数据安全的技巧。

抵御 XSS,提升您的安全技能。

XSS 在 OWASP Top 10 2017 年 Web 安全风险列表中排名第七。它已经存在很长一段时间了,但如果您不小心,它仍然可能出现并导致应用程序出现问题。

对于开发者而言,在编写代码时培养安全第一的思维至关重要。而且,当培训模拟真实应用场景并使用开发者正在使用的语言时,效果总是最好的。考虑到这一点,何不查看我们的学习资源以了解更多关于 XSS 的信息?之后,您就可以开始培训和实践,从而迈向精通之路。

Think youre ready to find and fix XSS vulnerabilities right now? Challenge yourself on the Secure Code Warrior platform.

标语

在 AI 驱动的开发成果发布前实现有效治理

评估 AI 辅助风险,在提交代码时强制执行安全编码策略,并加速整个软件开发生命周期的安全交付。

预约演示
资源库

探索更多博客

获取有关安全编码、人工智能治理和软件风险管理的专家内容。

浏览全部
案例研究
筛选标签
这是 div 块中的一段文本。

Supercharged Security Awareness: How Tournaments are Inspiring Developers at Erste Group

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.

了解更多
案例研究
筛选标签
这是 div 块中的一段文本。

Security as culture: How Blue Prism cultivates world-class secure developers

Learn how Blue Prism, the global leader in intelligent automation for the enterprise, used Secure Code Warrior's agile learning platform to create a security-first culture with their developers, achieve their business goals, and ship secure code at speed

了解更多
案例研究
筛选标签
这是 div 块中的一段文本。

统一的安全文化:Sage 如何打造其安全倡导者项目

了解 Sage 如何通过灵活且以关系为导向的方法提升安全性,成功培养了 200 多名安全倡导者,并实现了显著的风险降低。

了解更多
博客
筛选标签
这是 div 块中的一段文本。

2026年网络安全意识月:理解人工智能安全对企业防御至关重要

目前,大多数顶级人工智能公司已公开呼吁全球放缓人工智能的发展速度,以便安全防护措施能够跟上步伐。然而事实是,严重的安全问题已经显现。随着人工智能实施带来的经济成本和风险不断累积,无数安全领导者和高管团队正处于紧迫的境地。

了解更多
博客
筛选标签
这是 div 块中的一段文本。

赋能要素 8:打造项目品牌

成功的安全编码项目不仅需要优质的内容。赋能要素 8 展示了如何通过品牌化将参与过程转变为一种令人向往、以地位为驱动的体验。

了解更多
博客
筛选标签
这是 div 块中的一段文本。

每一位员工现在都处于 AI 网络安全的最前线

企业技术格局正以一种鲜有人预料到的速度发生剧变,直到为时已晚。我们已正式跨越了从人工编写代码和基础辅助编程,进入“智能体开发生命周期”(ADLC)的时代。虽然自主 AI 智能体有望在多个职能领域实现前所未有的效率,但它们也带来了全新的安全和监管风险。

了解更多

在产品发布前确保 AI 驱动的开发安全

洞察开发风险,执行安全策略,并在整个软件开发生命周期中预防漏洞。

预约演示
未找到相关项目。