最近在支付漏洞方面发现了很多问题,所以打算讲一下支付漏洞。
插句题外话,逻辑漏洞要有丰富的逻辑思维能力。在出现漏洞的第一时间就能在脑中迅速定位到漏洞所在,今早就遇到了这样的问题。
app也是如此,出现问题了第一时间猜测步骤,还要配合开发查一下用户操作。再来确定问题所在。
进入正题,最近在src提交了挺多支付漏洞,逻辑都差不多吧,想办法绕过订单方面的校验。下面举几个例子:
支付漏洞
1
尝试修改小数
某商城购买商品时,参数中有商品id(sku),数量(qty),赠品(subSku),等其他信息。首先尝试下遍历ID,可以用添加购物车的方式,来看有没有一些活动商品,或者直接购买赠品。然后尝试数量方面,修改成小数,比如0.01,看价格会不会变成1%的价格{"cartItems":[{"sku":"B110005101","qty":0.01,"subSku":["5011100532","5431100063","5431100069"]}],"storeCode":"cn","invite":""}
会有什么影响?
▼
购买优惠券或者商品时,修改数量或尝试添加数量参数。购买后会以1%的价格得到优惠券。
2
然后尝试修改负数
{"cartItems":[{"sku":"B110005101","qty":-1,"subSku":["5011100532","5431100063","5431100069"]}],"storeCode":"cn","invite":""}
会有什么影响
▼
购买商品时,使用钱包支付,可能会导致余额溢出
3
尝试正负数购买
添加参数尝试正负数,让他总值为正。
{"cartItems":[{"sku":"B110005101","qty":2,"subSku":["5011100532","5431100063","5431100069"]}],"cartItems":[{"sku":"B110005101","qty":-1,"subSku":["5011100532","5431100063","5431100069"]}],"storeCode":"cn","invite":""}
会有什么影响
▼
由于商品支付校验了单个数量不能为负,使用此方法可以绕过这个逻辑
4
尝试四舍五入
有些商品购买小数时比如1.51,支付2元,购买1.49时支付1元。就可以支付1.49只支付1元就可以到账1.49
会有什么影响
▼
服务器和客户端不同步导致的,客户端在支付时进行了四舍五入,服务器到账还是按实际输入的金额到账的。造成了支付和收益不同等
5
超过最大值
超过最大值,金额大多数是有上限的,在超过上限后,例如99999999999999,会变成1E92这样的计算方式。具体在协议中可以看到,有些服务器就将1E92变成了1.92,在返回给你支付金额时只需支付1.92就能得到999999999999的商品。
会有什么影响
▼
只需要少量金额购买到大量的产品,可以在服务器校验金额或者数量的最大值。确保不会超出预算。
6
替换订单号
适用于购买首单优惠产品,下单时会创建一个订单存在服务器,然后调用支付宝进行支付,可以选择不支付,继续创建订单,当服务器上存在了多个订单号后,一个一个支付支付时修改订单号,将提前创建好的订单都支付了。
会有什么影响
▼
服务器校验时在不能重复购买特殊优惠做了校验,但是对于提前创建好的订单饼干没有校验,这里需要校验如果重复支付的话订单不到账,或者退还金额。
7
覆盖订单号
生成订单时替换订单号ID,达到将前一个订单覆盖的目的。比如前一个订单是6元充值,进入支付宝支付界面不支付,然后覆盖订单将500的档位覆盖掉6元的档位。这时在将支付宝支付掉。支付成功后,支付宝会通知服务器,服务器下发充值金额。
会有什么影响
▼
服务器在收到通知后应该再次校验支付金额与订单的金额是否一致。如果不一致就不发放奖励。
签约漏洞
一般签约都会有优惠价格,还会有些首次签约的优惠 。
利用方法1:使用手机A进入签约界面,等待支付。
使用手机B进入签约界面,等待支付。
。。。。。
支付手机A-----解除签约
支付手机B-----解除签约
注意要解除后再签约,不然可能会提示已经签约了别的账号。
利用方法2:查看支付方式,将签约支付的方式修改为钱包支付或者其他方式。一般签约支付的商品ID都是独立的。用此方法依然可以达到普通方式使用签约价格来续费购买。
以上是最近挖到SRC漏洞总结出的一些经验。
最后说一句,一定要给客户说,给用户补单时一定要核对用户的支付金额。因为在测试时发现了支付不到账但是补单成功的情况。