开放式 Web 应用安全项目维护着最紧迫的 Web 应用安全问题的列表并定期更新。
阅读本文后,您将能够:
复制文章链接
开放式 Web 应用安全项目 (OWASP) 是致力于 Web 应用安全的国际非营利组织。OWASP 的核心原则之一是,他们的所有资料都免费提供并且可以在其网站上轻松访问,这使得任何人都能够改善自己的 Web 应用安全性。他们提供的材料包括文档、工具、视频和论坛。也许他们的最著名的项目是 OWASP Top 10。
OWASP Top 10 是一份定期更新的报告,概述了 Web 应用安全性的安全问题,重点关注 10 个最关键的风险。该报告由来自世界各地的安全专家小组汇总而成。OWASP 将 Top 10 称为“意识文档”,他们建议所有公司将该报告纳入流程中,以最大程度地减少和/或防护安全风险。
以下是 2021 年 OWASP Top 10 报告中报告的安全风险:
访问控制是指控制对信息或功能的访问权限的系统。失效的访问控制使攻击者可以绕过授权并执行任务,就像他们是管理员等特权用户一样。例如,Web 应用可能允许用户仅通过更改 url 的一部分即可更改他们登录的帐户,而无需任何其他验证。
通过确保 Web 应用使用授权令牌*并对其设置严格的控制,可以确保访问控制的安全。
*许多服务在用户登录时都会发布授权令牌。用户发出每个特权请求都需要出示授权令牌。这是确保用户身份与声称相符的安全方法,而无需他们不断输入登录凭据。
如果 Web 应用程序未使用加密技术保护财务信息和密码等敏感数据,攻击者便可获取这些数据并将其出售或用于恶意目的。他们还可以通过在途攻击窃取敏感信息。
通过加密所有敏感数据、验证所有传输并禁止缓存*任何敏感信息,可以最大限度地降低数据泄露的风险。此外,Web 应用程序开发人员应注意确保他们不会不必要地存储任何敏感数据。
*缓存是一种临时存储数据以供重用的做法。例如,网络浏览器通常会缓存网页,这样一来,如果用户在特定时间段内重新访问这些页面,浏览器就不必从 Web 获取页面。
当不被信任的数据通过表单输入或其他一些提交到 Web 应用的数据发送到代码解释器时,就会发生注入攻击。例如,攻击者可能向本应填写纯文本用户名的表单输入 SQL 数据库代码。如果该表单输入未得到正确保护,则将导致执行该 SQL 代码。这称为 SQL 注入攻击。
注入类别还包括 Cross-site scripting (XSS) 攻击,在 2017 年的报告中,XSS 被单独列为一个类别。Cross-site scripting 的缓解策略包括远离不受信任的 HTTP 请求,以及使用 ReactJS 和 Ruby on Rails 等现代 Web 开发框架,这些框架提供了一些内置的 Cross-site scripting 防护措施。
可以通过验证和/或清除用户提交的数据来防止注入攻击。(验证表示拒绝看似可疑的数据,而清理指清除数据中可疑的部分。)此外,数据库管理员可以设置控件以最大程度地减少注入攻击可能接触的信息量。
详细了解如何防止 SQL 注入。
不安全的设计包括一系列可以嵌入应用程序架构中的弱点。它侧重于应用程序的设计,而不是其实现。OWASP 列出了使用安全问题(例如“你在哪条街长大?”)进行密码恢复作为设计不安全的工作流程的示例。无论开发人员将此类工作流程实施得多么完美,应用程序仍将很容易受到攻击,因为可能不止一个人知道这些安全问题的答案。
在部署应用程序之前使用威胁建模有助于缓解这些类型的漏洞。
安全配置错误是列表上最常见的漏洞,通常是使用默认配置或显示过多详细错误的结果。例如,一个应用程序可能在向用户显示错误时描述得过于详尽,以致于揭示出应用程序中的漏洞。这种情况可以通过删除代码中任何未使用的功能并确保错误消息更加笼统来防护。
安全配置错误类别包括 XML 外部实体 (XEE) 攻击——之前在 2017 年的报告中属于单独一个类别。这是对解析 XML *输入的 Web 应用程序的攻击。此输入可以引用外部实体,以尝试利用解析器中的漏洞。在此处,“外部实体”是指存储单元,例如硬盘驱动器。攻击可以诱使 XML 解析器将数据发送到未经授权的外部实体,然后后者可以将敏感数据直接传递给攻击者。防止 XEE 攻击的最佳方法是让 Web 应用程序接受不太复杂的数据类型,例如 JSON,或者至少给 XML 解析器打补丁并禁止在 XML 应用程序中使用外部实体。
*XML 全称可扩展标记语言,是一种旨在同时实现人类可读和机器可读的标记语言。由于其复杂性和安全性漏洞,许多 Web 应用现在已经逐步淘汰了这种语言。
许多现代 Web 开发人员在其 Web 应用中使用库和框架之类的组件。这些组件是可帮助开发人员避免多余工作并提供所需功能的软件;常见的示例包括 React 等前端框架以及用于添加共享图标或 A/B 测试的小型库。一些攻击者会在这些组件中寻找漏洞,然后利用这些漏洞来组织攻击。一些较为热门的组件在数十万个网站上使用。攻击者如在其中一个组件中发现安全漏洞,就可能使数十万个站点易受攻击。
组件开发人员通常会提供安全补丁和更新程序来修补已知漏洞,但 Web 应用程序开发人员并不总是在其应用程序上运行组件的修补版本或最新版本。为了最大程度地降低运行具有已知漏洞的组件的风险,开发人员应从项目中删除未使用的组件,并确保他们从可靠的来源接收最新的组件。
攻击者可以通过身份验证(登录)系统中的漏洞访问用户帐户,甚至可以使用管理员帐户来破坏整个系统。例如,攻击者可以获取一个包含在数据泄露中获得的数千个已知用户名/密码组合的列表,并使用脚本尝试在登录系统上尝试所有这些组合,以查看是否有任何有效的组合。
一些防护身份验证漏洞的策略要求双要素身份验证 (2FA) 以及使用 Rate Limiting 限制或延迟重复的登录尝试。
如今,许多应用程序的功能依赖于第三方插件和其他外部来源,但却无法始终确保来自这些来源的更新和数据没有被篡改并且来自预期位置。例如,如果应用程序自动接受来自外部来源的更新,则很可能接受攻击者上传的恶意更新,并将其分发给安装该应用程序的所有用户。此类别还包括不安全的反序列化漏洞:这些攻击是对来自不受信任来源的数据进行反序列化的结果,并且可能导致严重后果,如 DDoS 攻击和远程代码执行攻击。
为了帮助确保数据和更新的完整性没有受到侵犯,应用程序开发人员应使用数字签名来验证更新,检查其软件供应链,并确保持续集成/持续部署 (CI/CD) 管道具有强大的访问控制且正确配置。
许多 Web 应用没有采取足够的措施来检测数据泄露。漏洞发生后,平均发现时间约为 200 天。这使攻击者有大量时间在开发人员没有任何响应之前造成破坏。OWASP 建议 Web 开发人员实施日志记录和监视以及事件响应计划,以确保他们了解应用程序遭到的攻击。
服务器端请求伪造 (SSRF) 是一种攻击,攻击者向服务器发送 URL 请求,导致服务器获取意外资源,即使该资源本该受到保护。例如,攻击者可能会发送对 www.example.com/super-secret-data/
的请求,即使 Web 用户不应该能够导航到该位置,并从服务器的响应中获取超级机密数据。
有多种方法可以缓解 SSRF 攻击,其中最重要的方法之一是验证来自客户端的所有 URL。服务器不应该对无效的 URL 直接做出原始响应。
有关 OWASP Top 10 的更多技术信息和深入信息,请参阅官方报告。