CTF WEB MD5绕过
MD5绕过
登录的哈希验证
$a != $b
md5($a) == md5($b)
0E绕过
让两个变量不相等,但md5却相等,可以通过计算0e开头的md5来进行绕过
var_dump(md5("s878926199a"));
//0e545993274517709034328855841020
var_dump(md5("s155964671a"));
//0e342768416822451524974117254469
因为md5函数返回值为字符串,返回字符串开头都带有0e,并且使用了”==“做判断
所以字符串会被转化为数值0,0 == 0条件成立
数组绕过
如果并没有使用弱类型""来判断,而是采用强类型"="来判断,要如何绕过呢
$a != $b
md5($a) === md5($b)
在md5函数传参中,第一个参数应该是一个字符串,但是如果传入数组则会抛出异常,返回null
所以null === null条件成立
GET传入数组方式:
http://localhost/test.php?a[]=123&a[]=456
碰撞绕过
如果两个变量强转字符串呢,这个时候就只能使用md5碰撞进行绕过
(string)$a != (string)$b
md5($a) === md5($b)
两个不同的东西,有相同的md5值
HEX样本:
0e306561559aa787d00bc6f70bbdfe3404cf03659e704f8534c00ffb659c4c8740cc942feb2da115a3f4155cbb8607497386656d7d1f34a42059d78f5a8dd1ef
0e306561559aa787d00bc6f70bbdfe3404cf03659e744f8534c00ffb659c4c8740cc942feb2da115a3f415dcbb8607497386656d7d1f34a42059d78f5a8dd1ef
以上两端数据的md5值均为"cee9a457e790cf20d4bdaa6d69f01e41"
例题
<?php
if(isset($_GET['md5'])){
$md5 = $_GET['md5'];
if ($md5 == md5($md5)){
echo "flag"
}
}
?>
由于使用的是弱类型”==“判断,所以我们需要一个”0e“开头的字符串并且md5值也是“0e”开头
0e00275209979 -> 0e551387587965716321018342879905
0e00506035745 -> 0e224441551631909369101555335043
GET:
http://localhost/test.php?md5=0e00275209979