做了一段时间Web安全,你会发现一个挺有意思的现象:漏洞报告里真正让甲方紧张的,往往不是一个SQL注入点,也不是某个XSS弹窗,而是一组看起来平平无奇的业务操作。比如改一下订单金额、绕过一步验证、多提交一次请求,结果就把核心数据或者资金流程搅翻了。这类问题有一个统一的称呼——业务逻辑漏洞,它在漏洞圈子里属于那种“不可思议但又无处不在”的存在。这篇文章就是给刚接触Web安全的朋友做一次基础入门拆解:它到底是什么、通常藏在哪些环节、怎么发现、怎么修,以及我在实际测试和代码审计里踩过的那些坑。
业务逻辑漏洞之所以值得单独拿出来讲,是因为它跟传统漏洞完全是两个物种。传统漏洞拼的是“代码写错了”,业务逻辑漏洞拼的是“功能设计本身就留了口子”。而且这类漏洞没有任何通用扫描器能一键扫出来,只能靠人一点点捋业务、试参数、想场景。想在这个方向入门,思路比工具重要得多。
1. 到底什么是业务逻辑漏洞
先解释一个最基础的问题:业务逻辑漏洞到底指什么。
一句话概括,业务逻辑漏洞是“应用程序在实现业务流程时,对用户输入、状态流转、权限判断、资源访问的假设不合理,导致攻击者可以通过合法功能模块完成预期之外的破坏动作”。用大白话讲就是:系统每个功能看起来都能正常工作,但把几个功能按照特定顺序组合起来,或者传入特定参数,系统就干了它不该干的事。
我用一个生活化的例子辅助理解。假设你去银行柜台办理转账,柜员让你填一张转账单。单子上有“转账金额”“收款人账号”“收款人姓名”。正常来说,柜员会把这三项都核对一遍,再执行转账。但如果这个柜员偷懒,只看了金额,没核对收款人姓名,那你把收款人账号写成别人、姓名写成自己,钱也会转出去——这就是业务逻辑漏洞,柜员的流程假设是“客户填写的姓名和账号一定匹配”,但这个假设并没有被强制校验。
放到Web系统里,这个“柜员”就是后端接口。它认为前端传过来的参数都是可信的,认为用户一定会按页面上的流程点击,认为同一个请求不会被人反复提交,认为用户A不会去操作用户B的资源。这些“认为”一旦不成立,漏洞就出现了。
所以业务逻辑漏洞有几个非常鲜明的特点:
- 不依赖代码缺陷:很多逻辑漏洞的代码本身是正常运行的,没有报错、没有溢出、没有注入点,但它实现出的业务规则就是可以被绕过的。
- 扫描器基本无效:因为漏洞埋在业务流程里,而扫描器只能看到单个请求、单个页面的“语法级”问题,理解不了“先A后B再C”的语义。
- 危害往往直达核心资产:改价格、越权看数据、绕过付费、无限领取、篡改他人信息,这些直接命中业务KPI,所以每一条逻辑漏洞的修复优先级都非常高。
再说一个容易被误解的点:业务逻辑漏洞不等于“功能Bug”。功能Bug是“系统没有按需求实现”,比如前端想传amount=1000但后端算出来是100。业务逻辑漏洞是“系统按需求实现了,但需求本身的边界没想清楚”,比如支付金额取的是前端传参,接口根本不关心后端自己算的价格。理解了这层区别,后面测试时就能少走很多弯路。
2. 从哪些角度去拆一类业务逻辑漏洞
《中华人民共和国网络安全法》和《中华人民共和国数据安全法》都确立了网络安全责任制与数据安全保护义务。任何安全测试都必须基于授权、限定在测试环境或取得书面许可的生产环境范围,本文的讨论只用于防御建设与合规学习。
1.2 漏洞的本质:信任边界被打破
想真正理解业务逻辑漏洞,必须抓住一个核心概念——信任边界。
设计任何系统时,开发人员都会在心里默默划分“什么是可信的,什么是不可信的”。最理想的安全模型是:所有来自客户端、来自用户输入、来自外部系统的数据都不可信,后端在每次使用时都必须校验。但现实是,开发人员为了让代码简洁、性能更好、交互更顺畅,会悄悄地把某些输入划为“可信”范畴。业务逻辑漏洞,本质上就是这些信任边界被打破的位置。
举几个最常见的信任假设:
| 信任假设 | 现实风险 |
|---|---|
| 前端页面会按设计流程运行 | 攻击者可以直接跳步、回退、并发请求 |
| 前端传参的值就是真实值 | 抓包改参数,后端不校验就用 |
| 用户只能操作自己的数据 | 改ID或对象引用即可访问他人数据 |
| 验证码是一次性的 | 验证码不失效、可重放,或逻辑上校验不严 |
| 业务状态只能按序流转 | 通过多开页面、并发请求打乱状态机 |
| 金额、数量的值已由前端计算好 | 后端不重新计算,直接信任前端结果 |
每一个“信任假设”背后,都对应一整套可以被系统性挖掘的漏洞场景。这也是为什么我在做测试的时候,拿到一个新系统,第一件事不是跑扫描器,而是把所有接口的参数和业务状态流转图梳理一遍——因为我需要知道开发人员“信任了什么”。
1.3 和传统注入、XSS的本质区别
很多新人刚接触安全时,最先学的是SQL注入、XSS、文件上传这类漏洞,学习路径上往往把业务逻辑漏洞放在最后。这导致一个思维惯性:总觉得漏洞必须有“恶意输入特征”。
SQL注入的本质是输入没有被正确解释,攻击者输入的单引号、关键字被拼接进了SQL语句,改变了语句语义。XSS的本质是输出没有被正确编码,攻击者输入的内容被浏览器当成了HTML/JavaScript执行。这两类漏洞都有明确的“恶意字符”和“代码模式”可检测,所以WAF、扫描器能帮上忙。
业务逻辑漏洞完全不在这个维度里。它的攻击载荷往往就是几个普通数字、一个正常的JSON结构,甚至不包含任何特殊符号。攻击者做的事情就是“把正常操作异常化”:把购买数量从1改成负数,把优惠券使用次数从1改成100,把订单状态从未支付改成已支付,把请求重发200次。
打个比方:注入类漏洞像是有人用撬棍撬开了你家窗户,特征是“撬棍”和“窗户损坏”;业务逻辑漏洞像是有人拿着你家的钥匙、从正门走进来、打开了不该开的保险柜,特征是“行为顺序不对”。前者靠痕迹检测就能发现,后者必须理解“什么行为才是合理的”才能发现——这就是为什么它这么难防。
2. 最常见的几类业务逻辑漏洞场景
这一节把我在授权测试中碰到的场景做一个分类整理。每一类我都会说明成因、危害和基本判别思路。分类不求学术严谨,但求实战实用。
2.1 越权漏洞:水平越权与垂直越权
越权漏洞可能是出现频率最高的业务逻辑漏洞。核心成因是“后端没有校验当前用户对目标资源的操作权限”。
水平越权:A用户能操作B用户的同等资源。最常见的载体是ID参数。比如查看订单详情的接口是/api/order/detail?id=10001,后端只根据ID查数据,不校验这个订单到底属于谁。攻击者把ID改成10002就能看别人的订单。这类漏洞在用户中心、订单中心、文件下载、发票查询等功能里极其常见。
垂直越权:低权限用户能执行高权限操作。常见场景是普通用户直接请求管理员接口。比如管理后台的接口是/api/admin/deleteUser?id=5,但是系统只在前端判断“当前用户是不是管理员”,后端接口本身没有校验角色,普通用户直接构造这个请求就能执行删除操作。
实际测试时,我会先用两个测试账号A和B,分别记录A请求里能操作B的资源ID,然后换成B的登录态去请求A的资源接口,逐个对比返回是否越权。垂直越权则需要收集低权限账号能访问的API清单、高权限账号能访问的API清单,做差集后逐个测试。
水平越权比垂直越权更容易出现,因为很多开发人员对“角色权限”有意识,但对“数据归属权限”没有意识。而数据归属校验恰好在业务复杂、资源类型多的时候最容易漏——漏一次,就是一个越权。
2.2 支付与订单绕过
支付逻辑漏洞是我个人认为所有业务逻辑漏洞里“性价比最高”的一类,因为一旦打通,往往直接产生资金损失。新手入门时,可以从几个典型切口入手:
改价格/改金额。很多电商系统把价格、优惠金额直接放在前端参数或者隐藏域中,后端计算总价时直接使用前端传值。测试方法很简单:把商品加入购物车后,抓包把price=100改成price=1,提交订单看后端是否按新价格生成订单。
负数/零元交易。把购买数量改成-1,或者把优惠金额改成大于商品原价,导致应付金额为负数。某些系统还会出现账户余额反而增加的奇葩情况,就是因为后端没有对交易金额做正负校验。
优惠券与营销资产重放。优惠券、积分、红包这类资产,如果后端不校验“已使用”状态,攻击者可以反复提交同一个领取请求,把优惠券无限刷。这类漏洞的本质是“幂等性缺失”。
订单状态机绕过。电商订单有“待支付→已支付→已发货→已完成”的状态流转,但有些系统状态字段可以任意指定。攻击者直接提交status: paid,跳过支付网关回调,把订单改成已支付。测试时我会重点观察“支付回调”接口——它是否校验签名、是否校验金额与订单一致、是否防止重复通知。
2.3 验证码与认证流程绕过
认证流程是业务逻辑漏洞的重灾区。密码重置、短信登录、注册流程里,几乎每个环节都有人踩过坑。
最常见的是验证码校验逻辑设计不当。典型案例包括:验证码校验放在前端;验证码下发后不过期;验证码位数太少且无尝试次数限制;验证码在校验成功后不销毁;短信验证码与手机号绑定关系弱,导致可以接收他人验证码。测试时我常做的验证是:抓包拿到验证码校验接口,先正确提交一次,再修改手机号字段,看能否用同一验证码绑定新手机号完成重置。
另一种是密码重置流程可跳步。比如重置密码有“输入手机号→输入验证码→设置新密码”三步,URL里带了step=2之类的参数。攻击者直接修改step参数跳到第三步,就能为任意手机号设置新密码。
还有一种隐蔽情况是验证码与请求解耦。比如后端只校验“验证码是否正确”,没校验“验证码是否属于当前手机号”。攻击者可以用自己的手机号收验证码,然后把这个验证码用在目标手机号的重置流程上——只要后端把所有验证码都放在一张表里统一校验,这个逻辑就成立。
认证流程的排查思路,我在第三节详细展开,因为它的测试节奏和普通接口不一样,需要结合业务流程一步一步来。
2.4 竞态条件与并发重放
竞态条件(Race Condition)是稍微进阶一点、但研究和利用起来非常有趣的一类逻辑漏洞。
它的成因是:多个并发请求同时操作同一资源,由于后端没有加锁或者没有做幂等控制,每个请求都以为自己独占了资源,导致校验被绕开。最经典的例子是余额并发:用户余额只有100元,正常只能买一件100元的商品,但攻击者同时发送10个购买请求,后端每个请求都检查余额“当前是100”,然后扣100、再扣100……最后10个请求全部成功,账户余额变成负数。
测试竞态条件的方法不复杂:准备一个测试账号,找到“校验+扣减”间隔较长的接口,然后用并发工具同时发多个请求看效果。我常用的方式是写一个Python脚本,用concurrent.futures或asyncio同时发几十个请求,观察是否出现重复发放、重复扣减、重复创建的情况。
这类漏洞在“抽奖”“限量抢购”“积分兑换”“邀请奖励”里尤其常见。因为业务方为了用户体验,通常做了“先检查后扣减”的逻辑,但检查跟扣减之间没有原子化操作——这就是天然的竞态窗口。
2.5 接口参数过度信任
最后一类场景是“接口参数过度信任”,它也是很多逻辑漏洞的共同根源:后端接口直接使用前端传参来驱动核心决策,却不重新计算、不校验。
典型案例我列几个:
- 商品数量、单价、运费全部由前端传参,后端原样使用。
- 身份证号、手机号、邮箱等字段不校验格式,直接写入数据库。
- 分页大小、排序字段直接拼接,能控制查询范围或绕过数据过滤。
- 禁用状态可以直接被参数覆盖,比如
enable=false改成enable=true。 - 用户角色、会员等级、积分倍数等字段可以在注册或资料修改接口传入。
参数过度信任的可怕之处在于,它不像注入那样有“明显恶意”,但影响面非常广。一个图片上传接口,如果文件名是前端传的,攻击者就可以传任意路径;一个下载接口,如果文件路径是前端传的,攻击者就可以传../../etc/passwd——这又串到了路径遍历漏洞。所以我在实际测试中,会把每个接口的参数名、类型、约束全都列出来,专门标记那些“参与业务决策”的参数,逐个尝试越界值。
3. 一次完整的业务逻辑测试排查思路
理论讲完,就该讲实操。这一节我会还原一个典型的授权测试流程,从拿到目标到产出报告,尽量把每一步的关键动作和依赖思路说清楚。
重要前提:以下所有测试动作,必须基于书面授权,限定在测试环境或明确授权范围。没有授权的系统,只能做防御性自检,不能做任何试探性操作。
3.1 第一步:信息收集与业务梳理
做逻辑漏洞测试,信息收集的重点不是端口,而是业务功能清单和权限模型。
我先做的是“阅读理解”:把目标系统的注册、登录、首页、列表、详情、下单、支付、个人中心、后台管理等所有页面过一遍,记录每一条业务流程。同时建立一张接口清单表,包含:接口地址、请求方法、参数名、业务含义、当前登录态、是否需要特殊权限。
一个实用技巧是“角色矩阵法”:我注册两个普通用户账号A、B,再申请一个低权限管理账号和一个高权限管理账号,然后用四个账号分别录制一份完整的操作流量包。后面所有越权测试都基于这四个账号之间的对比,效率会高很多。
还需要重点确认的,是系统的“状态机”。比如订单状态有哪些?从“待支付”到“已支付”的触发条件是什么?是用户主动请求,还是支付回调?把这些问题用文字描述清楚,后面找跳步漏洞时会轻松不少。
3.2 第二步:枚举接口与参数试探
有了接口清单后,我进入参数试探阶段。这一步的核心原则是:默认所有参数都不可信,逐个测试每一个参数的边界和业务影响。
具体动作包括:
- 修改资源ID或对象引用,验证水平越权;
- 修改角色、权限相关字段值,验证垂直越权;
- 修改金额、数量、折扣、税率、积分,验证是否参与后端计算;
- 修改订单状态、步骤号、流程标记,验证是否能跳步或回退;
- 删除或修改请求头里的认证信息,观察后端是否依赖Header鉴权;
- 对GET/POST/PUT/DELETE方法做替换,看是否有“方法级越权”;
- 把单值参数改成数组、对象、多层嵌套,观察后端解析差异。
这些试探我用Burp Suite的Repeater逐条做,并在每个接口旁边记录结果。有一个思路特别重要:不要只测正常参数值,重点测“看起来不该存在但接口里确实存在”的参数。比如前端页面没有“价格”输入框,但提交购物车请求里带了price字段——这种参数十有八九是后端直接使用的,非常值得深挖。
3.3 第三步:流程串联与时序、并发测试
单接口测试只能发现简单的参数信任问题,更复杂的逻辑漏洞藏在“多个接口串联”和“并发时序”里。
流程串联的典型手法是“跳步测试”。比如“找回密码”是五步操作,正常情况下每一步都会校验上一步的完成状态,但有些系统的校验逻辑松散,导致攻击者可以直接请求最后一步的接口。测试时我先正常走完一遍流程,保存每一步的请求,然后分别跳过前一步、前两步,直接发起后面的请求,观察后端是否拦截。
时序测试的重头戏是竞态条件。找到一个“先检查后操作”的接口,比如“领取优惠券”“积分兑换”“试用开通”“余额支付”,然后用并发脚本一次性提交多个请求。这里我给出一个可以直接改着用的示例脚本,仅限授权测试环境使用:
#!/usr/bin/env python3 # 竞态条件测试并发脚本,仅限授权测试环境 import asyncio import httpx async def send_one(client, url, token, data): headers = {"Authorization": f"Bearer {token}"} try: resp = await client.post(url, json=data, headers=headers, timeout=10) return resp.status_code, resp.text[:80] except Exception as e: return "error", str(e) async def main(): url = "https://target.example.com/api/coupon/receive" token = "在此填入测试账号token" payload = {"couponId": 1001} async with httpx.AsyncClient() as client: tasks = [send_one(client, url, token, payload) for _ in range(30)] results = await asyncio.gather(*tasks) for idx, (status, body) in enumerate(results): print(f"请求{idx:02d} -> {status} | {body}") if __name__ == "__main__": asyncio.run(main())运行时的观察点:如果30个请求全部返回“领取成功”,说明并发控制缺失;如果只有1个成功,其他报“已领取”,说明有并发控制。很多系统在低并发下看似正常,到了20并发以上才会漏,所以建议并发量从10、30、50梯度递增,每一轮之间等待几秒,避免把测试环境打挂。
3.4 第四步:结果记录与风险定级
逻辑漏洞测试的结果记录,比传统漏洞更需要“可复现”和“影响说明”。因为逻辑漏洞往往需要多步操作,报告里每一步都必须写清楚,否则研发很可能复现不出来、不确定是否要修。
我的报告模板大致是:
- 漏洞标题:简洁且能体现业务影响,例如“订单金额可被前端参数篡改,导致0元购”;
- 漏洞位置:接口地址、参数名、请求方法;
- 复现步骤:从登录开始每一步操作、每一个请求包、每一次页面点击都写清楚;
- 影响分析:说明该漏洞可能造成的资金损失、数据泄露范围、被利用难度;
- 修复建议:从研发视角给出具体建议,比如“后端从数据库读取价格,不信任前端传值;增加金额签名校验”等。
风险定级上我参考行业通用标准,结合业务影响来判断。能够造成资金损失的支付逻辑漏洞、影响大规模用户数据泄露的水平越权,一般都定高危,甚至严重;只在特定条件下才可利用的并发请求,通常定中高危;仅影响自身数据、无法横向扩展的,定低危或中危。没必要为了“漏洞数量好看”把所有问题都往高危上报,真实可信的报告才更有价值。
4. 防护思路:从研发和测试两条线一起堵
相比发现漏洞,更难的是在设计和编码阶段就堵住业务逻辑风险。这一节我把实用的防护思路分成研发侧和测试侧两部分。
4.1 研发侧的核心防御原则
后端永远别信前端。这句话值一个加粗。任何涉及金额、数量、状态、权限、身份、验证码的字段,后端都必须自己计算或从数据库读取,不能直接拿请求参数当判断依据。
我在代码审计时总结的几条硬性原则:
- 权限校验后端化:前端隐藏按钮不算权限控制,后端每个接口都要校验“当前用户是否有权访问目标资源”。校验资源归属时,用“用户ID + 资源ID”联合查询,而不是先查资源再判断。
- 金额以服务端计算为准:前端传的金额、折扣、数量只作展示,后端必须用数据库价格和商品ID重新计算总价。优惠金额要校验非负,总价要校验等于“商品单价 x 数量 - 优惠 + 运费”的结果。
- 验证码一次性且绑定上下文:验证码无论校验成功还是失败,都应该立即失效;验证码必须与接收手机号/邮箱绑定;校验时要校验验证码与请求中的手机号、业务场景是否一致;尝试次数要限制。
- 关键操作幂等化:领取、扣款、下单、兑换这类操作,要么加数据库唯一约束,要么用令牌机制保证同一请求只能成功一次。防止用户重复提交、并发重放。
- 状态机统一校验:订单、任务、审批流程的状态,只能在后端统一的状态机里流转,不允许用户直接传入状态值。后端要校验“当前状态能否迁移到目标状态”。
- 对象引用加访问控制:所有通过ID、文件名、路径访问的资源,都要在查询前校验归属和角色。ID尽量用无法猜测的长随机数,但注意这只是提升攻击成本,不能替代访问控制。
4.2 测试侧的业务场景覆盖方法
对测试人员(或者想自查的系统所有者)来说,静态配置和各种扫描器都替代不了手工业务测试。两个实用方法:
正向流程遍历法:列出系统所有核心业务流程,每条流程用正常账号走一遍,记录“每个接口接受哪些参数、是否存在状态依赖”。然后针对每个接口做参数篡改、流程跳步、权限替换三类变体测试。这个方法到位,绝大多数逻辑漏洞都能覆盖到。
反向思维导图法:拿到一个业务的第一步,先问“这个业务最怕发生什么”。比如“领券”怕被无限领取,“登录”怕验证码被绕过,“上传”怕传了非预期文件类型。把“最怕的事件”一一列出来,每一项对应到具体接口和参数,测试就变成了“验证这些最怕事件是否可被触发”。这个方法会逼着测试者从攻击者视角思考,效果比顺着页面功能点漫无目的地测好太多。
4.3 让防护落到流程里
仅靠开发人员自觉,逻辑漏洞很难彻底消除,必须在研发流程里加两道保障:
- 需求评审阶段加上“安全设计评审”。需求文档里出现“前端传入”“用户输入值直接使用”“不做二次校验”等表述时,安全人员应该直接提出质疑。
- 上线前做“关键链路专项安全测试”。对支付、登录、权限、兑换积分这类高价值链路,安排专项逻辑测试,并保留自动化回归用例。每次业务升级时都重新跑一遍,避免旧漏洞回归。
5. 常见问题与排查技巧实录
最后一部分,把业务逻辑漏洞测试里最高频的疑问和踩坑经历整理出来,相当于一份速查手册。
5.1 问题速查表
| 现象 | 可能原因 | 排查思路 |
|---|---|---|
| 修改ID后能看他人数据 | 缺少水平越权校验 | 对所有带ID的接口做归属校验测试 |
| 修改金额后订单价格跟着变 | 后端直接使用前端金额 | 检查下单接口是否重新计算价格 |
| 同一优惠券能重复使用 | 缺少幂等控制或多实例并发 | 检查领取/使用接口的数据库唯一约束 |
| 验证码在别处也能用 | 验证码与业务上下文未绑定 | 检查验证码校验逻辑是否只校验“是否匹配” |
| 直接请求最后一步能成功 | 缺少状态流转校验 | 检查流程接口之间是否有状态标记和校验 |
| 并发发请求全部成功 | 竞态条件 | 检查资源扣减是否加锁或原子化 |
| 普通用户能调用管理接口 | 缺少后端角色校验 | 检查管理接口是否只依赖前端角色判断 |
| 越权修改他人资料成功 | 资源归属校验缺失 | 检查更新接口是否查询了资源所属人 |
遇到这些现象,第一反应不要急着打补丁,而是先定位“是哪一层信任假设被打破了”,再决定修复方案。修复方案如果只是“前端加一个判断”,那等于没修,因为攻击者根本不经过前端。
5.2 几个实操中的坑
第一个坑:测试竞态条件时把测试环境打崩。原因是我把并发量调到了200,而且没有加延时,直接触发了数据库锁风暴和应用宕机。后来学乖了,并发量从10开始、逐步递增,每轮间隔5秒以上,并且只在自己有完全掌控权的测试环境里做高并发测试。
第二个坑:做越权测试时账号选择不对。早期我只用一个普通账号测参数篡改,没有用第二个账号做交叉验证,结果把“正常功能”误判成“越权”,还写出了错误报告。后来固定用A、B两台账号分别造不同资源,用A的登录态访问B的资源,才算真正落地越权验证。
第三个坑:忽略重放请求的危害。早期我测验证码时只顾着看“能否绕过”,没测试“验证码请求能否重放”。后来发现很多系统的验证码接口虽然是安全的,但“业务数据提交接口”缺少防重放机制,导致同一条业务请求可以被无限次重放,刷出大量异常数据。所以现在我把“重放测试”列为所有关键接口的必测项,做法是保存一个正常请求包,用Repeater反复发送,观察第二次之后是否会被拦截。
第四个坑:把时间浪费在低价值参数上。早期测试时我喜欢把每个参数都用脚本跑一遍,结果大量时间花在“昵称长度”“头像URL”这种不影响业务决策的参数上,效果很差。后来我的注意力只集中在三件事:参与权限判断的参数、参与成本计算的参数、参与状态流转的参数。其他参数只有在明显带入反射时才看一眼。
第五个坑:报告里缺少“前置条件”。有些逻辑漏洞需要特定低权限账号、特定商品状态、特定时间窗口才能复现,早期我在报告里没写清楚,研发复现时总是不成功,来回拉扯了好几轮。现在我会把所有前置条件(账号、订单状态、时间、Cookie、环境)单独列一节,复现步骤从登录开始写,保证一个没接触过系统的人也能按文档复现。
5.3 对新手入门的一句话经验
业务逻辑漏洞入门,不需要先背一堆理论,更不需要精通每一类漏洞的利用技巧。最有效的方法是找一个自己熟悉的系统或靶场,把注册、登录、支付、订单、个人中心几个模块一条一条地过,每过一条就问自己:“这里如果我是坏蛋,我会怎么改参数、怎么跳步骤、怎么多拿一次?”
我个人的体会是,业务逻辑漏洞测试的“手感”是练出来的,练到后面你会形成一种直觉——看到接口清单,看到参数名,就能本能地列出哪几个字段最值得试,哪几个流程最值得跳,哪一种并发最可能漏。这种直觉没有任何扫描工具能替代,它来自大量授权测试的积累,也正是这个领域最让人着迷的地方。
最后再分享一个小技巧:做逻辑测试时,把浏览器流量代理和Burp Suite的History留着,隔几天回看一遍。很多当时没注意的“正常请求”,事后结合业务背景重看,会发现原来也是可以利用的。安全测试这种工作,慢就是快,细致就是效率。