业务逻辑漏洞
Last updated
Last updated
在本节中,我们将介绍业务逻辑漏洞的概念,解释它们是如何由于对用户行为的错误假设而产生的。我们会讨论逻辑缺陷的潜在影响,并教你如何利用它们。你还可以使用我们的交互式实验来练习所学到的知识,这些实验是基于我们在现实中遇到的真实漏洞。最后,我们会提供一些通用的最佳实践,以帮助你防止在自己的应用程序中出现这类逻辑缺陷。
Labs
如果你已经熟悉业务逻辑漏洞背后的基本概念,并且只想在一些真实的、故意易受攻击的目标上练习利用它们,你可以从下面的链接中访问该主题中的所有实验。
业务逻辑漏洞是应用程序设计和实现中的缺陷,允许攻击者引发未预期的行为。这可能使攻击者能够操纵合法的功能来达到恶意的目的。这些缺陷通常是由于未能预见到可能发生的异常应用状态,从而未能安全地处理它们。
注意
在这个语境中,“业务逻辑”一词只是指定义应用程序如何运作的一组规则。由于这些规则并不总是与业务直接相关,所以相关的漏洞也被称为“应用逻辑漏洞”或简称为“逻辑缺陷”。
逻辑缺陷往往对那些并非专门寻找它们的人是不可见的,因为它们通常不会在应用程序的正常使用中暴露。然而,攻击者可能会通过以开发人员从未预料到的方式与应用程序进行交互,来利用行为上的怪异之处。
业务逻辑的主要目的之一是强制执行在设计应用程序或功能时定义的规则和限制。广义上讲,业务规则决定了当一个给定的场景发生时,应用程序应该如何反应。包括阻止用户做出对业务产生负面影响或根本没有意义的事情。
逻辑上的缺陷可以让攻击者绕过这些规则。例如,他们可能不通过预定的购买流程就能完成交易。在其他的情况中,对用户提供的数据进行破坏性或不存在的验证,可能允许用户对关键交易的值进行任意修改,或提交无意义的输入。通过将未预期的值传入服务器端逻辑,攻击者可能诱使应用程序做出一些它不应该做的事情。
基于逻辑的漏洞可能极其多样化,而且通常是应用程序及其特定功能所特有的。识别它们通常需要一定的人类知识,比如对业务领域的理解,或者对攻击者在给定环境中可能有什么目标的了解。这使得它们难以通过自动化的漏洞扫描器进行检测。因此,逻辑缺陷一般是对漏洞赏金猎人和手动测试人员的一个大好目标。
业务逻辑漏洞的出现通常是因为设计和开发团队对用户将如何与应用程序进行交互做出了错误的假设。这些错误的假设可能导致对用户输入的验证不足。例如,如果开发人员假设用户只通过Web浏览器传递数据,那么应用程序可能完全依赖薄弱的客户端控制来验证输入。攻击者使用截断代理很容易绕过这些。
最终,意味着当攻击者偏离预期的用户行为时,应用程序未能采取适当的步骤来防止这种情况,因此,未能安全地处理这种情况。
逻辑缺陷在过于复杂的系统中尤其常见,即使是开发团队自己也无法完全了解。为了避免逻辑缺陷,开发人员需要从整体上理解应用程序。包括意识到不同的功能如何以意想不到的方式组合。从事大型代码库工作的开发人员可能对应用程序的所有领域如何工作没有深入的了解。在一个组件上工作的人可能对另一个组件的工作方式做出有缺陷的假设,结果可能无意中引入严重的逻辑缺陷。如果开发人员没有明确记录正在做出的任何假设,那么这些类型的漏洞就很容易潜入应用程序。
业务逻辑漏洞的影响有时可能相当微不足道。它是一个广泛的类别,其影响高度变化。然而,如果攻击者能以正确的方式操纵应用程序,任何未预期的行为都可能导致高危的攻击。因此,即使你自己不知道如何利用它,也应该修复怪异的逻辑。总有其他人能够利用到的风险。
从根本上说,任何逻辑缺陷的影响都取决于它与什么功能有关。例如,如果缺陷存在于认证机制中,可能对你的整体安全产生严重影响。攻击者可能利用这一点进行权限提升,或完全绕过认证,获得对敏感数据和功能的访问。这也会为其他利用暴露出更大的攻击面。
金融交易中存在缺陷的逻辑显然会导致通过窃取资金、欺诈等方式对企业造成巨大损失。
你还应该注意,即使逻辑缺陷不会让攻击者直接受益,它们仍可能使恶意方能够以某种方式损害企业。
理解业务逻辑漏洞最好的方法是查看现实世界中的示例,并从所犯的错误中学习。我们提供了各种常见的逻辑缺陷的具体示例,以及一些故意存在漏洞的网站,以便你可以自己练习利用这些漏洞。
阅读更多
简而言之,防范业务逻辑漏洞的关键是:
确保开发人员和测试人员了解应用程序所服务的领域
避免对用户行为或应用程序其他部分的行为做出隐含的假设
你应该确定自己对服务器端的状态做出了哪些假设,并实现必要的逻辑来验证这些假设是否满足。包括在继续之前确保任何输入的值都是合理的。
同样重要的是,确保开发人员和测试人员都能充分理解这些假设,以及应用程序在不同场景下应该如何反应。这有助于团队尽早发现逻辑缺陷。为了促进这一点,开发团队应尽可能遵循以下最佳实践:
为所有事务和工作流程维护清晰的设计文档和数据流,记录每个阶段所做的任何假设。
尽可能清晰地编写代码。如果很难理解应该发生什么,就很难发现任何逻辑缺陷。理想情况下,编写良好的代码不需要文档来理解。在不可避免的复杂情况下,编写清晰的文档至关重要,以确保其他开发人员和测试人员知道正在做出什么假设,以及预期的行为到底是什么。
注意任何对其他代码的引用,其中使用的每个组件。如果恶意方以不寻常的方式操纵这些依赖项,考虑这些依赖项可能产生的任何副作用。
由于许多逻辑缺陷相对独特的性质,很容易将它们视为人为错误造成的一次性错误并忽视它们。然而,正如我们所展示的,这些缺陷通常是在构建应用程序的初始阶段存在不良实践的结果。分析一个逻辑缺陷首先为什么存在以及它是如何被团队忽略的,可以帮助你发现流程中的弱点。通过细微的调整,你可以增加类似缺陷在源头上被消除或在开发过程中更早被发现的可能性。