题目来源于[SWPUCTF 2021 新生赛]easy_md5
1.1 MD5弱比较和强比较
强比较:使用三个 ''==='' 比较,比较值,也比较类型
弱比较:使用两个 ''=='' 比较,只比较值,不比较类型
- a==b 转同类型->后比较值
- a===b 先判断类型是否相同,如果相同则比较值;如果不同则返回 false
转换规则:
1.字符型和字符型比较,为同类型,比较其内容
2.数字型和数字型比较,同上
3.字符型和数字型比较,若字符型值开头为数字,转为数字;
若开头不为数字,为 null (弱比较)与 0 相等。
[1]字符型和数值型的弱比较
先看字符串开头是否为数字
如果为数字,则截止到连续数字的最后一个数字,即"123abc456"=>123
如果不为数字,则判断为false,即"abc123456"=>0
[2]字符型和字符型的比较
字符串的弱比较只能采用0e绕过,需要注意的是,0e后面不能有字母的存在
实例:
("0e123456"=="0e345") => true
("0e12adfc"=="0e345") => false
[3] 布尔型和任意值的比较
布尔值true和任意字符串和数值都弱相等,除了0和false,因为0也认为是bool false,true是不等于false的
实例:
(true==''false'') => false
(0==''false'') => true
(true==0) => false
(true==''abc'') =>true
(true==''123abc'') =>true
1.2 0e绕过&数组绕过
<1> 0e绕过
科学记数法是一种记数的方法。
计算器表达10的幂一般是用E或e
如:2 760 000 = 2.76×10^6 = 2.76e6
所以0e,无论后面跟什么值,都是0
<2> 数组绕过
数组绕过的原理
md5不能加密数组 ,如 a[]=1 , b[]=1 , 传入数组会报错,但会继续执行并且返回结果为null
比如传入md5(a[]=1)==md5(b[]=2),实际上是null==null,所以数组进行md5弱比较时,结果相等
<3>万能通式ffifdyop 绕过
万能通式:129581926211651571912466741651878684928和ffifdyop
实例:
select * from 'admin' where password=md5($pass,true)
输入md5('ffifdyop',true)绕过
即
select * from 'admin' where password=md5 ( ' ffifdyop ' ,true)
md5(string,raw)
绕过原理:
ffifdyop 这个字符串被 md5 哈希了后会变成 276f722736c95d99e921722cf9ed621c,这个字符串前几位刚好是' or '6
而 Mysql 刚好又会把 hex 转成 ascii 解释,因此拼接之后的形式是 select * from 'admin' where password= ' ' or '6xxxxx ',等价于 or 一个永真式,因此相当于万能密码,可以绕过md5()函数。
where password=正确的密码or 1 ,代表永真,那么前面有没有密码都无所谓了
简单说,
select * from admin where password= ' ' or'6<乱码>'
就相当于
select * from admin where password= ' ' or 1 实现sql注入
当两个条件中有任一个条件满足,“逻辑或”的运算结果就为“真”
逻辑与”相当于生活中说的“并且”,就是两个条件都同时成立的情况下“逻辑与”的运算结果才为“真”。
2.1 Hackbar实现GET & POST解题
数组绕过
输入URL ?name[]=1 -> GET
password[]=2 ->POST