Web安全学院
Web安全学院
  • 首页
  • 译序
  • 学习路线
  • 前篇
    • Web应用程序安全测试
    • 动态应用程序安全测试(DAST)
    • 带外应用程序安全测试(OAST)
  • 服务器端主题
    • SQL注入
      • SQL注入
      • SQL注入UNION攻击
      • 在SQL注入攻击中检索数据库
      • SQL盲注
      • SQL注入速查表
    • 认证
      • 认证漏洞
      • 基于密码登录中的漏洞
      • 多因素认证中的漏洞
      • 其他认证机制中的漏洞
      • 如何保护你的认证机制
    • 目录遍历
      • 目录遍历
    • 命令注入
      • OS命令注入
    • 业务逻辑漏洞
      • 业务逻辑漏洞
      • 业务逻辑漏洞示例
    • 信息泄露
      • 信息泄露漏洞
      • 如何发现并利用信息泄露漏洞
    • 访问控制
      • 访问控制漏洞与权限提升
      • 不安全的直接对象引用(IDOR)
      • 访问控制安全模型
    • 文件上传漏洞
      • 文件上传漏洞
    • 条件竞争
      • 条件竞争
    • 服务器端请求伪造(SSRF)
      • 服务器端请求伪造(SSRF)
      • 盲SSRF漏洞
    • XXE注入
      • XML外部实体(XXE)注入
      • XML实体
      • 发现并利用盲XXE漏洞
  • 客户端主题
    • 跨站脚本(XSS)
      • 跨站脚本
      • 反射型XSS
      • 存储型XSS
      • 基于DOM的XSS
      • XSS上下文
        • 跨站脚本上下文
        • 客户端模版注入
      • 利用跨站脚本漏洞
      • 内容安全策略
      • 悬空标记注入
      • 如何防范XSS漏洞
      • 跨站脚本(XSS)速查表
    • 跨站请求伪造(CSRF)
      • 跨站请求伪造(CSRF)
      • XSS与CSRF
      • 绕过CSRF令牌验证
      • 绕过SameSite Cookie限制
      • 绕过基于Referer的CSRF防御
      • 如何防范CSRF漏洞
    • 跨域资源共享(CORS)
      • 跨域资源共享(CORS)
      • 同源策略(SOP)
      • CORS和Access-Control-Allow-Origin响应标头
    • 点击劫持
      • 点击劫持(UI伪装)
    • 基于DOM的漏洞
      • 基于DOM的漏洞
      • 控制Web消息源
      • 基于DOM的开放重定向
      • 基于DOM的Cookie操纵
      • 基于DOM的JavaScript注入
      • 基于DOM的document-domain操纵
      • 基于DOM的WebSocket URL投毒
      • 基于DOM的链接操纵
      • Web消息操纵
      • 基于DOM的Ajax请求标头操纵
      • 基于DOM的本地文件路径操纵
      • 基于DOM的客户端SQL注入
      • 基于DOM的HTML5 Storage操纵
      • 基于DOM的客户端XPath注入
      • 基于DOM的客户端JSON注入
      • DOM-data操纵
      • 基于DOM的拒绝服务
      • DOM破坏
    • WebSocket
      • 测试WebSocket安全漏洞
      • 什么是WebSocket?
      • 跨站WebSocket劫持
  • 进阶主题
    • 不安全的反序列化
      • 不安全的反序列化
      • 利用不安全的反序列化漏洞
    • 测试GraphQL API
      • 测试GraphQL API
      • 什么是GraphQL?
    • 服务器端模板注入
      • 服务器端模板注入
      • 利用服务器端模板注入漏洞
    • Web缓存投毒
      • Web缓存投毒
      • 缓存设计缺陷的利用
      • 缓存实现缺陷的利用
    • HTTP Host标头攻击
      • HTTP Host标头攻击
      • 如何识别和利用HTTP Host头的漏洞
      • 密码重置投毒
    • HTTP请求走私
      • HTTP请求走私
      • 查找HTTP请求走私漏洞
      • 利用HTTP请求走私漏洞
      • 高级请求走私
        • 高级请求走私
        • HTTP/2降级
        • 响应队列投毒
        • HTTP/2专属载体
        • HTTP请求隧道
      • 浏览器驱动的请求伪造
        • 浏览器驱动的请求伪造
        • CL.0请求走私
        • 客户端异步攻击
        • 基于暂停的异步攻击
    • OAuth认证
      • OAuth 2.0认证漏洞
      • OAuth授权类型
      • OpenID Connect
      • 如何防范OAuth认证漏洞
    • JWT攻击
      • JWT攻击
      • 在Burp Suite中使用JWT
      • 算法混淆攻击
    • 原型污染
      • 什么是原型污染?
      • JavaScript原型和继承
      • 客户端
        • 客户端原型污染漏洞
        • 通过浏览器API进行原型污染
      • 服务器端
        • 服务器端原型污染
      • 预防原型污染漏洞
    • 基本技能
      • 基本技能
      • 使用编码混淆攻击
      • 在手动测试中使用Burp Scanner
Powered by GitBook
On this page
  • 什么是业务逻辑漏洞?
  • 业务逻辑漏洞是如何产生的?
  • 业务逻辑漏洞的影响是什么?
  • 业务逻辑漏洞的示例有哪些?
  • 如何防范业务逻辑漏洞
  1. 服务器端主题
  2. 业务逻辑漏洞

业务逻辑漏洞

Previous业务逻辑漏洞Next业务逻辑漏洞示例

Last updated 1 year ago

在本节中,我们将介绍业务逻辑漏洞的概念,解释它们是如何由于对用户行为的错误假设而产生的。我们会讨论逻辑缺陷的潜在影响,并教你如何利用它们。你还可以使用我们的交互式实验来练习所学到的知识,这些实验是基于我们在现实中遇到的真实漏洞。最后,我们会提供一些通用的最佳实践,以帮助你防止在自己的应用程序中出现这类逻辑缺陷。

Labs

如果你已经熟悉业务逻辑漏洞背后的基本概念,并且只想在一些真实的、故意易受攻击的目标上练习利用它们,你可以从下面的链接中访问该主题中的所有实验。

什么是业务逻辑漏洞?

业务逻辑漏洞是应用程序设计和实现中的缺陷,允许攻击者引发未预期的行为。这可能使攻击者能够操纵合法的功能来达到恶意的目的。这些缺陷通常是由于未能预见到可能发生的异常应用状态,从而未能安全地处理它们。

注意

在这个语境中,“业务逻辑”一词只是指定义应用程序如何运作的一组规则。由于这些规则并不总是与业务直接相关,所以相关的漏洞也被称为“应用逻辑漏洞”或简称为“逻辑缺陷”。

逻辑缺陷往往对那些并非专门寻找它们的人是不可见的,因为它们通常不会在应用程序的正常使用中暴露。然而,攻击者可能会通过以开发人员从未预料到的方式与应用程序进行交互,来利用行为上的怪异之处。

业务逻辑的主要目的之一是强制执行在设计应用程序或功能时定义的规则和限制。广义上讲,业务规则决定了当一个给定的场景发生时,应用程序应该如何反应。包括阻止用户做出对业务产生负面影响或根本没有意义的事情。

逻辑上的缺陷可以让攻击者绕过这些规则。例如,他们可能不通过预定的购买流程就能完成交易。在其他的情况中,对用户提供的数据进行破坏性或不存在的验证,可能允许用户对关键交易的值进行任意修改,或提交无意义的输入。通过将未预期的值传入服务器端逻辑,攻击者可能诱使应用程序做出一些它不应该做的事情。

基于逻辑的漏洞可能极其多样化,而且通常是应用程序及其特定功能所特有的。识别它们通常需要一定的人类知识,比如对业务领域的理解,或者对攻击者在给定环境中可能有什么目标的了解。这使得它们难以通过自动化的漏洞扫描器进行检测。因此,逻辑缺陷一般是对漏洞赏金猎人和手动测试人员的一个大好目标。

业务逻辑漏洞是如何产生的?

业务逻辑漏洞的出现通常是因为设计和开发团队对用户将如何与应用程序进行交互做出了错误的假设。这些错误的假设可能导致对用户输入的验证不足。例如,如果开发人员假设用户只通过Web浏览器传递数据,那么应用程序可能完全依赖薄弱的客户端控制来验证输入。攻击者使用截断代理很容易绕过这些。

最终,意味着当攻击者偏离预期的用户行为时,应用程序未能采取适当的步骤来防止这种情况,因此,未能安全地处理这种情况。

逻辑缺陷在过于复杂的系统中尤其常见,即使是开发团队自己也无法完全了解。为了避免逻辑缺陷,开发人员需要从整体上理解应用程序。包括意识到不同的功能如何以意想不到的方式组合。从事大型代码库工作的开发人员可能对应用程序的所有领域如何工作没有深入的了解。在一个组件上工作的人可能对另一个组件的工作方式做出有缺陷的假设,结果可能无意中引入严重的逻辑缺陷。如果开发人员没有明确记录正在做出的任何假设,那么这些类型的漏洞就很容易潜入应用程序。

业务逻辑漏洞的影响是什么?

业务逻辑漏洞的影响有时可能相当微不足道。它是一个广泛的类别,其影响高度变化。然而,如果攻击者能以正确的方式操纵应用程序,任何未预期的行为都可能导致高危的攻击。因此,即使你自己不知道如何利用它,也应该修复怪异的逻辑。总有其他人能够利用到的风险。

从根本上说,任何逻辑缺陷的影响都取决于它与什么功能有关。例如,如果缺陷存在于认证机制中,可能对你的整体安全产生严重影响。攻击者可能利用这一点进行权限提升,或完全绕过认证,获得对敏感数据和功能的访问。这也会为其他利用暴露出更大的攻击面。

金融交易中存在缺陷的逻辑显然会导致通过窃取资金、欺诈等方式对企业造成巨大损失。

你还应该注意,即使逻辑缺陷不会让攻击者直接受益,它们仍可能使恶意方能够以某种方式损害企业。

业务逻辑漏洞的示例有哪些?

理解业务逻辑漏洞最好的方法是查看现实世界中的示例,并从所犯的错误中学习。我们提供了各种常见的逻辑缺陷的具体示例,以及一些故意存在漏洞的网站,以便你可以自己练习利用这些漏洞。

阅读更多

如何防范业务逻辑漏洞

简而言之,防范业务逻辑漏洞的关键是:

  • 确保开发人员和测试人员了解应用程序所服务的领域

  • 避免对用户行为或应用程序其他部分的行为做出隐含的假设

你应该确定自己对服务器端的状态做出了哪些假设,并实现必要的逻辑来验证这些假设是否满足。包括在继续之前确保任何输入的值都是合理的。

同样重要的是,确保开发人员和测试人员都能充分理解这些假设,以及应用程序在不同场景下应该如何反应。这有助于团队尽早发现逻辑缺陷。为了促进这一点,开发团队应尽可能遵循以下最佳实践:

  • 为所有事务和工作流程维护清晰的设计文档和数据流,记录每个阶段所做的任何假设。

  • 尽可能清晰地编写代码。如果很难理解应该发生什么,就很难发现任何逻辑缺陷。理想情况下,编写良好的代码不需要文档来理解。在不可避免的复杂情况下,编写清晰的文档至关重要,以确保其他开发人员和测试人员知道正在做出什么假设,以及预期的行为到底是什么。

  • 注意任何对其他代码的引用,其中使用的每个组件。如果恶意方以不寻常的方式操纵这些依赖项,考虑这些依赖项可能产生的任何副作用。

由于许多逻辑缺陷相对独特的性质,很容易将它们视为人为错误造成的一次性错误并忽视它们。然而,正如我们所展示的,这些缺陷通常是在构建应用程序的初始阶段存在不良实践的结果。分析一个逻辑缺陷首先为什么存在以及它是如何被团队忽略的,可以帮助你发现流程中的弱点。通过细微的调整,你可以增加类似缺陷在源头上被消除或在开发过程中更早被发现的可能性。

业务逻辑漏洞示例
查看所有业务逻辑漏洞实验