前言:
这是一篇关于月神SRC逻辑漏洞课程的学习笔记,因为我现在没有小钱钱所以买的是某宝的19期盗版课,如果后续赚钱了肯定是要支持一手正版的,但是现在嘛,先学吧,当然b站也有相关课程只不过需要包月充电
签约漏洞:
什么是签约漏洞:
支付场景中的一个逻辑漏洞,通过拉起多个签约支付页面进行支付,绕过逻辑限制,达到多次优惠购买的目的
为什么叫这个名字:
月神在发现这个漏洞的时候,这个漏洞多以连续包月的签约场景为主,所以就叫签约漏洞了
场景示例:
比如说现在有这么一个视频网站–月神视频,月神视频会员月卡是10块。但是首次连续包月首月仅仅只需要1块,次月续费是8块。正常来讲这个地方做了限制,只能使用一次首月一块,等第二个月就是要支付8块钱了,那我能不能想办法达到一块钱一个月但是无次数限制的目的
要达成这个目的,我们是不是可以通过创建多个连续包月的订单来实现,但是订单并不是由我们创建的,是服务器创建然后我们负责支付。那有什么绕过方法吗,既然我们创建不了多个支付订单,那就让服务器来给我们创建多个支付订单
用微信扫码跳转到签约页面后不支付(订单一),再去切回去刷新页面(二维码被重置,订单信息被二次提交,服务器检测并没有重复购买这个连续包月,因为还没有支付),然后使用支付宝扫码(这是第二个订单),这时我们微信支付的页面并没有退出,仅仅只是切到后台了,这个时候是不是就存在两个订单了,我们再次刷新二维码,然后再换一个手机,还是刚才的账号(这个时候手机一已经拉起两个支付订单,页面停留在微信和支付宝,用手机二扫码挤掉的是手机一的视频账户而不会是待支付的订单),然后重新用微信扫码拉起支付界面,这样我就达到了创建多个订单的目的,然后依次支付订单,如果服务器没有做校验就会依次下发会员,就达成了我支付多个一块购买了多个月会员的目的,这就是签约漏洞!对于一些有多部手机和微信的工作室来讲,这个漏洞产生的危害无疑是巨大的!
正常情况:
用户购买连续包月,服务器判断是否为重复购买,当判断结果为未购买过,服务器就会创建支付订单,然后客户端拉起第三方支付平台进行支付,用户完成支付后服务器下发会员。当用户想要再次购买这个优惠价的连续包月时,服务器判断出这个用户购买过,返回客户端无法二次购买
实际情况:
用户在首次购买连续包月时,创建订单并不支付,然后重新刷新二维码,服务器校验到用户并没有支付订单,判断为未购买过连续包月,允许刷新二维码(这个时候就创建了第二个订单),用户扫码后拉起新的支付页面仍然不支付,然后再次刷新二维码,服务器校验…如此重复多次,就创建了多个订单,再依次完成支付,服务器如果不做校验就会依次下发会员,这个时候用户想要再次购买,服务器才会校验不通过
签约漏洞进阶:
普通会员和超级会员:
很多平台在购买过普通会员后,再购买超级会员是提供补差价的,比如酷狗音乐,我购买了一个月会员后过了几天死给我弹窗(只需要再补x元就可以升级会员,解锁xx音效),就这种情况,也有可能产生签约漏洞。比如有这么一个音乐平台–月神音乐,普通会员是10元,超级会员是20元,购买普通会员后只需要补10元就可以升级成高级会员,这么一想是不是没问题
但是如果我购买普通会员后,在超级会员的页面使用这个签约漏洞的逻辑,创建多个订单,然后依次支付,是不是我除了第一个订单是20元,后续的都是10元就购买了一个月超级会员
补充余额:
我这几天没有写文章有一部分原因就是因为我在测试b站是否存在这个逻辑漏洞,没错就是b站,用户充电时是没有可以用金仓鼠抵扣一说,但是如果是平台主播,当你有了收益之后,隔天你的收益就会成为平台余额,然后在你充值电池时就会有这么一个选项–使用金仓鼠抵扣,一开始我认为这个可能没多少人会发现,就算发现了,也不会想到这个漏洞,所以我先是去挖了一下,发现web端扫码支付是先跳转到小程序然后再支付的,我认为业务逻辑可能是先充值到小程序余额再充值到电池,在我痛失几块钱后,又发现手机端app充值是直接拉起微信支付,可能是直接充值到电池余额,于是我又试了一下,最后的结果是两个都不存在该漏洞,充值过后,多的充值金额在6,7分钟过后会退回到账户而不是转换成电池,多半是后端校验了,唉,还以为能够挖到白高兴了一场,不过这个漏洞现在仍然会存在,以后也有可能,比如厂家新上的一些业务,所以还是值得我们去学习的,当然,最重要的还是创新!
如果你看了前面的逻辑漏洞基础那么上面这个场景你应该能够理解,如果不能理解,那么请看下面这部分,理解后再来重新看上面这段话可能就懂我在讲什么了
很多商城平台会有自己的钱包,这个时候如果在该平台上面购买商品,就会有使用余额支付的选项,如果余额不够很多都是使用第三方直接补,那正常来讲,如果服务器是将用户补的100元先充值进余额账户,那么不管你支付多少个订单,你支付100就是到账100,因为钱是充值到余额,你要购买商品,钱都是再从商城钱包里面扣,余额不够了就买不了
但是很多时候程序员为了省事,会直接将补充的钱充值到订单,就是商品价格1000元,但是我有900元余额,我补这100的那个支付订单我一支付成功,平台就直接算我商品购买成功了,然后商品就处于待发货状态,那么这种情况就有前面讲的签约漏洞了
所以正确的做法一定是先将用户充值的金额充值到平台的钱包里面,然后再将商品的金额从钱包扣除,这样如果钱包里面的余额不够,缺多少用户就是要充值多少,也不会产生逻辑漏洞,但是有些平台仍然会使用直接支付,不过会在支付这个订单时侯冻结这个钱包里面的钱,如果这个订单没有支付成功就一直等待支付成功才能解冻,这样做的确防止了签约漏洞,但是仍然有并发漏洞的风险,如果通过并发在没有冻结余额前就创建多个订单仍然是会存在签约漏洞的,还有一种情况,后台会做校验,多充的钱不会到账,会原路返回,这也就是我尝试挖b站那个充值电池时候的情况,也能解决签约漏洞