[BJDCTF2020]Easy MD5
1、四处找提示
2、分析代码
md5(string,raw)
参数 描述
string 必需。要计算的字符串。
raw 可选。默认不写为FALSE。32位16进制的字符串
TRUE。16位原始二进制格式的字符串
进行post传参
所以首先我们要找到一个字符串,这个字符串经过md5得到的16位原始二进制的字符串能帮我们实现sql注入。
我们的目标就是要找一个字符串取32位16进制的md5值里带有276f7227这个字段的,接着就是要看关键的数字部分了,在276f7227这个字段后面紧跟一个数字,除了0,1-9,对应的asc码值是49-57,转化为16进制就是31-39,也就是我们需要有276f7227+(31-39)这个字段,就可以满足要求。比如xxxxxxxxxxxxxxxx276f7227(31-39)xxxxxx
ffifdyop,这个点的原理是 ffifdyop 这个字符串被 md5 哈希了之后会变成 276f722736c95d99e921722cf9ed621c,这个字符串前几位刚好是 ‘ or ‘6,
而 Mysql 刚好又会把 hex 转成 ascii 解释,因此拼接之后的形式是select * from ‘admin’ where password=’’ or ‘6xxxxx’
等价于 or 一个永真式,因此相当于万能密码,可以绕过md5()函数
我们找到了:
1 ffifdyop
经过md5()后为
1 276f722736c95d99e921722cf9ed621c
3、输入后在网页源代码里找到提示
数组绕过
md5不能加密数组,传入数组会报错,但会继续执行并且返回结果为null
比如将两个数组的md5值进行比较
md5(a[]=1) === md5(b[]=1)
由于md5函数无法处理数组,会返回null,所以md5加密后的结果是下面这样
null === null
结果返回true,也就是说数组的md5值进行比较时,结果相等
数组绕过不只可以绕过弱类型比较,还可以绕过强类型比较(===)
进行get传参 绕过
1 a[]=1&b[]=2
进行跳转
利用post发送
1 param1[]=1¶m2[]=2
eg:
双等号(==):两个等号我们称为等值符,当等号两边的值为相同数据类型时,直接比较值是否相同,当类型不同时会发生数据类型的转换,转换为相同的类型后再进行比较。(通常在if判断语句中使用)
(1)如果等号两边是boolean、string、number三者中任意两者进行比较时,优先转换为数字进行比较。
( 2)如果等号两边出现了null或undefined,null和undefined除了和自己相等,就彼此相等
三等号(===):三个等号我们称为绝对等同符,既要判断数值也要判断数据类型是否相等,当等号两边的值为相同数据类型时,直接比较等号两边的值,值相同则返回true;若等号两边的值类型不同时直接返回false。