扫漏洞的人有时会被工具惯坏SQL 注入、XSS、组件 CVE扫描器多少能给点线索。业务逻辑漏洞偏偏不吃这套——它藏在“下单流程是否允许负数量”“改个订单号能不能看别人的票”“验证码是否真的绑定这次登录”里。代码也许很干净框架也许很新该爆炸还是爆炸。OWASP 把一类问题归进失效的访问控制、不安全设计国内甲方更常直接说越权、支付漏洞、验证码绕过。这三类几乎承包了电商、金融、O2O、后台管理系统的高危业务单。一、业务逻辑漏洞到底是什么一句话系统按设计跑完了流程但设计本身允许被滥用。它不是解析器吃错字符而是该校验的步骤能跳过该绑定的身份没绑定该原子的操作有竞态该服务端定价的金额听了客户端该一次性的验证码能重放、能绕过。所以修法常常不是“加个 WAF 规则”而是改流程、改状态机、改权限模型、改对账。测试方法也要变双账号、画流程图、改步骤顺序、并发重放、算账。二、越权最常见、最好挖、最不该一再犯1. 水平越权IDOR 亲兄弟病灶接口只认“你登录了”不认“这个资源是你的”。案例 A改订单号看他人订单用户 A 登录后请求/api/order?id10086查看自己的订单。把10086改成10087返回 200 且是 B 的数据。变种导出 PDF、物流详情、发票、会话聊天记录、收货地址。案例 B对象存储 URL 可枚举头像、合同、病历 PDF 的链接是https://oss/.../10086.pdf无鉴权或仅靠难猜但可遍历的 ID。越权不一定发生在 API发生在静态资源。案例 CGraphQL/批量接口user(id:)或批量查询一次拉一串用户资料权限宏没写细。修复要点每个对象访问current_user与资源归属校验或统一 ABACID 使用不可预测值可减枚举但不能替代鉴权测试强制双账号互换 ID日志记录授权失败。2. 垂直越权病灶普通用户能调管理接口。案例 D隐藏的管理 API前端隐藏按钮接口/admin/user/delete仍通只检查登录态。变种角色字段在 JWT 里可篡改没验签或弱秘钥isAdmintrue来自请求体。案例 E功能级越权普通客服调用“批量导出全量用户”接口商户调用平台级退款。修复要点服务端强制角色/权限注解前后端分离时前端隐藏≠安全权限变更走统一中间件管理接口网络隔离 强认证。3. 未授权访问病灶鉴权中间件漏挂。案例 F新接口忘加登录迭代赶工新/api/v2/user/profile裸奔。扫描器不一定懂业务但未授权访问清单很好做对比“登录前/登录后”。4. 越权案例集的测试清单双用户水平替换资源 ID普通用户打管理路径字典基于前端 JS 与旧版 APP越权读、越权写、越权删分开测二次验证是否可被跳过改密、绑卡。三、支付漏洞钱的状态机被玩坏支付漏洞敏感这里只讲模式与防法不讲如何对真实支付渠道作案。授权测试也应走测试商户、测试金额、风控沙箱。1. 金额篡改案例 G前端传价格下单请求体{sku:VIP1,price:1}。服务端信任价格生成 1 分钱订单并支付成功。变种数量为 0、负数、小数精度、货币单位分/元弄错。修复价格只来自服务端商品系统客户端只传 sku 与数量校验库存与限购。2. 步骤乱序 / 回调信任案例 H先发货后验签支付回调未验签或验签失败仍更新订单为已支付或攻击者伪造“支付成功”通知。变种用其它订单的支付成功包重放。修复验签、防重放nonce/通知号唯一、以支付渠道查询结果为准、状态机单向。3. 竞态条件案例 I并发下单刷优惠限量券“每人一张”并发 20 个请求各自成功。变种余额扣减、秒杀库存、积分兑换。修复数据库约束/行锁/令牌桶乐观锁版本号核心账务原子事务。4. 重复支付与重复退款案例 J退款按钮连点无幂等键退两次。变种支付成功消息重试导致加两次余额。修复幂等键退款单状态机对账。5. 优惠券 / 活动逻辑案例 K优惠券叠加满减券 折扣券 会员价 未互斥最终实付为负或接近 0系统用 0 下单或异常兜底成免费。案例 L改券适用商品领券接口可改sku绑定把仅限生鲜的券用到手机上。修复服务端重算优惠规则引擎集中化单测覆盖边界金额。6. 代付与分享链接案例 M代付链接固定金额可改订单代付页只带order_id攻击者把订单改成大额或把支付结果导向另一订单。修复支付意图与订单快照绑定支付中锁定订单内容。7. 支付案例集测试清单改价格、改数量、改币种重放回调并发领券/下单退款幂等未支付订单是否可触发履约对账是否能发现长尾异常。8. 支付安全组织建议支付状态机由专人维护任何“为了方便先上线”的客户端定价默认否决定期对账与风控规则复盘。四、验证码绕过小功能大溃堤验证码本该挡住自动化注册、登录、短信、评论、领取。绕过成功后后面往往是撞库、刷短信、刷羊毛、批量注册。1. 前端校验型案例 N验证码只在前端判断抓包发现校验接口可跳过或直接调登录接口不带验证码字段。修复服务端强制校验无验证码的登录路径不存在。2. 可重放 / 不绑定案例 O验证码一次有效却可重复提交同一验证码打登录接口十次。变种验证码与手机号未绑定改手机号仍用旧码或与场景未绑定登录码拿去重置密码。修复一次性、短有效期、绑定会话/手机号/场景用后即废。3. 返回包泄露案例 P响应里回传了验证码测试接口或错误的调试字段把验证码明文返回。修复绝不回传日志脱敏。4. 图形验证码弱点案例 Q题库过小 / 可识别四位纯数字、无干扰自动化识别率极高。变种验证码图片 URL 可枚举历史或验证码接口不限流。修复强度与限流并重高风险场景上短信/MFA/风控考虑成熟验证码服务。5. 短信轰炸与接口滥用案例 R发短信接口无限制send_code可对任意手机无限打造成资损与骚扰。修复图形验证码前置、频率限制、单 IP/单号限额、黑名单、监控告警。6. 逻辑跳过案例 S改响应码客户端根据code0决定下一步攻击者改本地响应“假装验证通过”——若下一步服务端不再验就翻车。修复每一步服务端查“验证码会话已通过”标记禁止客户端自称已验证。7. 语音/邮箱验证码同理同一套绑定与限流原则。8. 验证码案例集测试清单不带验证码直接打下一跳重放换手机号复用跨场景复用爆破注意授权与限速发码接口打自己的号测限流。五、综合案例一次“小需求”串起三类洞合成故事某电商做“好友代付 短信验证领取优惠”。领取接口水平越权可帮任意用户领券越权领券后下单金额可被改支付短信验证码不绑定领取会话可重放验证码。单独看每个都是中高危串起来就是资损事故。安全评审若只做漏扫一个都可能扫不出来——必须走业务测试用例。六、怎么挖业务逻辑漏洞的方法论1. 先画状态机注册、登录、下单、支付、退款、领券——画出状态与迁移条件。问每条迁移的校验在服务端吗能跳步吗2. 身份矩阵游客 / 用户 A / 用户 B / 商户 / 管理员。对每个敏感对象做矩阵测试。3. 信任边界凡是客户端传来的价格、角色、折扣、验证成功标志、文件类型——默认谎言。4. 并发与重放限量、余额、验证码、回调通通丢进并发与重放测试箱。5. 与代码审计结合搜价格入参、isAdmin、验证码校验函数是否全局、支付回调验签函数。七、怎么防制度比单点补丁重要强制服务端鉴权框架拒绝漏挂支付与定价中台化禁止业务私自信客户端金额验证码中台绑定、一次性、限流统一实现业务安全测试用例进回归和功能测试一起跑对账与风控发现漏网变更评审专门问三个问题谁能调钱怎么算验证码能不能跳八、报告怎么写才让业务愿意修少写黑话多写钱与合规“任意用户可查看他人订单含姓名电话地址”“客户端改价可 0 元购存在资损”“短信接口可被用于轰炸导致通道被封与客诉”。附最小复现与回归用例编号修复才能闭环。九、收尾越权问的是你是谁以及这是不是你的东西。支付问的是钱的数目与状态谁说了算。验证码问的是自动化与身份证明是否真在服务端生效。工具扫不出的洞往往靠一张流程图和两个测试账号。案例可以无穷变模式就那些——认准模式业务逻辑漏洞就从“玄学”变成可训练的肌肉记忆。今晚若只做一件事选一个核心下单或个人信息接口用两个账号互改 ID再抓一次发验证码/登录请求试一次不带验证码或重放。做完你大概率已经摸到至少一处“值得建单”的逻辑味道——或幸运地确认你们中台真的有挡。无论哪种结果都比只看扫描报告实在。附三类速查类型一句话病灶关键修复越权没验资源归属/角色服务端强制鉴权支付信客户端或状态机不严服务端定价验签幂等验证码可跳过/可重放/不限流中台绑定一次性限流附最小回归用例集A 用户访问 B 订单 → 应 403改价下单 → 应以服务端价格为准支付回调篡改 → 应拒绝并发领券 → 不得超过限额登录无验证码 → 应失败验证码重放 → 应失败发短信打满频率 → 应拦截