支付逻辑漏洞挖掘实战:从业务模型到SRC报告的全流程解析

📅 2026/6/26 5:47:01
支付逻辑漏洞挖掘实战:从业务模型到SRC报告的全流程解析
1. 项目概述从“支付”到“漏洞”一个SRC猎手的核心战场在安全圈里混了十几年我见过太多刚入行的朋友一听到“支付漏洞”眼睛就放光觉得这是通往“财富自由”的捷径。但现实往往是他们要么在复杂的业务逻辑里晕头转向要么在看似简单的支付流程前无功而返。今天我就以一个老SRC安全应急响应中心猎手的身份抛开那些华而不实的理论带你实战走一遍支付漏洞的挖掘全流程。这不是一篇教你如何“薅羊毛”的教程而是一份系统性的攻击面分析与逻辑缺陷挖掘的思维地图。支付环节作为任何涉及交易的应用最核心、最复杂的业务模块其安全性直接关系到企业的真金白银和用户信任。挖掘这里的漏洞考验的不仅是你的技术工具熟练度更是你对业务、对人性的理解深度。无论你是想投身企业SRC、教育SRC如edusrc还是各大漏洞平台吃透支付逻辑都是你必须跨过的一道坎。2. 支付漏洞的核心攻击面与思维模型拆解支付漏洞的本质是业务逻辑上的缺陷而非单纯的技术栈漏洞。它不关心你用的是Java还是Go是Vue还是React它只关心“钱”的流转逻辑是否严密。因此我们的挖掘思路必须从“技术驱动”转向“业务驱动”。2.1 理解支付流程的“四态模型”任何一个完整的在线支付流程都可以抽象为四个核心状态这也是我们攻击的四个主要锚点订单生成态用户提交商品、数量、价格等信息系统生成一个待支付的订单并赋予其唯一标识订单号。漏洞点订单金额、数量、优惠信息是否在客户端可篡改订单号是否有规律可循或可预测支付发起态用户选择支付方式客户端或服务端向支付渠道如支付宝、微信、银行网关发起支付请求生成一个支付流水号。漏洞点支付金额、商品信息在传递给支付渠道时是否被二次确认是否可以伪造支付成功的回调支付确认态支付渠道完成扣款异步或同步通知商户服务器“支付成功”。漏洞点服务端如何验证这个通知的真实性是否仅依赖客户端返回的结果订单状态更新与资金入账是否存在时间差异步漏洞订单完结态商户服务器确认支付成功更新订单状态为“已支付”并执行后续发货、开通服务等操作。漏洞点状态更新是否幂等是否存在通过重复提交请求导致重复发货的可能这个模型是你分析任何支付功能的骨架。拿到一个支付功能先别急着上工具在纸上画出它的这四个状态转换图标注出每个环节的请求、参数和状态判断逻辑一半的漏洞可能就藏在你画图时产生的疑问里。2.2 支付漏洞的六大经典类型基于上述模型我们可以将支付漏洞归纳为几个经典类型这能帮你快速定位测试方向金额篡改漏洞这是最“朴素”的想法。常见于请求包中存在amount、total_fee、price等参数且未在服务端进行强校验。不仅限于改为0或小数还包括修改为负数可能导致余额增加、修改数量与单价不匹配等。订单替换漏洞用低价订单A的支付凭证去完成高价订单B的支付。关键在于系统在支付回调时是认“支付流水号”对应的金额还是认“订单号”本身的状态。如果只校验了支付渠道返回的“成功”状态而未严格比对订单金额就可能中招。重复支付与退款漏洞利用系统处理支付回调的非幂等性。短时间内重复发送相同的支付成功通知可能导致订单重复发货或重复开通服务。与之相对的是退款漏洞如未校验退款金额上限、退款状态等可能实现“超额退款”或“退款不退货”。优惠券/积分滥用漏洞无限领取优惠券、叠加使用本应互斥的优惠、修改优惠券面额或使用门槛。重点检查优惠规则的校验是在客户端还是服务端以及多个优惠策略组合时的计算逻辑是否有误。支付过程绕过漏洞这是逻辑的终极漏洞。例如在支付流程中发现某个步骤的验证可以跳过或者直接访问订单完结的接口/order/finish通过修改订单状态参数将未支付的订单直接标记为已完成。客户端校验绕过所有重要的逻辑判断如库存检查、金额计算、优惠资格如果仅仅依赖前端JavaScript或移动端APP进行校验那么通过抓包修改请求、使用旧版本APP、甚至直接禁用JS都可能绕过这些检查。注意在实际漏洞挖掘中纯粹的前端金额篡改如修改HTML元素值已非常罕见成熟的系统都会在后端做最终校验。现在的漏洞更多是上述几种类型的组合与变形需要更精细的流程分析。3. 实战环境搭建与核心工具链配置工欲善其事必先利其器。支付漏洞挖掘对工具的要求更偏向于“流程分析”和“数据操控”而非传统的漏洞扫描。3.1 核心工具三件套拦截代理工具必备这是你的眼睛和手。Burp Suite Professional毋庸置疑的王者。它的Repeater重放、Intruder爆破、Comparer对比模块在测试支付逻辑时无可替代。特别是Proxy的历史记录和Target的站点地图能帮你梳理出完整的支付流程接口。配置要点安装好Burp后第一件事是导入你的浏览器或系统CA证书解决HTTPS拦截问题。在Proxy - Options中确保Intercept是开启的。对于移动端APP测试需要将手机代理设置为你的电脑IP和Burp监听端口默认8080。浏览器开发者工具Chrome DevTools用于快速分析前端逻辑。Network面板记录所有网络请求查看请求参数、响应数据。重点关注XHR/Fetch和Doc类型。Sources面板查看和调试前端JavaScript代码。你可以搜索关键词如amount、total、pay、order来定位前端计算逻辑。Application面板查看和修改LocalStorage、SessionStorage、Cookies。有时优惠信息或用户身份令牌会存在这里。辅助测试工具Postman / Insomnia用于构造复杂的API请求序列模拟完整的支付流程特别是在测试异步回调接口时非常有用。手机抓包环境对于测试移动端APP至关重要。除了使用Burp作代理对于无法配置代理的APP如使用了证书绑定可能需要使用Frida、Objection等动态插桩工具进行绕过。3.2 搭建一个本地测试沙盒可选但推荐如果你完全没有目标或者想先练手强烈建议在本地或虚拟机搭建一个存在已知支付漏洞的测试项目。DVWA (Damn Vulnerable Web Application)虽然老但其Insecure CAPTCHA和Weak Session IDs等模块可以启发你对业务流程安全的思考。bWAPP包含一个经典的Insecure Direct Object Reference (IDOR)漏洞常与订单查看功能结合。OWASP Juice Shop一个现代、功能全面的漏洞练习平台其中包含多个与支付、购物车相关的挑战如“修改商品价格”、“无限优惠券”等非常适合锻炼逻辑漏洞挖掘思维。在沙盒中练习你可以毫无心理负担地进行各种“破坏性”测试深刻理解每一种漏洞的原理和利用方式。4. 步步为营支付漏洞挖掘实战全流程解析现在我们假设面对一个真实的电商网站支付功能从零开始进行挖掘。请跟随这个流程它是我多年经验总结出的高效路径。4.1 第一阶段信息收集与流程测绘不要一上来就盯着支付按钮。先以正常用户的身份完整地走一遍购物支付流程同时用Burp Suite开启全局代理记录一切。浏览商品加入购物车记录/cart/add、/cart/update等接口。关注参数product_id,quantity,price。尝试修改quantity为负数、极大值或小数看服务端如何响应。进入结算页这是关键节点。记录/checkout/init或/order/preview接口的响应。响应体中通常包含了订单摘要商品列表、单价、总价、运费、优惠券折扣、应付总额。仔细查看这些数据是前端计算出来的还是服务端返回的。提交订单点击“提交订单”或“生成订单”记录/order/create接口的请求和响应。响应中你会得到至关重要的order_id订单号和order_amount订单金额。此时订单在数据库中的状态通常是“待支付”。选择支付方式跳转支付记录/pay/request接口。请求参数通常包含order_id,pay_amount,pay_channel支付渠道。响应可能是一个支付表单、一个跳转URL或是一个包含支付参数如商户号、订单号、金额、签名的HTML。支付与回调如果是跳转到第三方支付平台支付宝/微信这一步你无法直接拦截。重点在支付完成后的回调。支付成功后你会被重定向回商户网站的一个页面如/pay/return或/pay/notify。同时支付渠道会异步通知商户服务端一个/pay/notify接口这个是服务端对服务端的你在浏览器看不到但可以通过Burp历史记录或猜测找到。这个异步通知接口是漏洞高发区。用思维导图或笔记软件把上述步骤中涉及的所有URL、关键参数、数据流向清晰地画出来。这张图就是你的“作战地图”。4.2 第二阶段参数分析与篡改测试拿到地图后开始对每个关键接口和参数进行测试。测试金额相关参数在/order/create或/pay/request请求中寻找amount,total,money,fee等参数。尝试修改改为0、0.01、负数、远小于原价的数、远大于原价的数。Burp Intruder技巧如果你不确定参数名可以用Intruder的“狙击手”模式对请求中的所有参数值轮流替换为“0”进行测试。注意修改后重点观察最终支付页面的展示金额和支付渠道生成的支付金额是否同步改变。有时前端改了但支付时传给渠道的还是原价。测试订单标识符参数order_id,out_trade_no,business_id。测试可预测性观察订单号是否连续、是否包含时间戳、用户ID等规律。尝试递增/递减修改访问他人的订单IDOR漏洞。测试可替换性在支付回调接口/pay/notify中尝试用低价订单的order_id和支付流水号替换高价订单的对应参数看系统是否只校验了支付成功状态而未校验订单与金额的对应关系。测试数量与单价在购物车/cart/update阶段尝试修改quantity为负数。有些系统设计不当在计算总价时是单价*数量如果数量为负总价可能为负结合优惠券甚至可能导致“付款后余额增加”的极端漏洞。尝试修改商品price参数如果存在。虽然少见但一些老旧系统或API设计可能存在此参数。4.3 第三阶段流程绕过与状态篡改测试这是更高级的测试需要你对业务流程有更深的理解。跳过支付步骤生成订单后不进行支付直接尝试访问“支付成功”后的页面URL如/order/success。这个URL可能需要order_id作为参数。尝试猜测或寻找直接更新订单状态的接口如/order/status/update。用Burp的Target - Site map功能结合右键“Engagement tools - Discover content”进行目录和文件发现有时能找到后台管理接口或未授权的API。在支付过程中如果遇到验证码、密码确认等步骤尝试直接删除对应请求包中的验证参数或重放上一步的请求看是否能绕过。利用时间竞争条件异步漏洞支付流程中如果“支付成功”到“订单状态更新”到“发货”之间存在哪怕毫秒级的时间窗口就可能存在竞争条件漏洞。测试方法在点击支付确认的瞬间同时用Burp Repeater快速、多次地向订单发货接口如/order/ship发送请求。或者在支付回调处理较慢时快速重复点击浏览器返回的“支付成功”页面。目标是尝试在系统未完成状态同步前触发多次发货逻辑。优惠体系漏洞挖掘无限领取领取优惠券的接口是否对同一用户、同一活动有次数限制尝试重放领取请求。规则绕过优惠券有“满100减10”的门槛。在提交订单前修改购物车总价参数使其刚好超过100领取并使用优惠券后再在最终支付请求中把总价改回低于100看优惠是否依然生效。叠加滥用尝试同时使用多张明确规定不可叠加的优惠券如“新用户专享”和“老用户回馈”。观察优惠计算是在前端合并后提交一个discount_amount还是后端根据提交的coupon_id_list逐一计算。4.4 第四阶段支付渠道与回调的深度测试这是支付漏洞的“深水区”也是价值最高的地方。伪造支付成功通知找到支付回调接口/pay/notify。通常这个接口URL会在商户配置支付渠道时提供但有时也会硬编码在前端或APP里。可以通过搜索源码、反编译APP或根据常见路径如/api/pay/notify,/callback/payment进行猜测。尝试直接向这个接口发送HTTP请求。关键点在于签名。支付渠道为了确保通知来源可信会对通知参数订单号、金额、状态等用商户密钥进行签名。你需要破解或绕过这个签名。测试方法签名算法可逆/弱密钥如果系统设计存在缺陷可能使用简单的MD5(订单号金额)作为签名且密钥强度弱或可预测。你可以尝试分析其他请求中的签名规律。签名验证缺失最极端的情况服务端根本没有验证签名只解析了参数。直接构造一个statusSUCCESS的请求发过去试试。测试环境误用有些开发/测试环境的回调接口可能关闭了签名验证但又被错误地部署到了生产环境。修改支付返回参数对于同步回调用户浏览器跳转回来的/pay/return页面你可以直接在Burp中拦截这个返回请求修改其中的payment_status、total_amount等参数模拟支付渠道返回的成功信息。有些系统会依赖这个同步回调的结果来更新订单状态而不再等待异步通知这就产生了漏洞。5. 漏洞挖掘中的高级技巧与思维陷阱掌握了基本流程后一些高阶思维和技巧能让你事半功倍也能帮你避开常见的坑。5.1 关注“边界”和“异常”情况系统开发者通常专注于实现“happy path”正常流程。你的任务就是思考所有“unhappy path”。网络异常支付过程中断网、关闭页面、快速点击返回按钮。并发操作同时对同一个订单进行支付、取消、退款操作。极端数据支付1分钱购买高价商品支付金额带有多位小数商品数量为0。状态混乱尝试对已支付、已退款、已取消的订单再次发起支付或退款。5.2 利用业务规则的不一致性这是逻辑漏洞的精华所在。例如一个实物商品其“库存扣减”可能发生在下单时而“库存回滚”发生在支付超时取消时。如果你能无限期延长“待支付”状态是否就相当于锁死了库存虚拟商品如会员支付成功后立即开通服务。如果退款流程是“申请退款 - 人工审核 - 退款到账”但服务在申请退款时并未立即关闭这里是否存在一个“退款不丢失服务”的时间窗口5.3 工具链的创造性使用Burp Comparer在修改金额前后分别抓取“生成订单”和“支付发起”两个请求的响应包用Comparer进行对比。差异处可能就是服务端计算的关键数据。Burp Intruder 的 Pitchfork 模式测试订单替换漏洞时非常有用。设置两个Payload位置一个是order_id遍历多个低价订单号另一个是pay_id对应的支付流水号。让Intruder同时使用两组Payload列表进行组合测试看哪些组合能欺骗系统完成高价订单的支付。搜索与发现在Burp的Target - Site map中对所有已发现的请求和响应进行关键词搜索如“success”、“paid”、“true”、“amount”。这能帮你快速定位到状态更新、支付验证的关键代码片段或接口。5.4 我踩过的坑支付漏洞挖掘实战心得不要忽视“小额”测试很多系统对“0元支付”或“1分钱支付”有风控或特殊处理但对“10元支付1000元商品”这种小额差距可能校验不严。尝试将1000元改为990元成功率可能比改为0元高得多。“签名”不是铜墙铁壁遇到过一种情况支付回调的签名验证了所有参数唯独漏掉了最关键的那个order_id。攻击者可以用任意订单的支付成功签名去伪造另一个订单的成功回调。所以测试时要逐一尝试删除或修改签名参数看服务端到底校验了哪些字段。时间是你的朋友也是敌人异步漏洞的测试窗口可能非常短。需要编写简单的Python脚本使用requests库并发发送请求才能可靠地触发竞争条件。手动操作几乎不可能成功。移动端是重灾区很多公司的业务逻辑在服务端是统一的但移动端APP为了体验可能会将一些逻辑前置或缓存。测试时一定要覆盖APP端特别是旧版本APP可能存在着已在新版网页端修复的逻辑漏洞。保持记录和复盘每测试一个点无论成功与否都要简要记录测试步骤、请求和响应。逻辑漏洞的利用链往往很长A点的微小异常结合B点的逻辑缺陷才能最终构成一个高危漏洞。好记性不如烂笔头。6. 从漏洞到报告SRC提交的艺术找到漏洞只是第一步如何清晰、专业地提交报告让你和厂商的沟通顺畅同样重要。报告标题清晰明了。例如“[支付逻辑漏洞] 商城支付回调签名验证缺失可导致任意订单支付成功”。漏洞详情漏洞类型逻辑漏洞 - 支付逻辑缺陷。风险等级根据漏洞利用难度和影响范围客观评估。通常能直接造成资金损失的支付漏洞为“高危”或“严重”。影响范围说明影响的业务功能如商品购买、会员开通和可能造成的直接损失如商品被0元购、服务被免费开通。复现步骤这是报告的核心。必须提供完整、可复现的步骤。环境测试所用的账号、浏览器、工具版本。步骤像写实验手册一样从登录开始第一步点击哪里第二步拦截哪个请求修改哪个参数为哪个值得到什么响应最终导致什么结果。务必附上每一步的HTTP请求和响应数据包关键参数可打码但结构要清晰。截图/视频图文并茂关键操作步骤配上截图。对于复杂的流程录制一个短视频是最佳选择。漏洞原理分析简要说明你认为漏洞产生的原因。例如“服务端在/api/pay/notify接口处理支付回调时仅检查了trade_status字段是否为‘TRADE_SUCCESS’未对回调请求进行签名验证导致攻击者可伪造任意订单的支付成功通知。”修复建议给出具体、可操作的修复方案。体现你的专业性。例如“在支付回调处理中强制验证支付渠道如支付宝、微信同步返回的签名。”“订单金额、支付金额等核心参数应在服务端生成并固化任何来自客户端的修改均应视为无效。”“实现支付状态的幂等性更新避免因网络重试等原因导致订单重复处理。”沟通与跟进提交报告后耐心等待审核。如果审核人员要求补充信息及时、礼貌地配合。对于争议点用技术证据平和地沟通。支付漏洞的挖掘是一场与业务逻辑复杂度的博弈也是一场与开发者思维盲点的对话。它没有一成不变的公式但拥有清晰的思维模型和严谨的测试流程能让你在纷繁的业务代码中保持方向。真正的收获不在于提交一个漏洞获得的认可而在于这个过程中你对一个完整业务体系进行安全解构的能力得到了实质性的提升。这份能力才是你在安全道路上走得更远的根本。