前言:
这是一篇关于月神SRC逻辑漏洞课程的学习笔记,因为我现在没有小钱钱所以买的是某宝的19期盗版课,如果后续赚钱了肯定是要支持一手正版的,但是现在嘛,先学吧,当然b站也有相关课程只不过需要包月充电
int类型:
范围:
-2147483648 到 4294967295
无符号int:
无符号 int 类型表示非负整数。对于 32 位系统,无符号 int 的取值范围为 0 到 2^32 – 1,即 0 到 4294967295
有符号int:
有符号 int 类型可以表示正数和负数。对于 32 位系统,有符号 int 的取值范围为 -2^31 到 2^31 – 1,即 -2147483648 到 2147483647
最大值溢出漏洞:
漏洞原理:
在涉及到需要支付的场景时,例如微信、支付宝
范围就是0 ~ 2147483647,当超过这个最大值的时候,会重新从零开始计算,比如2147483648就是0,2147483649就是1,如果在支付场景中后台校验的是是否支付成功,而不是支付了多少,那么这就是一个逻辑漏洞,月神讲的这个漏洞我就觉得非常有意思,这里理一下思路
购物场景:
用户购买一瓶矿泉水(2元),提交参数(一瓶,矿泉水id,用户id等),服务器发起支付订单的id,前端拉起支付请求,用户通过微信支付2元,服务器校验微信返回的信息,判断支付成功就代表购买成功,支付失败就代表购买失败
微信存在这个最大值溢出,那么我通过构造数量实现总价格超过int最大值(2147483647),当总价格超过这个时,微信会重新从0开始计算,比如我购买1073741825瓶矿泉水,总价格是2147483650,超过了微信这个最大值,从零开始计算的话就是2元,如果这个时候服务器校验的只是用户的支付状态,那么就可能存在这个漏洞
因为服务器只校验了微信传递的参数是支付成功还是支付失败,并没有对用户的支付价格做校验,这样就会导致用户只花了两元就购买了1073741825瓶矿泉水,所以这就是一个利用微信最大值溢出产生的业务逻辑漏洞,正确流程应该是校验是否支付成功,支付金额是否正确
当然这只是一个思路,同样可以用在其他商城或者充值的地方,要学会举一反三
科学计数法绕过限制:
漏洞原理:
一般出现在服务器对用户输入的值进行了最大值或最小值校验,但是校验不严谨,从而产生漏洞
科学计数法的解释:
科学计数法是一种表示非常大或非常小的数字的方法,它将数字表示为一个介于1到10之间的数与10的幂的乘积,电脑计算器输入1e+2会得到100的结果,这就是科学计数法的一种表达
出现场景:
如果服务器仍然是使用判断支付是否成功来确认用户充值或购买,仅仅只是在这个基础上添加了一个不允许用户输入的值超过多少位,那么就可能会用到这种方法来绕过服务器的过滤,比如2e+10=20000000000,这样就同样绕过了服务器做的限制
同样的,如果服务器对小数进行过滤,不允许用户输入带小数的值,我们就可以使用科学计数法来绕过,比如1e-2=0.01
四舍五入漏洞:
四舍五入的解释:
四舍五入是一种数学中的取整方法,用于将一个数简化为更易于处理的形式,同时尽可能地保持其原始值的接近度
四舍:如果要保留位数的下一位数字是 0、1、2、3、4,则保留位数不变,后面的数字全部舍去
五入:如果要保留位数的下一位数字是 5、6、7、8、9,则保留位数加1,后面的数字全部舍去
漏洞原理:
正常情况下微信/支付宝在支付时会省略小数点第二位后面的,所以如果正常业务中没有对参数进行四舍五入,而是直接使用用户输入的参数,那么就有可能产生这个漏洞
出现场景:
比如这个场景,允许用户自定义充值金额(包含小时)和提现,但是对充值的金额设置了最大值和最小值的限制,那么可能就存在这个漏洞
正常情况充值和提现都没有问题,但是我如果输入的充值金额是0.016呢,按照正常情况,服务器会使用微信的接口生成订单id发给客户端从而拉起支付,但是微信只能读到0.01(不信的可以看看你的微信钱包,0.01后面的数字就读不到了),如果服务器没有对用户输入的值做四舍五入或对充值金额做校验,仅仅只是判断充值是否成功
那么用户输入0.016,微信付款的时候实际付款金额是0.01,支付后服务器判断支付成功给用户的金额添加0.016(可能默认情况也不会显示),但是如果我们再充值一次0.016,用户的金额变成了0.03,那就说明存在漏洞,如果是0.02,那就不存在漏洞
有人可能觉得这个漏洞影响也才几分钱危害不大,我一开始也是这么认为的,但是通过月神的解释才发现这个漏洞很刑诶:
月神:我写了一个批量脚本去跑,半小时跑了几千块钱,如果是工作室用多台设备,那可能金额就非常大了
所以我们也不要因为金额小就觉得这个漏洞危害不大,还是要看实际情况的
常见参数:
Price:
金额是比较常见的参数,购买物品/充值金额时经常会遇到,我们可以将金额修改成-1,0.01,0.019这样的值,当然也有很多时候遇不到这个参数,就比如购物,商品价格其实并不是需要我们告诉服务器的,可以直接存储到数据库,所以参数就变成了商品id
num:
数量,这也是我们遇到的比较多的一个参数,我们可以用前面讲的最大值溢出或者其他,都是可能存在漏洞的
id:
种类:
id也是我们经常遇到的一个参数,只不过存在很多种类,比如:product id、user id、 address id
修改目的:
product id:
商品id
user id:
用户id,出现这个参数可以修改看看,可能出现能够操作别人账号的情况(水平越权/垂直越权)
address id:
地址id,如果修改这个参数显示了别人的地址信息,那就算是信息泄露了