前言:
这是一篇关于月神SRC逻辑漏洞课程的学习笔记,因为我现在没有小钱钱所以买的是某宝的19期盗版课,如果后续赚钱了肯定是要支持一手正版的,但是现在嘛,先学吧,当然b站也有相关课程只不过需要包月充电
并发:
出现场景:
并发其实没有什么特殊场景,可以说一切场景都可以去尝试并发
例如:并发提现、并发免房充值、并发刷Q币、并发开盲盒、并发签到
但是有一些并发是没有意义的,这种就不用去试了,成功了也会被忽略,例如:并发评论,并发点赞(这个看场景,比如某音某手并发刷点赞还是有危害的)
遇到验证参数怎么办:
比如sign签名验证,token验证等等,如果遇到这种验证参数,并发可能只有第一个会成功,后面的数据包就不行
这种验证参数很多情况下是客户端生成的,如果是web端,咱们可以去看js代码,通过js逆向得到验证参数的生成逻辑,不过这种方法比较麻烦,所以我们可以尝试第二种方法,app端也适用
我们可以使用Fiddler进行抓包,然后再重新点击客户端的功能按钮,比如并发提现。我开启抓包后,先点击一遍提现按钮,然后放行非需要并发的数据包,再点击一遍提现,这样就有两个提现的数据包了,如果点不了提现按钮,咱们可以暂时关闭抓包然后返回上一个页面刷新重新进提现页面点击提现,所以这种情况下用Fiddler会方便一些
场景一:
有个钱包提现的功能,钱包余额有100元,可以设置提现金额,可以绑定多个提现的银行卡账户
如果是上面这个场景,存在并发漏洞,但是我们并发提现到A银行卡时失败了,我们还可以怎么复现并发漏洞–并发提现到不同银行卡
有时候并发提现到同一账户时会导致失败,可能是对同一账户提现做了校验,只要对AB两个不同的账户提现就可以了,这里想要表达的意思是在并发测试时尽量尝试并发不同的参数
组合并发:
并发测试并不是只能针对单一的接口,还可以尝试多接口组合并发,比如购买商品(100元)和提现钱包余额(100元)这两个操作都对我的钱包进行了扣除操作,如果我对两个接口同时进行并发操作,如果并发成功了,我们提现的100元到账,又下单了100元的商品,那这里就存在组合并发的漏洞
又比如商家端核验代金卷和用户端退款代金卷,当用户时用代金卷购买商品后,商家端核验代金卷成功,平台补贴的钱就到商家账户了。但是如果我们同时对用户端的退款功能和商家端的补贴提现功能做并发,如果商家端补贴金额到账了,用户端的退款代金卷也到账了,那么这里就存在组合并发的漏洞
同理,优惠卷的赠送和使用也是一样的,如果同时对优惠卷进行操作,既能赠送成功又能使用成功,那么就存在组合并发漏洞
还有月神提到的SRC团队人数限制,并发多个同意队员申请,当然只是提到的,具体还没实验成功,不过这种思路的确也是一种组合并发漏洞
数量的利用:
10进制(个人理解):
10进制代表的数字是0-9,如果超过9就往下一位进1,就比如我们经常说的的个十百千万,它们满十进一,也就是10进制
16进制(个人理解):
16进制代表的数字是0-9和A-F,如果超过9下一个就是A,然后是BCDEF,所以它们是满十六进一
A(10),B(11),C(12),D(13),E(14),F(15)
二进制和八进制:
往下看,意思差不多,就是满几进一的区别而已
进制转换:
就比如我要用16进制表示10进制的16这个数字,16进制是满16进1,所以是10。那十进制的52,16进制就是34。将这些进制进行转换也就是我们常说的进制转换,那么怎么进行计算呢,很简单,比如77(10进制)这个数字我想转换成16进制,我们就直接将他除以16,等于4余13,13在16进制中用D表示,所以77的16进制是4D
再补充一个知识点,满二进一就是二进制,满八进一就是八进制,为了表示方便,人们通常用B来表示二级制,O表示八进制,D表示10进制,H表示16进制
又比我想知道153B的16进制是多少,我们就可以用153除以16,等于9余9,所以是99H。那我想知道它的二进制是多少呢,那咱们可以用下面这个方法计算,左边是除数,里面是被除数,右边是余数
153一直除以2,直到为一时,从下往上读,就是1001 1001(B),所以153的2进制是1001 1001。那八进制呢,一样,一直除以8,然后结果从下往上读,就是231(O),16进制也是这样的,但是余数10~15需要换成A~F
那怎么转换回10进制,1001 1001(B)换成10进制,咱们就数位数,四位为一组(2进制表达时需要四位为一组,方便转换成16进制,比如59D的二级制就是0011 1011B),这里是1001 1001,是8位数,第一位和第四第五第八都是一,这几位为1的数就是2的几次方,但是都需要减一,也就是2的七次方开始,因为a的0次方是1,我们在将153进行转换时,最后一位就是1,所以都需要减去1,就如下:
计算上面的结果相加就是153:
好,接下来说一下为什么前面要提到四位为一组,不满四位需要用0来补。其实都是为了方便转换,1个十六进制数字恰好可以表示4个二进制数字,十六进制的 1 对应二进制的 0001,十六进制的 A 对应二进制的 1010,十六进制的 F 对应二进制的 1111,因此,将二进制数按4位一组划分,可以直接转换为十六进制,反之亦然。这种转换非常高效,且易于理解和操作
好了,说了这么多其实只是让大家了解,在更多时候是并不需要我们来计算的,直接使用计算器就好了,但是还是希望大家了解一下
打开电脑自带的计算器
点击左上角的三条横杠
点击程序员
输入数字就能看到其他的进制转换后的结果,默认输入的数字是10进制
可以看到结果了,HEX就是H,是16进制的意思,OCT是O,是8进制的意思,BIN是B,是二进制的意思,所以还是需要适当了解一点点常识的,不要当一个只会使用工具的脚本小子或者只会点鼠标的猴子,要知其然知其所以然
int类型:
在 C 和 C++ 中,int 的大小至少为 16 位,但通常是 32 位。因此,对于 32 位的 int ,有符号整数的范围是−2147483648,2147483647,无符号整数的范围是0,4294967295
在 Java 中,int 是 32 位的有符号整数,范围是−2147483648,2147483647
在 Python 中,int 是任意精度的整数,这意味着它可以表示任意大的整数,受限于可用的内存。因此,Python 的 int 没有固定的范围
在 C# 中,int 是 32 位的有符号整数,范围是−2147483648,2147483647
在 JavaScript 中,int 并不是一个独立的数据类型,但通常使用 32 位有符号整数来表示整数,范围是−2147483648,2147483647
在 Go 中,int 的大小取决于运行的系统:
- 在 32 位系统上,int 是 32 位的有符号整数,范围是−2147483648,2147483647
- 在 64 位系统上,int 是 64 位的有符号整数,范围是−9223372036854775808,9223372036854775807
游戏中int最大值就是用16进制的FFFF FFFF来表示,转换为10进制就是4,294,967,295
int类型最大值溢出:
大多数app都支持微信和支付宝支付,这两个支付工具的区别是支付宝在支付时做了校验,不支持金额超过2147483647,也就是int类型最大值,而微信没有这个限制,所以当我们使用微信支付时,将金额超过最大值后微信会自动从0开始计算,也就是你支付2147483649,微信只需要支付1元即可完成支付,如果服务器只是校验订单是否支付成功,而没有判断具体支付金额,就会出现这种漏洞
科学计数法绕过小数限制:
这个前面的文章说过,1e-1就是0.1,1e-2就是0.01,在有些场景中会对数量限制,不能使用小数,我们就可以尝试使用科学计数法来绕过限制