业务逻辑漏洞示例
翻译
原文:https://portswigger.net/web-security/logic-flaws/examples
- name: 翻译
desc: 原文:https://portswigger.net/web-security/logic-flaws/examples
bgColor: '#F0DFB1'
textColor: 'green'
2
3
4
# 1业务逻辑漏洞示例
业务逻辑漏洞 相对特定于它们发生的上下文。然而,尽管逻辑缺陷的个别实例差异很大,但它们可以共享许多共同的主题。而且,可以根据引入漏洞的最初错误,对它们进行大致分组。
在本节中,我们将介绍 设计和开发团队 所犯的一些典型错误示例,并向你展示 它们如何直接导致业务逻辑缺陷。无论你是在开发自己的应用程序,还是在审查现有的应用程序,你都可以从这些示例中吸取教训,并将相同的批判性思维 应用于你遇到的其他应用程序。
逻辑缺陷的示例包括:
- 对客户端控件的过度信任 (opens new window)LABS
- 未能处理非常规输入 (opens new window)LABS
- 对用户行为做出有缺陷的假设 (opens new window)LABS
- 特定领域的缺陷 (opens new window)LABS
- 提供加密预言机 (opens new window)LABS
# 1.1对客户端控件的过度信任
(译者加:这里的客户端控件指的是 浏览器端控件,即 “前端校验 或 JS校验”)
一个根本性的错误假设,用户只会通过提供的 Web 界面与应用程序进行交互。这尤其危险,因为它会导致进一步假设,客户端校验 将阻止用户提供恶意输入。但是,攻击者可以简单地使用 Burp Proxy 等工具,在浏览器发送数据之后,并在数据传递到服务器端逻辑之前,篡改数据。这实际上使客户端控件变得无用。
在不执行适当的 完整性检查和服务器端验证 的情况下接受数据,可以让攻击者以相对最小的工作量,造成各种破坏。他们能够实现的确切目标 取决于功能 以及 该功能对可控数据的处理方式。在适当的情况下,这种缺陷可能会对 与业务相关的功能和网站本身 的安全性产生破坏性的后果。
- name: 实验室-学徒
desc: 过度信任客户端控件 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-excessive-trust-in-client-side-controls
bgColor: '#001350'
textColor: '#39d50c'
2
3
4
5
6
(译者注:“2FA逻辑缺陷” 属于第二章节-身份验证 中的实验室。如果之前已经完成,可以再做一遍以复习)
- name: 实验室-从业者
desc: 2FA逻辑缺陷 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/authentication/multi-factor/lab-2fa-broken-logic
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
# 1.2未能处理非常规输入
应用程序逻辑 的其中一个目的,将用户输入 限制为符合业务规则的值。例如,应用程序可能被设计为 接受某个特定数据类型的任意值,该逻辑从业务的角度 来确定该值是否可接受。许多应用程序将 数字限制 纳入其逻辑中。这可能包括 用于管理库存、应用预算限制、触发供应链阶段等限制。
我们以 在线商城 举一个简单的示例。订购产品时,用户通常会指定要订购的数量。理论上来说,虽然任何整数都是有效的输入,但业务逻辑可能会阻止用户 订购比当前库存更多 的单位。
若要实现此类规则,开发人员需要预测所有可能的场景,并将相应的处理方法 合并到应用程序逻辑中。换句话说,他们需要告诉应用程序,它是否应该允许给定的输入,以及它应该如何根据各种条件做出反应。如果没有用于处理特定情况的显式逻辑,则可能导致意外和潜在的可利用行为。
例如,数据类型 数值 可能接受负值。根据相关功能,业务逻辑允许这样做可能没有意义。但是,如果应用程序 没有执行充分的服务端验证 并 拒绝此输入,则攻击者就可能传入负值 并 引发不必要的行为
考虑两个银行账户之间的资金转账功能。此功能几乎肯定会 在完成转账之前 检查发起人是否有足够的资金:
$transferAmount = $_POST['amount'];
$currentBalance = $user->getBalance();
if ($transferAmount <= $currentBalance) {
// 完成转账
} else {
// 阻止转账:资金不足
}
2
3
4
5
6
7
8
但是,如果该逻辑不能充分阻止 用户在amount
参数中提供负数值,则攻击者可能会利用这一点绕过余额检查,并将资金转移到 “错误” 的方向。如果攻击者向受害者的帐户发送了 -1000 元,这可能会导致他们从受害者那里收到 1000 元。逻辑将始终评估 -1000 小于当前余额并允许转账。
- (译者加:A 给 B 转账了 1000 元,A扣1000,B获得1000)
- (译者加:A 给 B 转账了 -1000 元,A获得1000,B扣1000)
像这样的简单逻辑缺陷,如果发生在实际的功能当中,可能是毁灭性的。在开发和测试期间,它们也很容易被忽略,特别是考虑到 此类输入可能会被 Web 界面上的客户端控件阻止。
在审查应用程序时,应使用 Burp Proxy 和 Repeater 等工具,来尝试提交非常规值。特别是,尝试输入 合法用户不太可能输入 的范围。这包括输入 异常高/低的数字 以及 基于文本字段的异常长字符串。你甚至可以尝试意外的数据类型。通过观察应用程序的响应,你应该尝试回答以下问题:
- 对数据是否有施加任何限制?
- 当达到这些限制时会发生什么?
- 程序是否对输入 执行任何转换或规范化?
这可能会暴露弱输入验证,允许你 以异常方式操作应用程序。请记住,如果你在目标网站上发现 一个表单无法安全地处理非常规输入,则其他表单很可能也会有同样的问题。
- name: 实验室-学徒
desc: 高级逻辑漏洞 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-high-level
bgColor: '#001350'
textColor: '#39d50c'
2
3
4
5
6
- name: 实验室-从业者
desc: 低级逻辑缺陷 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-low-level
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
- name: 实验室-从业者
desc: 异常输入的处理不一致 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-inconsistent-handling-of-exceptional-input
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
# 1.3对用户行为做出有缺陷的假设
逻辑漏洞最常见的根本原因之一,对用户行为做出有缺陷的假设。这可能会导致开发人员没有考虑 违反这些假设的潜在危险场景 等各种问题。在本节中,我们将提供一些 应该避免的、常见的假设示例,并演示它们如何导致危险的逻辑缺陷。
# 1.3.1受信任的用户并不总是值得信任
应用程序看起来可能是安全的,因为它们实现了看似可靠的措施,来强制执行业务规则。不幸的是,一些应用程序错误地认为,在一开始通过了这些严格的控制之后,用户及其数据可以被无限期地信任。这可能会导致从那时起,相同控制措施的执行将会变得宽松。
如果 业务规则和安全措施 没有在整个应用程序中一致地应用,则可能导致潜在的危险,从而被攻击者利用。
- name: 实验室-学徒
desc: 不一致的安全控制 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-inconsistent-security-controls
bgColor: '#001350'
textColor: '#39d50c'
2
3
4
5
6
# 1.3.2用户不会总是提供强制性输入
存在一个误解,用户总是为 必填字段 提供输入值。浏览器可能会阻止普通用户,在没有必填输入的情况下 不允许提交表单。但正如我们所知,攻击者可以在传输过程中篡改参数,甚至完全删除参数。
在同一个服务器端脚本中 实现多个函数 的情况下,这是一个特殊的问题。在这种情况下,某个特定参数的存在或不存在,可以用于确定执行哪段代码。如果删除参数值,可能允许攻击者 访问本应无法访问的代码路径。
在探测逻辑缺陷时,你应该尝试 依次删除每个参数,并观察这对响应有什么影响。你应该确保:
- 一次只删除一个参数,以确保到达所有相关的代码路径。
- 尝试删除参数的名称和值。服务器通常会以不同的方式处理这两种情况。
- 遵循多阶段流程并直至完成。有时,在一个步骤中篡改参数 会影响工作流中的另一个步骤。
这适用于 URL 和POST
参数,但不要忘记检查 cookie。这个简单的过程 可以暴露一些可能被利用的奇怪应用程序行为。
- name: 实验室-从业者
desc: 复用端点的弱隔离 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-weak-isolation-on-dual-use-endpoint
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
(译者注:“破坏密码重置的逻辑” 属于第二章节-身份验证 中的实验室。如果之前已经完成,可以再做一遍以复习)
- name: 实验室-学徒
desc: 破坏密码重置的逻辑 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/authentication/other-mechanisms/lab-password-reset-broken-logic
bgColor: '#001350'
textColor: '#39d50c'
2
3
4
5
6
# 1.3.3用户不会总是按照预期的顺序
许多事务依赖于 由一系列步骤组成的预定义工作流。Web 界面通常会引导用户完成此过程,每次完成当前工作流时,都会将他们带到工作流的下一个步骤。然而,攻击者不一定会遵守这个预期的顺序。如果不考虑这种可能性,可能会导致危险的缺陷,而这些缺陷可能相对容易利用。
例如,许多实施双因素身份验证(2FA)的网站,要求用户先在一个页面上登录,然后在单独的页面上输入验证码。假设用户 将始终遵循此过程 直到完成,因此,如果不验证他们是否这样做,可能会允许攻击者完全绕过 2FA 步骤。
(译者注:“2FA简易绕过” 属于第二章节-身份验证 中的实验室。如果之前已经完成,可以再做一遍以复习)
- name: 实验室-学徒
desc: 2FA简易绕过 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/authentication/multi-factor/lab-2fa-simple-bypass
bgColor: '#001350'
textColor: '#39d50c'
2
3
4
5
6
即使在相同的 工作流程或功能 中,对事件顺序做出假设 也可能会导致各种问题。使用 Burp Proxy 和 Repeater 等工具时,一旦攻击者看到请求,他们就可以随意重放请求,并通过强制浏览,以他们想要的任何顺序 与服务器进行各种交互。这允许他们 在应用程序处于意外状态时 完成不同的操作。
要识别这些类型的缺陷,你可以通过强制浏览,以非预期的顺序来提交请求。例如,你可以 跳过某些步骤、多次访问单个步骤、返回到前面的步骤等,注意不同步骤的访问方式。虽然你通常只是向特定 URL 提交GET
或POST
请求,但有时你可以通过向同一 URL 提交不同的参数集来访问该步骤。与所有逻辑缺陷一样,尝试识别 开发人员所做出的假设 以及 攻击面所在的位置。然后,你可以寻找违反这些假设的方法。
(译者注:“强制浏览” 是一种攻击方式,其目的是枚举和访问 未被应用程序引用,但仍可访问的资源。目录暴破 属于其中一种利用手段。)
请注意,这种测试通常会导致异常,因为预期的变量具有 null 或未初始化的值。以部分定义或不一致的状态 到达程序的某个位置 也可能导致应用程序出错。在这种情况下,请务必密切注意 遇到的任何错误消息或调试信息。这些可能是信息披露 (opens new window)的重要来源,可以帮助你微调攻击,并了解有关后端行为的关键细节。
- name: 实验室-从业者
desc: 工作流验证不充分 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-insufficient-workflow-validation
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
- name: 实验室-从业者
desc: 通过有缺陷的状态机制绕过身份验证 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-authentication-bypass-via-flawed-state-machine
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
# 1.4特定领域的缺陷
在许多情况下,你会遇到 特定业务领域或网站用途 的逻辑缺陷。
在线商店的折扣功能 是寻找逻辑缺陷时的典型攻击面。对于攻击者来说,这可能是一个潜在的金矿,在应用折扣的方式中 会出现各种基本的逻辑缺陷。
例如,考虑一个在线商店的网站,该商店为超过 1000 元的订单提供 10% 的折扣。如果业务逻辑无法检查 在应用折扣后 订单是否发生了更改,则很容易被滥用。在这种情况下,攻击者可以简单地将商品添加到购物车中,直到价格达到 1000 元的门槛,然后在下订单之前删除他们不想要的商品。然后,即使价格不再满足预期标准,他们也会获得相应的订单折扣。
你应该特别注意,根据 用户操作 来确定条件标准,然后调整价格或其他敏感值的任何情况。尝试了解应用程序 使用哪些算法来进行这些调整,以及在何时进行这些调整。这通常涉及操作应用程序,使其产生 所应用的调整 与 开发人员预期的原始条件不符 的状态
要识别这些漏洞,你需要仔细考虑攻击者可能具有的攻击目的,并尝试使用提供的功能 找到实现此目的 的不同方法。这可能需要一定程度的特定领域知识,以便了解 在特定情况下可能有利的内容。举个简单的例子,你需要了解社交媒体,才能理解 强迫大量用户关注你时 的好处。
如果没有对该领域的了解,你可能会忽略某些危险行为,因为你根本没有意识到它潜在的连锁反应。同理,你可能很难把这些点连接起来,并注意到两个功能是如何 以有害的方式组合在一起的。为简单起见,本主题中使用的示例 都特定于所有用户已熟悉的领域,即 在线商店。
但是,无论你是漏洞赏金猎人、渗透测试人员,还是一个试图编写更安全代码的开发人员,你都可能会在某些时候,遇到来自陌生领域的应用程序。在这种情况下,你应该阅读尽可能多的文档,并在允许的情况下 与该领域的主题专家交谈,以获得他们的见解。这听起来像是很多不同的工作,但领域越模糊,其他测试人员就越有可能错过大量 Bug 。
- name: 实验室-学徒
desc: 业务规则的执行缺陷 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-flawed-enforcement-of-business-rules
bgColor: '#001350'
textColor: '#39d50c'
2
3
4
5
6
- name: 实验室-从业者
desc: 无限金钱逻辑缺陷 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-infinite-money
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
# 1.5提供加密预言机
(译者注:“加密预言机” 属于密码学中的一种知识点,又被称为 “预言机” 。我寻找了一些相关资料:链接1 (opens new window)、链接2 (opens new window)、链接3 (opens new window))
(译者注:在寻找 “加密预言机” 相关资料的同时,我发现它与 “填充提示攻击(Padding Oracle Attack)” 貌似有点关系,Apache Shiro 的某个反序列化漏洞就与该攻击相关。感兴趣的小伙伴可以自行了解:链接1 (opens new window)、链接2 (opens new window))
当用户可控制的输入被加密,然后以某种方式将生成的密文提供给用户时,可能会出现危险的情况。这种类型的输入有时被称为 “加密预言机” 。攻击者可以使用此输入,通过 正确的算法和非对称密钥 来加密任意数据。
当应用程序中 存在其他用户可控制的输入时,如果使用相同的算法来加密数据,将会变得很危险。在这种情况下,攻击者可能会使用 加密预言机 生成有效的加密输入,然后将其传递到其他敏感函数中。
如果站点上存在 另一个用户可控输入 提供的相反功能,则此问题可能会变得更加复杂。这将使攻击者能够解密其他数据 以识别预期的结构。这为他们节省了创建恶意数据时 所需的一些工作,但这个相反功能不一定是 为了成功利用漏洞 所必需的。
加密预言机的严重性取决于 哪些功能与预言机使用了相同的算法。
- name: 实验室-从业者
desc: 通过加密预言机绕过身份验证 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-authentication-bypass-via-encryption-oracle
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6