Vulnerability-wiki

业务逻辑漏洞 (Business Logic Vulnerabilities)

业务逻辑漏洞 (Business Logic Vulnerabilities) 是 Web 应用中由于设计缺陷而非技术实现错误导致的一类高危漏洞。攻击者通过利用应用程序业务流程中不合理的逻辑,以开发者非预期的方式执行操作,从而绕过访问控制、非法牟利或破坏业务的完整性。

此类漏洞常出现在:

漏洞影响范围:

业务流程层 → 数据层 → 资金与信誉层 可导致公司资金损失、用户数据泄露、账户被盗用、平台信誉受损。


工作原理

逻辑漏洞的根源在于,应用程序信任了用户提交的数据,或未能对复杂业务流程中的所有可能性进行充分验证。它利用的是“规则”本身的漏洞,而不是代码的语法错误。

示例(并发转账):

// 正常逻辑:检查余额 -> 扣款
1. 查询用户A余额为100元。
2. 判断100元足够支付80元。
3. 从用户A账户扣除80元。

若攻击者利用并发工具同时发起两次转账请求:

线程1: 查询用户A余额为100元,判断足够支付80元。
线程2: (在线程1扣款前) 查询用户A余额仍为100元,判断足够支付80元。
线程1: A账户扣款80元,余额变为20元。
线程2: A账户再次扣款80元,余额变为-60元。

用户A成功用100元的余额花掉了160元。

根本原因:


常见类型

类型 描述 特征 示例场景
支付逻辑漏洞 篡改支付金额、商品数量等关键参数。 价格、数量等关键参数由前端控制。 将购买数量改为 -1,实现余额增加。
并发漏洞 利用时间差,在多个线程中重复执行有利益的操作。 关键操作(检查与执行)非原子性。 秒杀活动中,并发下单购买多个限量商品。
越权漏洞 平行或垂直地操作不属于自己的数据或功能。 未校验操作对象是否属于当前用户。 修改请求中的 order_id 查看或操作他人订单。
流程绕过漏洞 跳过业务流程中的必要步骤。 未对流程中的每一步进行状态校验。 跳过支付步骤,直接访问支付成功页面。
资源滥用漏洞 无限制地调用消耗资源的功能,如短信、邮件。 接口缺乏频率限制和有效的验证码机制。 对任意手机号进行短信轰炸。
数值处理缺陷 利用整数溢出或浮点数精度问题牟利。 使用了不合适的数据类型处理金额或库存。 充值一个超大金额,导致整数溢出余额变为负数。

攻击示例与利用场景

1. 价格篡改 (PHP)

<?php
// 商品ID和价格都从URL获取
$item_id = $_GET['item_id'];
$price = $_GET['price'];

// 未从数据库中核对该item_id的真实价格,直接创建订单
create_order($item_id, $price); 

function create_order($id, $p) {
    // ...
}
?>

利用请求:

访问: ?item_id=101&price=0.01 可用1分钱购买任意商品。

效果: 造成商户资金损失。


2. 并发漏洞/竞争条件 (PHP)

<?php
$conn = new mysqli("localhost", "user", "pass", "db");
$user_id = 1;
$amount_to_withdraw = 100;

// ⚠️ 检查和更新操作非原子性
$result = $conn->query("SELECT balance FROM users WHERE id = $user_id");
$balance = $result->fetch_assoc()['balance'];

if ($balance >= $amount_to_withdraw) {
    // 模拟网络延迟,放大竞争条件窗口
    sleep(1);
    $conn->query("UPDATE users SET balance = balance - $amount_to_withdraw WHERE id = $user_id");
}

效果: 同时发送多个请求,可从账户中取出远超其实际余额的资金。


3. 整数溢出 (Java)

public class Wallet {
    public static void main(String[] args) {
        // 用户当前账户有100元
        int currentBalance = 100;

        // 攻击者通过某种方式传入一个超大充值数额
        int depositAmount = Integer.MAX_VALUE; // 2147483647

        // 系统将两者相加,导致溢出
        int newBalance = currentBalance + depositAmount;

        // 输出: -2147483549
        System.out.println("New balance: " + newBalance);
    }
}

效果: 用户账户余额可能被清零或变为负数,引发后续更多问题。


漏洞检测方法

一、手工检测

逻辑漏洞的检测高度依赖人工分析和对业务的理解。(有的时候也挺依靠脑洞的)

  1. 理解业务流程:梳理应用的核心功能,画出业务流程图。
  2. 篡改业务参数:通过 Burp Suite 等代理工具,修改请求中的关键参数,如商品ID、价格、数量、用户ID,观察后端响应。特别是尝试负数、零、超大数值。
  3. 测试并发操作:对所有涉及资源增减的功能(如领券、支付、抽奖)使用并发工具(如 Burp Intruder/Turbo Intruder)发送大量请求。
  4. 逆向/绕过流程:尝试不按预设顺序访问功能。例如,将商品加入购物车后,直接访问”支付成功”的URL。
  5. Fuzz关键参数:对业务逻辑中的关键参数进行系统性的模糊测试,包括:
    • 数值类参数:负数、零、浮点数、超大值、最小值、边界值(如 -1, 0, 1, 999999, 2147483647)
    • 字符串参数:空字符串、特殊字符、超长字符串、SQL/NoSQL注入payload
    • 数组参数:空数组、单元素数组、超大数组、重复元素
    • 布尔参数:true/false、1/0、”true”/”false”字符串形式

二、辅助检测工具

工具 特点 适用场景
Burp Suite (Repeater) 手工修改和重放请求,是检测逻辑漏洞的核心工具。 单个请求的参数篡改测试
Burp Suite (Intruder) 用于对参数进行Fuzzing,或配置为并发测试工具。 批量参数fuzz、并发测试
Turbo Intruder Burp Suite 插件,专为发送高速、大量并发请求而设计,是检测竞争条件漏洞的利器。 高速并发攻击、竞争条件测试
ffuf 快速的Web模糊测试工具,支持多种fuzz模式。 目录/参数发现、批量fuzz
wfuzz Python编写的Web应用模糊测试工具,功能强大且灵活。 复杂的参数组合fuzz测试
sqlmap 虽然主要用于SQL注入,但其tamper脚本思路可用于逻辑漏洞的payload变换。 自动化参数变换和测试
自定义脚本 (Python) 针对复杂业务逻辑,可编写脚本进行定制化的并发或流程测试。 业务逻辑相关的定制化测试

常用Fuzz Payload示例

数值类参数Fuzz字典:

-2147483648, -999999, -1, 0, 1, 999999, 2147483647
0.1, -0.1, 999999.99, -999999.99
null, undefined, NaN, Infinity, -Infinity

特殊字符/注入类Payload:

', ", \, NULL, <script>, ../../, %00, %0a, %0d
admin, root, test, 1=1, 1'or'1'='1, true, false

数组/对象操作Payload:

[], [1], [1,2,3], [""], [null]
{}, {"key":"value"}, {"admin":true}

防御与加固建议

方法 说明
服务端强制校验(核心) 绝不信任任何来自客户端的输入。价格、库存、权限等所有关键业务数据,必须以后端存储为准。
保证操作的原子性 对所有“检查-执行”类操作(如资金和库存变更),使用数据库锁(悲观锁/乐观锁)或事务来确保原子性。
设计严谨的状态机 为复杂的业务流程(如订单处理)建立一个严格的状态机模型,确保每一步操作都有前置状态要求,防止流程被绕过。
统一的权限控制 对所有API接口进行统一的权限校验,确保当前用户有权对目标资源执行请求的操作。
使用合适的数据类型 对资金使用 Decimal / BigDecimal 等高精度类型。对ID和数量使用范围正确的数值类型,并进行边界检查。
增加风控措施 对关键业务操作(如登录、支付、发送验证码)增加频率限制、人机校验(CAPTCHA)等风控措施。
⚠️ WAF 防御效果有限 Web应用防火墙(WAF)难以理解业务上下文,通常无法有效防御逻辑漏洞。

靶场与实战演示环境

靶场环境 特点
PortSwigger Web Security Academy 提供大量高质量、专门针对业务逻辑漏洞的在线实验环境。
OWASP WebGoat 经典的故意不安全应用,包含多种逻辑漏洞场景。
DVWA 包含一些基础的逻辑缺陷,如不安全的验证码。

参考资料


📝 作者:LiErJ 📧 邮箱:lijiaqi@mail.nankai.edu.cn 🏫 单位:Nankai University 📅 最后更新时间:2025-07-25