资讯详情

资讯详情

业务逻辑漏洞挖掘实战:从越权到支付绕过的SRC高价值漏洞方法论

搞安全的都知道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和参数然后尝试跳过、重放、篡改每一个环节。我记得有一次测试某个系统找回密码第一步验证完手机验证码之后响应包返回了一个step2的隐藏参数我直接改成step3提交结果第三部接口直接给新密码设置成功了。这种问题就是典型的流程状态校验缺失。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项目我都会把业务流程图、漏洞类型、测试手法和最终报告整理成一份本地笔记。下次遇到同类业务时直接翻出来对照着测效率提升非常明显。逻辑漏洞挖掘本质上是一场“思维习惯”的较量多测、多复盘、多记录时间长了自然就有感觉了。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →