一次奇妙的降价支付逻辑漏洞挖掘之旅
字数 1053 2025-08-29 08:30:12
支付逻辑漏洞挖掘实战教学文档
漏洞背景
本教学文档基于奇安信攻防社区中"一次奇妙的降价支付逻辑漏洞挖掘之旅"的讨论内容,分析支付系统中可能存在的逻辑漏洞,特别是价格参数篡改相关的安全问题。
关键漏洞点分析
1. 支付签名验证缺失
根据用户"c铃儿响叮当"的评论:
- 系统缺少微信支付(WX Pay)的签名密钥证书回调验签机制
- 正常情况下生成订单需要这些安全验证环节
- 但单纯修改金额参数无法直接生成订单,说明系统有一定防护
2. 订单关联验证问题
用户"LLXX"和"荔枝"提出的关键问题:
- 系统仅通过priceid关联支付订单与实际预约订单
- 攻击者可能在支付时篡改priceid参数
- 可能导致支付金额与最终服务不匹配(如支付低价获取高价服务)
漏洞挖掘方法论
1. 参数篡改测试
- 拦截支付请求,尝试修改金额参数
- 测试priceid参数的可预测性和可篡改性
- 验证系统是否对关键参数进行签名或加密
2. 订单关联验证测试
- 创建不同价格的同类服务订单
- 交叉测试支付时替换priceid参数
- 验证系统最终确认的服务是否与支付金额匹配
3. 签名验证测试
- 检查支付回调是否包含签名验证
- 测试是否可以绕过签名验证机制
- 验证签名密钥是否可预测或泄露
漏洞利用场景
-
低价获取高价服务:
- 获取高价服务的priceid
- 创建低价订单但在支付时替换为高价服务的priceid
- 系统可能仅验证priceid有效性而不验证价格一致性
-
服务降级攻击:
- 支付高价获取低价服务
- 可能用于刷单或影响商家信誉
防御方案
1. 完善签名验证机制
- 实现微信支付完整的签名验证流程
- 包括但不限于:
- 支付签名验证
- 回调验签
- 密钥证书管理
2. 订单关联多重验证
- 不仅验证priceid,还应验证:
- 订单金额一致性
- 服务类型一致性
- 用户身份一致性
- 使用不可预测的订单号而非简单数字ID
3. 服务端验证
- 关键业务逻辑应在服务端完成验证
- 客户端传递的参数不可信任
- 重要操作应有服务端状态检查
4. 日志与监控
- 记录完整的支付流程日志
- 监控异常支付行为(如金额与服务不匹配)
- 设置告警机制
测试用例示例
-
金额篡改测试:
原始请求: POST /pay {priceid: 123, amount: 100} 修改请求: POST /pay {priceid: 123, amount: 10} -
priceid替换测试:
订单A: priceid=123(价值100元) 订单B: priceid=456(价值1000元) 支付请求: POST /pay {priceid: 456, amount: 100} -
签名绕过测试:
原始签名请求: POST /pay {priceid: 123, amount: 100, sign: "a1b2c3"} 测试请求: 1. 删除sign参数 2. 修改sign参数为任意值 3. 使用其他订单的有效sign
总结
本教学文档详细分析了支付系统中因订单关联验证不足和签名验证缺失导致的安全漏洞。通过参数篡改和订单关联测试,攻击者可能实现支付金额与服务不匹配的攻击。防御关键在于实现完整的签名验证机制、多重订单关联验证以及服务端状态检查。安全人员应将这些测试方法纳入支付系统的常规安全测试流程中。