强类型比较
特点
1、使用三个 ''==='' 表示;
2、比较值,也比较类型;
3、先判断a,b类型,若相同,则比较值,若不相同,则返回false
强类型的绕过(有两种):
1、使用md5值完全相同的值绕过;
$a=$_GET['a'];
$b=$_GET['b'];
md5($a)===md5($b)
2、使用数组绕过。
弱类型比较
特点
1、使用两个 ''=='' 比较;
2、只比较值,不比较类型;
3、a==b 将a,b的值转换成同类型再比较值
弱类型的比较主要是字符型和数字型的比较
1.字符型和字符型比较,数字型和数字型比较
这两个为同类型,直接比较其内容是否相同
2、字符型和数字型比较
若字符型值开头为数字,转为数字;
若开头不为数字,为 null 弱比较与 0 相等。
例:''abc123''==123 => false
''abc123''==0 => true
"123abc"==123 => true
3、布尔值true和任意字符串和数值比较
布尔值true和任意字符串和数值比较都弱相等,除了0和false,因为0也认为是bool false,true是不等于false的
弱类型的绕过
0e绕过
以0e为开头的字符无论后面跟什么值,都是0
又因为MD5加密后的值也为0,比如明文s155964671a;密文0e342768416822451524974117254469
所以很多时候,我们可以构造以0e为开头的经过md5加密的值,来绕过弱类型比较
比如:
$a=$_GET['a'];
$b=$_GET['b'];
md5($a)==md5($b)
也可以根据它本身的特点绕过
比如:
$passwd=1234567a
$passwd==1234567
这是常见的,以0e为开头的md5的原文和密文
常见的MD5碰撞:md5值为0e开头_0e md5-CSDN博客