支付流程
首先让我们理一下苹果支付的整个流程。
支付有三个角色
- 苹果
- 商家,也就是我们
- 用户
苹果支付的流程
- 用户下单
- 客户端调用后台接口,生成订单
- 客户端调用支付页面,用户支付
- 支付成功后,客户端获取收据
- 客户端把收据发给后端
- 后端去苹果验证收据是否合法
- 如果合法,就发货
漏洞
1.收据不能和订单号关联
苹果没有提供接口来获取收据对应的订单号
所以利用这个漏洞,攻击者可以使用订单A的收据来验证订单B,最终实现花较少的钱来获取较贵的货物。
攻击流程:
- 用户生成订单A(价格1元),订单B(价格100元)
- 用户支付订单A,得到收据A
- 用户使用收据A去要求后端发货订单B
- 最终用户收到订单B的货物,但是只支付了订单A的钱
解决方法:
在验证收据的接口,可以获取收据对应的货品号。在验证收据的同时,要验证货品号和订单对应的货品号是否一致。
当然这种解决方法还是有漏洞的,例如用户A和用户B购买了同样的货品,然后用户A支付了,获取到收据A,这时候如果用户B可以获取到收据A,就可以盗用收据A来实现系统为自己的订单发货。
但是这种情况是较难实现的,因为用户B要获取到用户A的收据,需要获取用户A的手机权限或者中间人权限,然后还要攻破https的加密
2.收据可以重复验证
验证收据的接口只会返回收据是否合法,不会返回收据的验证次数。
所以利用这个漏洞,攻击者可以只支付一个订单,然后重复使用收据来实现刷多个订单。
攻击流程:
- 用户生成订单A,支付,获取收据A
- 用户生成订单B,使用收据A来验证订单B
解决方法:
验证收据时,需要查看该收据是否已经使用过。实现方法是验证收据成功时,把收据保存到数据库,下次验证的时候检查下数据库是否已经存在该收据。
这里还要注意并发问题。例如同时2个请求过来,分别验证订单A和B,然后都使用同一个收据A,这时候数据库是没有收据A记录的,最终订单AB都会验证成功。可以使用加锁,数据库唯一键,或者redis原子性来避免。
3.收据验证超时
验证收据的接口有可能会超时。超时并不代表成功或者失败。所以对于超时的收据,需要使用异步或者定时任务来重新验证。不然会导致用户成果支付后,却没有发货成功。
4.36元漏洞
苹果有个功能,新用户首次支付,在40元以下的商品,苹果会首先通知商家发货,然后再去银行卡扣钱。很多黑产会利用这个漏洞来刷钱。
也就是苹果通知了商家发货,然后后面去银卡扣钱失败了,到月底和商家结算的时候,苹果说我没有收到钱,所以钱也不结算给商家。最后的损失还是商家来承担。(感觉好无赖,明明是你的漏洞,后果要我来承担)
作为商家,这个漏洞没有什么办法防止。
5.退款漏洞
攻击流程:
- 用户支付了钱
- 商家发了货给用户
- 用户要求苹果退款
- 苹果没有咨询商家是否能退款,就直接退款了,退款后也不会通知商家。
- 最终的结果是:用户不用花钱,商家发了货。
作为商家,这个漏洞也没有什么办法防止。
最后
虽然苹果是世界一流的厂商,但是苹果支付的安全性比微信和支付宝都差很多。
如果商家在开发时没有注意到这些漏洞,就很容易被攻击。而且这是涉及金钱的功能,被攻击的后果往往很严重。
未经允许,请不要转载