苹果支付的这些漏洞,你都堵上了吗?

支付流程

首先让我们理一下苹果支付的整个流程。

支付有三个角色

  • 苹果
  • 商家,也就是我们
  • 用户

苹果支付的流程

  1. 用户下单
  2. 客户端调用后台接口,生成订单
  3. 客户端调用支付页面,用户支付
  4. 支付成功后,客户端获取收据
  5. 客户端把收据发给后端
  6. 后端去苹果验证收据是否合法
  7. 如果合法,就发货

漏洞

1.收据不能和订单号关联

苹果没有提供接口来获取收据对应的订单号
所以利用这个漏洞,攻击者可以使用订单A的收据来验证订单B,最终实现花较少的钱来获取较贵的货物。

攻击流程:

  1. 用户生成订单A(价格1元),订单B(价格100元)
  2. 用户支付订单A,得到收据A
  3. 用户使用收据A去要求后端发货订单B
  4. 最终用户收到订单B的货物,但是只支付了订单A的钱

解决方法:
在验证收据的接口,可以获取收据对应的货品号。在验证收据的同时,要验证货品号和订单对应的货品号是否一致。

当然这种解决方法还是有漏洞的,例如用户A和用户B购买了同样的货品,然后用户A支付了,获取到收据A,这时候如果用户B可以获取到收据A,就可以盗用收据A来实现系统为自己的订单发货。
但是这种情况是较难实现的,因为用户B要获取到用户A的收据,需要获取用户A的手机权限或者中间人权限,然后还要攻破https的加密

2.收据可以重复验证

验证收据的接口只会返回收据是否合法,不会返回收据的验证次数。
所以利用这个漏洞,攻击者可以只支付一个订单,然后重复使用收据来实现刷多个订单。
攻击流程:

  1. 用户生成订单A,支付,获取收据A
  2. 用户生成订单B,使用收据A来验证订单B

解决方法:
验证收据时,需要查看该收据是否已经使用过。实现方法是验证收据成功时,把收据保存到数据库,下次验证的时候检查下数据库是否已经存在该收据。
这里还要注意并发问题。例如同时2个请求过来,分别验证订单A和B,然后都使用同一个收据A,这时候数据库是没有收据A记录的,最终订单AB都会验证成功。可以使用加锁,数据库唯一键,或者redis原子性来避免。

3.收据验证超时

验证收据的接口有可能会超时。超时并不代表成功或者失败。所以对于超时的收据,需要使用异步或者定时任务来重新验证。不然会导致用户成果支付后,却没有发货成功。

4.36元漏洞

苹果有个功能,新用户首次支付,在40元以下的商品,苹果会首先通知商家发货,然后再去银行卡扣钱。很多黑产会利用这个漏洞来刷钱。
也就是苹果通知了商家发货,然后后面去银卡扣钱失败了,到月底和商家结算的时候,苹果说我没有收到钱,所以钱也不结算给商家。最后的损失还是商家来承担。(感觉好无赖,明明是你的漏洞,后果要我来承担)
作为商家,这个漏洞没有什么办法防止。

5.退款漏洞

攻击流程:

  • 用户支付了钱
  • 商家发了货给用户
  • 用户要求苹果退款
  • 苹果没有咨询商家是否能退款,就直接退款了,退款后也不会通知商家。
  • 最终的结果是:用户不用花钱,商家发了货。

作为商家,这个漏洞也没有什么办法防止。

最后

虽然苹果是世界一流的厂商,但是苹果支付的安全性比微信和支付宝都差很多。
如果商家在开发时没有注意到这些漏洞,就很容易被攻击。而且这是涉及金钱的功能,被攻击的后果往往很严重。

未经允许,请不要转载

posted @ 2019-10-19 12:12  Xjng  阅读(2029)  评论(0编辑  收藏  举报