业务逻辑错误 (Business Logic Errors)
业务逻辑错误,也称为业务逻辑缺陷,是一种应用程序漏洞,源自应用程序的业务逻辑。业务逻辑是程序中处理现实业务规则和流程的部分。这些规则可能包括定价模型、交易限制或多步流程中必须遵循的操作顺序。
摘要 (Summary)
- 方法论 (#methodology)
- 评论功能测试 (#review-feature-testing)
- 折扣码功能测试 (#discount-code-feature-testing)
- 运费操纵 (#delivery-fee-manipulation)
- 货币套利 (#currency-arbitrage)
- 高级功能利用 (#premium-feature-exploitation)
- 退款功能利用 (#refund-feature-exploitation)
- 购物车/收藏夹利用 (#cartwishlist-exploitation)
- 帖子评论测试 (#thread-comment-testing)
- 舍入误差 (#rounding-error)
- 参考资料 (#references)
方法论 (Methodology)
与其他类型的安全漏洞(如 SQL 注入或跨站脚本 XSS)不同,业务逻辑错误并不依赖于代码本身的问题(如未过滤的用户输入)。相反,它们利用的是应用程序原本预期的正常功能,但以开发人员未预见到的方式使用它,从而产生不良后果。
业务逻辑错误的常见示例。
评论功能测试 (Review Feature Testing)
- 评估您是否可以在未购买商品的情况下,作为“已验证评论者”发布产品评论。
- 尝试提供标准度量范围之外的评分,例如在 1 到 5 分制的系统中给出 0、6 或负数。
- 测试同一用户是否可以对同一个产品发布多次评分。这对于检测潜在的竞态条件 (race conditions) 很有用。
- 确定文件上传字段是否允许所有扩展名;开发人员经常忽略对这些端点的保护。
- 调查冒充其他用户发布评论的可能性。
- 尝试对该功能进行跨站请求伪造 (CSRF) 攻击,因为该功能通常不受令牌保护。
折扣码功能测试 (Discount Code Feature Testing)
- 尝试多次应用同一个折扣码,评估它是否可重复使用。
- 如果折扣码是唯一的,通过两个账户同时应用同一个折扣码来评估竞态条件。
- 测试批量赋值 (Mass Assignment) 或 HTTP 参数污染,观察在应用程序设计为仅接受一个折扣码时,您是否可以应用多个折扣码。
- 测试该功能是否存在由于缺乏输入清理而导致的漏洞,如 XSS、SQL 注入。
- 尝试通过操纵服务器端请求,将折扣码应用到非折扣商品上。
运费操纵 (Delivery Fee Manipulation)
- 尝试给运费设置负值,观察是否能减少最终支付总额。
- 评估是否可以通过修改参数来激活“免运费”。
货币套利 (Currency Arbitrage)
- 尝试用一种货币(例如美元 USD)支付,并请求以另一种货币(例如欧元 EUR)退款。汇率差可能会导致获利。
高级功能利用 (Premium Feature Exploitation)
- 探索在没有有效订阅的情况下访问高级账户专用部分或端点的可能性。
- 购买高级功能,然后取消,观察退款后是否仍可使用。
- 在请求/响应中寻找用于验证高级访问权限的 true/false 值。使用 Burp 的 Match & Replace 之类的工具更改这些值,以获取未经授权的高级访问权限。
- 检查 Cookie 或本地存储 (local storage) 中用于验证高级访问权限的变量。
退款功能利用 (Refund Feature Exploitation)
- 购买产品,申请退款,观察产品是否仍然可以访问。
- 寻找货币套利的机会。
- 对一个订阅提交多次取消请求,检查多次退款的可能性。
购物车/收藏夹利用 (Cart/Wishlist Exploitation)
- 测试通过添加负数数量的产品,连同其他产品一起购买,以平衡总额。
- 尝试添加超过库存数量的产品。
- 检查您的收藏夹或购物车中的产品是否可以被移动到另一个用户的购物车中,或者从其中删除。
帖子评论测试 (Thread Comment Testing)
- 检查帖子评论数量是否存在限制。
- 如果用户只能评论一次,利用竞态条件观察是否可以发布多条评论。
- 如果系统仅允许经过验证或特权用户评论,尝试模拟这些参数,观察您是否也可以评论。
- 尝试冒充其他用户发布评论。
舍入误差 (Rounding Error)
报告 hackerone #176461 描述了一个加密货币平台(使用 XBT/Bitcoin)中的业务逻辑缺陷,攻击者利用内部转账系统中的舍入误差凭空产生资金。
攻击者发起一笔 0.000000005 XBT (0.5 satoshi) 的转账,这低于系统的最小精度(最小为 1 satoshi)。
- 发送者的余额没有变化。算法可能向下舍入到 0 satoshi。
- 接收者的余额增加了 1 satoshi (0.00000001)。算法可能向上舍入到 1 satoshi。
攻击者凭空生成了 0.00000001 XBT。由于没有速率限制、OTP 或欺诈检测,攻击者可以自动化此过程并无限重复,从而实现类似“印钱”的效果。
在这个例子中,系统没有进行舍入并拒绝交易或强制执行最小转账金额,而是忽略了对发送者的扣款并贷记了接收者。