1. 什么是业务逻辑漏洞?
业务逻辑漏洞是应用程序的设计和实现中允许攻击者引发意外行为的缺陷。这可能使攻击者能够操纵合法功能来实现恶意目标。这些缺陷通常是由于未能预料到可能发生的不寻常的应用程序状态,从而未能安全地处理它们。
逻辑缺陷对于普通人来说通常是看不见的,因为漏洞通常不会在应用的正常使用中暴露出来。然而,攻击者可能通过与应用程序以开发人员从未预期的方式交互来利用这些漏洞。
业务逻辑的主要目的之一是遵守在应用设计时定义的规则和约束。一般来说,业务规则规定了当给定场景发生时应用程序应该如何作出反应。这包括防止用户做那些会对业务产生负面影响或根本没有意义的事情。
逻辑中的缺陷可以使攻击者绕过这些规则。例如,他们可以在不经过正常购买流程的情况下完成交易。在其他情况下,对用户提供的数据校验不做校验或者校验不够充分,导致用户对交易的关键数据进行修改或提交无意义的输入。通过向服务器端逻辑发送意外的值,攻击者可以潜在地诱导应用程序做一些它不应该做的事情。
逻辑漏洞非常多样,并且通常是应用程序及其特定功能所特有的。识别它们通常需要大量的人工分析知识,比如对业务的理解或攻击者在给定场景中可能实现的目标。这使得自动化漏洞扫描器很难检测它们。因此,逻辑缺陷通常是bug赏金猎人和手动测试人员的一个很好的目标。
2. 业务逻辑漏洞是如何产生的?
业务逻辑漏洞的经常出现,是因为设计和开发团队对用户将如何与应用程序交互做出了有缺陷的假设。这些糟糕的假设导致对用户输入的验证不足。例如,如果开发人员假定用户只通过web浏览器传递数据,那么应用程序可能完全依赖客户端来验证输入。攻击者可以使用拦截代理很容易地绕过它们。
最终,这意味着当攻击者偏离预期的用户行为时,应用程序无法采取适当的步骤来防止这种情况,进而无法安全地处理这种情况。
在开发团队自己都不能完全理解的过于复杂的系统中,逻辑缺陷尤其常见。为了避免逻辑缺陷,开发人员需要从整体上理解应用程序。这包括了解不同的功能如何以意想不到的方式组合。在大型代码基础上工作的开发人员可能不了解应用程序的所有领域是如何工作的。在一个组件上工作的人可能会对另一个组件的工作方式做出有缺陷的假设,从而无意中引入严重的逻辑缺陷。如果开发人员没有明确地记录正在进行的任何假设,那么这些类型的漏洞很容易潜入应用程序。
3. 业务逻辑漏洞的影响是什么?
业务逻辑漏洞的影响有时可能相当微不足道。这是一个广泛的类别,影响是高度可变的。但是,如果攻击者能够以正确的方式操作应用程序,那么任何意外的行为都可能导致严重的攻击。因此,理想情况下,奇怪的逻辑应该被修复,即使你自己不能想出如何利用它。但是他总是一个风险,因为别人有可能利用他。
从根本上说,任何逻辑缺陷的影响取决于它的功能。例如,如果缺陷是在身份验证机制中,这可能会对您的整体安全性产生严重影响。攻击者可能利用这一点来升级权限,或者完全绕过身份验证,获得对敏感数据和功能的访问权。这也增加了其他漏洞的攻击面。
金融交易中的错误逻辑显然会通过资金被盗、欺诈等方式给企业带来巨大损失。
您还应该注意,即使逻辑缺陷可能不允许攻击者直接受益,它们仍然可能允许攻击者以某种方式损害业务。
4. 如何防御业务逻辑漏洞
简而言之,防御业务逻辑漏洞的关键是:
确保开发人员和测试人员理解应用程序服务的领域
避免对用户行为或应用程序其他部分的行为做出隐式假设
您应该确定您所做的关于服务器端状态的假设,并实现必要的逻辑来验证这些假设是否满足。这包括在继续之前确保任何输入的值都是合理的。
同样重要的是要确保开发人员和测试人员都能够完全理解这些假设,以及应用程序应该如何在不同的场景中做出反应。这可以帮助团队尽早发现逻辑缺陷。为促进这一点,开发团队应尽可能遵循以下最佳实践:
为所有事务和工作流程维护清晰的设计文档和数据流程,注意在每个阶段所做的任何假设。
尽可能清晰地编写代码。如果很难理解应该发生什么,就很难发现任何逻辑缺陷。理想情况下,编写良好的代码不需要通过文档来理解它。在不可避免的复杂情况下,生成清晰的文档对于确保其他开发人员和测试人员知道所做的假设以及所期望的行为是什么是至关重要的。
注意任何对使用的每个组件的其他代码的引用。想想这些依赖关系的任何副作用,如果攻击者以一种不寻常的方式操纵它们。
由于许多逻辑缺陷相对独特的性质,很容易将其视为人为错误造成的一次性错误。然而,正如我们所演示的,这些缺陷通常是构建应用程序初始阶段的不良实践的结果。分析逻辑缺陷的根本原因,以及它是如何被团队忽略的,可以帮助您发现流程中的弱点。通过进行微小的调整,您可以增加类似缺陷在源头上被切断或在开发过程的早期被发现的可能性。
|