搞安全的都知道,SRC挖掘这东西有个有趣的现象:真正决定你能不能拿高分、上排行榜的,往往不是那些靠扫描器能扫出来的技术型漏洞,而是藏在业务设计深处、工具完全碰不到的逻辑漏洞。我在几个SRC项目里翻来覆去,最后让我印象最深、奖金最可观的,基本都是业务逻辑上的问题。这篇是这个系列的第一篇,我就把业务逻辑漏洞的整个挖掘思路、常见类型和实操手法展开讲清楚,希望能帮刚入门的兄弟少走点弯路。
业务逻辑漏洞说白了就是:开发者对业务流程的假设是错的,或者某个环节压根没考虑攻击者视角。它不依赖SQL注入那样复杂的语法,也不要求多精妙的payload构造,核心考验的是你“读懂业务”的能力和“敢不敢打破常规”的思维习惯。我见过不少新人拿着Burp Suite一头扎进请求包里,扫了十几个接口毫无收获,问题就出在他们没有把业务当业务看,而是当纯技术题在做。这篇文章我会从漏洞类型、挖掘方法论、实战案例到报告输出,完整带大家走一遍。
1. 为什么业务逻辑漏洞在SRC挖掘里的地位这么特殊
1.1 业务逻辑漏洞的“本质”到底是什么
先把这个概念掰开揉碎。所谓业务逻辑漏洞,指的是应用程序在实现业务功能时,由于流程设计缺陷、状态校验缺失或调用顺序考虑不周,导致攻击者可以通过非预期方式操控业务流程,达到获取利益、越权操作、绕过限制等目的的漏洞。
有一个特别贴切的类比:技术型漏洞好比你家门锁有质量问题,小偷用开锁工具就能撬开;业务逻辑漏洞则是门锁本身很坚固,但门压根没关,或者关门的顺序可以被攻击者打乱、跳过。传统漏洞是“破坏规则的漏洞”,逻辑漏洞是“规则本身有漏洞”。
这也是为什么很多SRC平台在评估逻辑漏洞的危害时,经常给出中高危评级,甚至直接影响核心业务数据、资金、用户隐私。因为逻辑漏洞一旦被利用,往往不是单条数据的泄露,而是整条业务链路的失控,比如任意用户订单篡改、支付金额绕过、他人账号资产被操作,这种危害是实打实的。
1.2 为什么说逻辑漏洞是SRC里的“性价比之王”
从投入产出比来看,业务逻辑漏洞的“性价比”确实高。扫描器、各种自动化工具很难识别这类问题,因为它们依赖的是已知规则和签名,而逻辑漏洞的本质是“业务的非预期使用方式”,每一种业务都有自己独特的逻辑,不存在统一的扫描规则。所以即使你只用浏览器加Burp Suite,也有机会挖到不错的漏洞。
从厂商角度的修复意愿来说,逻辑漏洞往往直接影响核心业务,例如资金损失、用户数据泄露、订单异常,厂商修复意愿强,确认速度快,奖金池通常也比较可观。我在几个项目里见过,一个支付逻辑漏洞的奖励比普通SQL注入还高,原因就是它切中了业务的命脉。
1.3 挖业务逻辑漏洞需要哪些前置基础
如果你是个刚入门的新人,完全不用被“逻辑”两个字吓到。技术上需要的基础并不多,以下几项就够用:
- 熟悉HTTP协议的基本结构和常见请求方法,能看懂请求参数的含义。
- 会使用抓包工具(Burp Suite专业版或社区版够用)进行拦截、修改、重放请求。
- 有基本的Web前端认知,能分析网页表单提交了哪些参数、调用了哪些接口。
- 最重要的是,要有耐心去跑通业务的完整流程,并且保持好奇心:这个参数改了会怎样?这一步跳过会怎样?换一个身份会不会有不同结果?
我记得有人问过我:做逻辑漏洞挖掘需不需要很懂代码?我的回答是:懂代码自然更好,但更重要的是懂“人”。业务逻辑漏洞的根源是人的思维盲区,你只要比开发者多想一步,把业务当成对手来琢磨,就够了。
2. 高频出现的业务逻辑漏洞类型与判断思路
2.1 越权漏洞:水平越权和垂直越权的测试思路
越权是我在SRC项目里遇到最多、也最容易出成果的一类逻辑漏洞。水平越权指的是相同权限级别的用户之间互相访问对方的数据,最常见的就是IDOR(不安全的直接对象引用)。测试方法非常简单:登录账号A,抓到某个请求,里面带有用户的标识参数,比如id、uid、orderId,把这个参数改成账号B的对应值,如果接口返回了B的数据,那就妥妥地中招了。
垂直越权则发生在不同权限级别的账户之间,比如普通用户去调用管理员接口。我记得之前测过某平台的用户管理功能,普通用户登录后手动访问一个管理员的添加管理员接口,结果接口直接放行,没有任何角色校验。这种问题一般出现在后端接口对角色判断不严的场景,很多前端隐藏按钮,后端却忘了校验权限。
判断越权漏洞时要特别关注两点:第一,接口是否做了对象归属校验,即请求者是否有权访问该对象;第二,接口是否做了角色权限校验,即当前用户角色是否有权执行该操作。工具扫不出来,只能靠手工一条一条试。
2.2 支付与交易逻辑漏洞:改价格、改数量、改优惠的思路
凡涉及交易、支付的功能,都是业务逻辑漏洞的高发区,也是最容易定高危的地方。这类漏洞的常见姿势包括:
- 修改价格字段:下单时抓包,把商品价格的参数改成0.01元甚至负数,如果后端没有重新从数据库取值校验,就能以超低价格买到商品。
- 修改数量导致金额异常:有些系统的金额等于单价乘以数量,攻击者把数量改成负数,订单总金额变成负数,系统可能给账户“退钱”。
- 优惠券滥用:同一张优惠券在短时间内多次使用,或者一个订单叠加多张不兼容的优惠券,导致支付金额异常。
- 订单金额与支付金额不一致:篡改订单金额后,支付接口没有重新校验订单金额,造成支付一笔小额订单却完成大额交易的效果。
这类漏洞的判断核心是:前端提交的参数是否被后端当作信任依据。正确的做法是,后端应该对关键金额、数量、折扣信息做二次校验,甚至直接忽略前端传参,从数据库或服务端会话中获取真实值。
我在测试这类漏洞时有一个习惯:每到一个电商类项目,先跑一遍“选择商品→加入购物车→结算→支付”的完整流程,期间把所有请求都记录下来,尤其关注结算接口和支付接口之间的参数传递。只要有一个环节的参数可以篡改而没被校验,漏洞就出现了。支付逻辑的测试还可以结合并发请求来放大影响,比如同时用同一张优惠券创建多个订单,看是否能全部享受折扣。
2.3 验证码/接口重放逻辑:从绕过到爆破
验证码逻辑漏洞是很常见的入门级逻辑漏洞,常见形式有几种:
- 验证码不失效:同一个验证码可以被无限次使用,直到过期为止,导致验证码保护形同虚设。
- 验证码可预测或可暴力枚举:验证码位数过少(如4位纯数字),且接口没有频率限制,可以快速遍历。测试时注意观察接口是否有验证码错误次数限制、是否有锁定机制。
- 验证码在响应中回显:有些接口调试不严谨,验证码直接作为响应字段返回给前端。
- 验证码与手机号/账号未绑定:A手机收到的验证码,可以用于B手机号的找回密码或注册流程,这是绑定逻辑缺失。
接口重放逻辑就更宽泛了,凡是关键操作接口没有做幂等处理、没有加时间戳和一次性token的,都可能存在重放问题。比如支付成功回调、积分增加接口、短信发送接口等,重复发送多次请求,如果系统状态没有变化,说明缺少防重放机制。
我在实战中发现,这类漏洞的利用方式往往需要组合其他逻辑:验证码不失效加上接口无频率限制,就能直接爆破;短信验证码绑定错误的接口,可能造成任意账号注册。所以在测试时,不要孤立看一个接口,要思考这个接口在完整业务流程里处的位置,以及它和上下游接口的关系。
2.4 密码找回与注册流程的全程绕过
密码找回功能是逻辑漏洞的重灾区,只要有一条绕过路径能让攻击者重置他人密码,往往就是直接导致账户被盗的高危漏洞。
常见的密码找回漏洞模式有:
- 步骤跳过:找回密码分为三步,第一步验证身份、第二步设置新密码、第三步完成。测试时直接访问第二或第三步的URL,如果后端没有校验当前状态,就能跳过身份验证。
- 验证码与用户绑定不严:返回包或者响应字段里泄露了验证码,或者验证码校验时只校验验证码本身而忽略了用户标识,导致任意账号可被找回。
- 用户参数篡改:在找回流程中,接口通过隐藏参数传递用户标识,攻击者把标识改成目标用户的,就能代替目标用户继续后续流程。
- 并发条件竞争:有些系统在发送验证码时会写Redis,但校验时却从另一个地方取值,存在时间差可以利用。
注册流程的逻辑漏洞同样常见,比如批量注册、遍历用户名导致的用户枚举、绕过手机号/邮箱验证直接注册成功等。这些漏洞虽然危害中等,但在SRC中属于很好凑数量的类型,而且很多厂商都愿意收。
判断这类漏洞的关键是:认真走一遍完整的找回密码流程,记录每一步请求的URL和参数,然后尝试跳过、重放、篡改每一个环节。我记得有一次测试某个系统,找回密码第一步验证完手机验证码之后,响应包返回了一个step=2的隐藏参数,我直接改成step=3提交,结果第三部接口直接给新密码设置成功了。这种问题就是典型的流程状态校验缺失。
2.5 状态机与业务顺序绕过:跳过校验步骤直接操作
这类漏洞通常并不局限于某个具体功能,而是发生在多步骤业务流程中。系统假设用户一定会按照设计好的顺序操作,但攻击者可以跳过、颠倒甚至重复某些步骤。
举几个典型场景:
- 购物车结算流程:正常是“加入购物车→选地址→选支付方式→确认下单”,某些系统在最后的下单接口没有校验前面的步骤参数,攻击者可以直接构造下单请求。
- 多步表单提交:比如开户、实名认证、绑定银行卡等流程,攻击者跳过材料上传步骤直接提交最终表格。
- 二次审核流程:比如发票申请、提现申请,正常需要管理员审核,但接口存在状态参数(status、audit),攻击者可以修改状态值绕过审核。
- 并发状态竞争:同一笔订单同时发起取消和支付请求,系统处理顺序不一致可能造成状态错乱。
测试这类漏洞的方法也比较简单:把一个多步骤业务的每一步请求全部记录下来,然后用Burp Suite的历史记录功能,把某一步的请求单独拿出来重放,或者跳到后面的步骤尝试直接提交,看后端是否有状态校验。一般来说,安全的后端应该通过会话状态、token或数据库状态位来判断用户当前处于哪个环节,而不是只依赖前端传来的参数。
3. 一线挖掘业务逻辑漏洞的完整方法论
3.1 信息收集与业务建模:先当用户,再当攻击者
很多人在SRC项目里一上来就抓包、改参数、跑目录扫描,结果效率极低。我的经验是:先老老实实注册一个账号,把这个平台的核心业务流程完整跑一遍,从注册、登录、个人信息完善,到下订单、支付、退款、申诉,每一步都记录下来。这个过程看起来浪费时间,但其实是最关键的一步。
在跑流程的时候,我会顺手画一张简单的业务流程图,标注出每个环节有哪些接口、传了哪些参数、哪些参数是可变的。真正开始测之前,先问自己几个问题:这个系统最值钱的数据是什么?最核心的交易链条是什么?哪些操作一旦被绕过会产生资金或数据损失?把钱和用户数据所在的位置圈出来,作为优先测试目标。
信息收集的重点还包括:尽量多注册几个不同角色的账号,比如普通用户、商家、管理员(如果有测试账号)、VIP会员等。多角色账号是越权测试的基础,没有足够的账号,很多水平越权、垂直越权根本没法测。如果项目方给了测试账号,一定要把各个角色的权限边界搞清楚。
3.2 抓包改包的几个关键习惯
抓包方面我有几个建议,都是实操中踩过坑才总结出来的:
- 跑业务流程时务必开启抓包,全程记录,不要嫌请求多。特别是注册、登录、找回密码这三类接口,后期回溯的时候经常有意外发现。
- 关注每个请求中的隐藏参数,比如step、type、role、status、from、scene这些字段,它们往往是逻辑漏洞的“开关”。
- 改参数之前,先想清楚这个参数在后端是怎么被使用的。如果这个参数是身份标识(id、uid、phone),价值就非常大;如果只是展示型的参数,改了也没啥意义。
- 养成保存数据包的习惯,尤其是可疑的请求,导出到本地文件,方便后面写报告时使用。
这里插一个我常用的“三板斧”测试思路:第一,看到请求里有ID类的参数,就替换成其他值测越权;第二,看到状态类的参数,就改成其他合法值测状态绕过;第三,看到金额类参数,就改成0、1、-1等边界值测支付逻辑。三板斧打完之后,再结合具体业务深入发掘其他可疑点。
3.3 高频测试手法:ID替换、并发/条件竞争、越权盲测
具体手法上,除了前面提到的ID替换和参数篡改,还有两个手法特别值得强调:
第一个是并发/条件竞争测试。条件竞争漏洞的根源是,系统在处理一个请求时,没有对共享资源做加锁或原子性保护,导致多个并发请求同时修改同一份数据时发生错乱。最典型的例子是:充值接口发送一个100元的请求,同时在极短时间内重放10次,如果系统没有处理好幂等性,账户余额可能加了1000元。测试时可以用Burp Suite的Repeater开几个标签页,配合发送大量并发请求的工具,或者自己写个简单的并发脚本,观察结果是否有异常。
第二个是越权盲测。有些接口因为前端入口隐藏比较深,抓包时看不到,但接口本身是存在的。这时候可以通过观察其他请求中的接口命名规律,猜测可能存在的高权限接口,然后直接构造请求去访问。比如前端有/user/order/list,你可以试着访问/admin/order/list,如果返回了管理员数据,又是一个垂直越权。
不过并发测试一定要谨慎,注意请求数量不要过大,以免把目标系统打挂。我在SRC测试中坚持一个原则:能用10个并发解决的问题,绝不用1000个,毕竟测试的目的是发现漏洞,而不是制造事故。
3.4 从“无法利用”到“降级利用”的思路转变
挖逻辑漏洞时,很多时候你遇到的缺陷并不会直接导致严重危害,这时候千万别放弃。我见过不少漏洞,单独看影响面很小,但组合起来却能造成严重问题。
举个例子,某个系统的短信验证码接口存在用户名枚举漏洞,单独来看只是泄露用户是否存在,技术含量不高,危害评为低危。但如果这个系统和密码找回功能联动,攻击者可以利用枚举结果锁定有效账号,再结合验证码不失效的问题去爆破,就能扩大成任意账号重置的高危漏洞。
所以,测试逻辑漏洞一定要养成“组装”的习惯:这个低危问题能不能帮助另一个中危问题变成高危?这两个看似无关的问题叠加起来会不会形成一条完整的攻击链?SRC平台在评估漏洞严重程度时,很多时候看的是最终影响面,不是单点问题。
影响判定也有技巧:越权漏洞如果能读取他人手机号、身份证号等敏感字段,就是高危;如果只泄露了用户名这种公开信息,可能只是低危。支付漏洞如果能免费购买商品或直接套现,那就是严重等级。在写报告时,要把影响面讲清楚,最好给出一个攻击链说明,这样厂商评估起来也更快。
4. 一个完整实战案例复盘:从发现到报告输出
4.1 案例场景与初步侦察
这个案例来自某电商类SRC项目,当时我抽到的目标是一个B2B采购平台。平台的核心业务是商家入驻、商品发布、采购方下单、支付和结算,看起来功能比较常规,但业务链路很长,是一个很适合挖逻辑漏洞的系统。
我开始做业务建模时,注册了一个普通企业账号,完整跑了一遍入驻流程、商品发布流程和下单流程。在下单环节,我发现一个有意思的接口:当采购方提交订单时,前端会传一个discountAmount字段,用来表示平台给予的优惠金额。我当时下意识地觉得,这个字段可能是个切入点,因为如果后端直接信任前端传入的优惠金额,那我就可以给自己创造任意优惠。
4.2 测试思路推演与踩坑过程
我首先尝试把discountAmount改成负数,结果后端返回了错误,说明有基本的数值范围校验。接着我把它改成0.01元,提交订单,结果系统提示“优惠金额不能大于订单总额”,又有校验。看起来这个字段做了不少检查,但就是这种“总觉得不要紧”的感觉让我继续挖了下去。
我重新打开抓包记录,发现结算接口和下单接口是分开的。结算接口负责计算优惠后金额,下单接口负责创建订单。正常流程是先调结算接口,拿到优惠后的金额,再带着这个金额去调下单接口。于是我想:如果只调下单接口,并且把下单接口里的优惠金额字段改写,会不会绕过结算接口的校验?果然,我直接构造下单请求,把优惠金额改成10000元,订单总金额被扣减到几乎为零,下单成功。有意思的是,结算接口做过严格的金额校验,但下单接口居然完全没有二次校验优惠金额和订单金额之间的关系。
4.3 成功利用与影响范围确认
漏洞确认之后,我开始评估影响范围。测试发现,只要知道目标商品的ID,任何人都可以构造恶意下单请求,以任意低价购买平台上的任何商品,包括高价值的机械设备类目。更严重的是,这个漏洞还影响商家结算:因为订单金额被改低,系统按错误的订单金额结算给商家,直接造成商家的资金损失。
为了进一步确认漏洞的影响边界,我又尝试了水平越权的可能。改动订单接口中的supplierId字段,发现竟然可以以其他商家的名义下单,修改订单归属,导致订单混乱。这个组合影响一下子把漏洞等级从“单个订单金额篡改”拉升到了“核心交易链路被劫持”的严重级别。
后来我也验证了,这个漏洞的根因在于后端没有在“下单”环节重新从数据库读取商品原价、也没有在服务端重新计算优惠金额,只是盲目信任了客户端传来的结算结果。只要设计时在服务端做一次独立的金额计算,或对前端传入的优惠金额做严格的白名单校验,问题就能解决。
4.4 报告输出:怎么写才能被快速确认
写报告是SRC挖掘里非常重要的一环,很多新人漏洞找到了,但因为报告写得模糊,被厂商打回或迟迟不确认。根据我的经验,一份好的业务逻辑漏洞报告应该包含以下几块内容:
- 漏洞概述:一句话讲清楚影响,比如“下单接口未校验优惠金额,可导致任意商品低价购买”。
- 影响范围:明确哪些接口受影响、哪些用户受影响、可能造成什么结果,最好标注严重等级。
- 复现步骤:按顺序列出每一步操作,并配上抓包请求截图或关键参数截图,确保厂商技术可以照着复现。
- 攻击效果截图:证明漏洞真实可利用,比如成功低价下单的订单页面、数据库字段变化截图等。
- 修复建议:给出具体的修复方案,如果不懂怎么修,可以把原始请求和相关参数说明写清楚,让厂商自己判断。
报告里最容易犯的错误是“光说思路不带证据”。截图和请求记录一定要保存好,尤其是在测试过程中每一步操作都要有对应记录。我当时把整个攻击请求的原始HTTP包、响应包以及最终的订单快照一起贴进了报告,厂商技术大概用了十分钟就确认了漏洞,评级直接为严重。
5. 挖掘业务逻辑漏洞的常见误区和避坑指南
5.1 误区:扫描器跑一遍就等于测完了
这是新人最常犯的错误。扫描器能发现的是技术型漏洞,对逻辑漏洞几乎无能为力。我看到太多人拿着一个扫描器扫完所有目标和接口,发现没有SQL注入、没有XSS就得出“没漏洞”的结论,白白浪费了SRC项目名额。正确的姿势应该是:扫描器只用来做信息收集和辅助探测,真正的主战场在于手工分析业务流程。
所以在实战中,我会给自己定一个规矩:每个核心业务流程至少完整走三遍。第一遍当正常用户走,熟悉参数;第二遍打开抓包工具,逐步分析每个接口的参数意义;第三遍专门尝试篡改、跳过、重放各种操作。三遍走完,这个系统的逻辑漏洞基本心里有数了。
5.2 实操中的边界问题:别把生产环境打挂了
在SRC项目里测试逻辑漏洞,有一个必须时刻绷紧的弦:尽可能不要影响线上正常业务,不要做破坏性操作。比如测试支付漏洞时,不要真的把订单支付完成,更不要尝试提现;测试删除类接口时,不要真删除别人数据;测试并发时,控制好请求频率,避免压垮服务器。
一旦不小心对生产环境造成了影响,要立即停止测试,并在报告中向厂商说明情况和原因。诚信和责任感在安全圈是非常重要的品质,一个乱来的测试者口碑坏了就很难混了。
另外还要注意测试数据的保护。测试过程中抓到的包、获取的用户数据,绝对不能外泄,也不能利用这些数据做任何超出授权范围的事情。
5.3 报告细节与沟通技巧:减少来回扯皮
报告质量直接决定了漏洞确认效率和奖金高低。有几个沟通技巧分享给大家:
- 复现步骤一定要清晰到“傻瓜式”,厂商技术人员哪怕没接触过这个业务,照着做也能复现出来,这样确认率会高很多。
- 影响描述要克制,不要夸大,也不能保守。比如证明可以读取他人手机号,就明确写“可读取任意用户手机号”,不要模糊成“可读取用户信息”。
- 修复建议要尽量具体。虽然你不需要替厂商写代码,但提供思路能体现专业度,比如“建议后端从数据库重新读取商品原价并在服务端计算金额,忽略前端传入的金额参数”,这样厂商反馈也会更快。
- 如果发现漏洞后厂商没有及时反馈,可以在合理时间后礼貌跟进,但不要频繁催促。
最后再聊一个我自己很受用的习惯:每次测完一个SRC项目,我都会把业务流程图、漏洞类型、测试手法和最终报告整理成一份本地笔记。下次遇到同类业务时,直接翻出来对照着测,效率提升非常明显。逻辑漏洞挖掘本质上是一场“思维习惯”的较量,多测、多复盘、多记录,时间长了自然就有感觉了。