欢迎来到我们的全网最全的“零元购”攻击原理大剖析
大家应该都看到了上一栏目我们的《全网最全“零元购”攻击手法教程》了吧
接下来我会带着大家一起探索,其中的“真面目”
一,支付流程
首先我们需要了解,现代社会主流使用的两种线上支付流程
第一种:支付凭证的商户对接(也叫做“浏览器跳转支付通知”)
用户通过发送支付请求到第三方平台(如银行,微信,支付宝等),第三方平台返回含有支付结果的凭证,再由用户告知商家支付的结果。
第二种:第三方平台与商家的实时对接(也叫做“服务端异步支付通知”)
用户发送支付请求并支付金额后,由第三方平台进行异步处理,向商家以及用户实时反馈支付结果
通过了解这两种线上支付流程,其实不难发现,支付漏洞主要出现在第一种的商户交接(即“浏览器跳转支付通知”),因此造成的参数篡改漏洞
二,本质原理
透过表面看本质:
参数篡改漏洞的本质是 客户端与服务器端数据校验不一致。
攻击者通过拦截并修改支付流程中的关键参数(如金额、数量、优惠券ID),利用 后端未二次验证 或 参数未加密签名 的缺陷,绕过正常支付逻辑。
关键漏洞点
前端依赖信任:后端直接信任客户端提交的参数(如金额),未与原始订单数据库比对。
参数明文传输:金额、订单ID等敏感参数未加密或签名,可被Burp Suite等工具篡改。
逻辑链断裂:支付接口未严格关联订单生成阶段的数据(如订单金额仅在生成时计算一次)。
参数篡改漏洞原理:
支付三步骤:
订购,订单,付款
三个步骤当中的随便一个步骤进行修改价格,如果前面两步有验证机制,那么你可在最后一步付款时进行抓包尝试修改金额,如果没有在最后一步做好检验,那么问题就会存在,其修改的金额值你可以尝试小数目或者尝试负数。
网站未对支付的数据加密或者二次校验,导致攻击者可以利用工具(Burp Suite )抓包拦截并且修改支 付的数据或者状态码,可以用更低的价格购买商品。
根据上面的图我们可以很清楚的看到,黑客通过Bp抓包了订单数据,并且通过以下的流程图我们便会更直观的看到修改了哪些数据,造成了哪些影响
常见的支付漏洞利用——参数篡改漏洞
关键攻击步骤说明:
攻击者先建立合法订单(100元)
在支付环节使用抓包工具拦截请求
篡改支付金额参数(改为0.01元)
利用服务端未校验原始金额的漏洞完成低价支付
参数篡改类型:
篡改对象 | 示例参数 | 攻击效果 |
金额 |
amount=100 → amount=0.01 |
低价购买高价商品 |
数量 |
quantity=1 → quantity=-5 |
总价负数导致余额增加 |
优惠券ID |
coupon_id=1 → coupon_id=9 |
使用未授权的满减券 |
支付渠道 |
channel=alipay → test |
调用测试接口实现零元支付 |
三,漏洞成因技术细节
1. 后端校验缺失代码示例
# 错误代码:直接使用客户端提交的金额
def pay(request):
order_id = request.POST.get('order_id')
amount = request.POST.get('amount') # 直接从客户端获取金额
# 未查询数据库校验金额是否匹配
result = third_party_pay(amount)
if result == "success":
update_order_status(order_id, "paid") # 直接标记为已支付
2.正确校验逻辑对比
# 正确代码:强制与数据库订单金额比对
def pay(request):
order_id = request.POST.get('order_id')
client_amount = request.POST.get('amount')
# 从数据库获取真实金额
db_amount = Order.objects.get(id=order_id).amount
if float(client_amount) != db_amount:
return "金额被篡改!" # 阻断异常请求
result = third_party_pay(db_amount) # 使用数据库金额
根据本篇文章可以更直观的感受到,支付漏洞中,参数篡改漏洞的原理和本质,既然知道了原理和本质,那么该如何去防御也就容易很多了,欢迎阅读下一栏目《全网最全“零元购”防御手法教程》