zoukankan      html  css  js  c++  java
  • 苹果支付的这些漏洞,你都堵上了吗?

    支付流程

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

    支付有三个角色

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

    苹果支付的流程

    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.退款漏洞

    攻击流程:

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

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

    最后

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

    未经允许,请不要转载

  • 相关阅读:
    模板元编程实现素数判定
    JDBC开发
    4.9 当相应行存在时更新
    QT5中如何使用QFtp类(这个类虽然没有被收录,但一直在更新)
    gcc和g++的区别
    Awesome C/C++(图像部分)
    Ubuntu更新源
    GO的GDB调试
    内核探测工具systemtap简介
    列举一下项目中使用的产品和技术
  • 原文地址:https://www.cnblogs.com/Xjng/p/11703434.html
Copyright © 2011-2022 走看看