1.关键代码
<?php
$flag="";
$v1=$_GET['v1'];
$v2=$_GET['v2'];
if(isset($v1) && isset($v2)){
if(!ctype_alpha($v1)){
die("v1 error");
}
if(!is_numeric($v2)){
die("v2 error");
}
if(md5($v1)==md5($v2)){
echo $flag;
}
}else{
echo "where is flag?";
}
?>
传入两个参数, v 1 须是字母, v1须是字母, v1须是字母,v2须是数字,并且两者的MD5值需要相等。
MD5碰撞
会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他们相同,都是0。
===和!==即strict比较符,只有在类型相同时才相等。==和!=即non-strict比较符,会在类型转换后进行比较。
此外0 == 字符会被认为是正确的,可以绕过验证
这里的比较符为==,所以我们可以利用弱比较的特点构造
v
1
=
s
878926199
a
,
v1=s878926199a,
v1=s878926199a,v=QLTHNDT。
常用MD5碰撞值
字母数字混合类(MD5值):
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
大写字母类:
QLTHNDT
0e405967825401955372549139051580
QNKCDZO
0e830400451993494058024219903391
EEIZDOI
0e782601363539291779881938479162
纯数字类:
240610708
0e462097431906509019562988736854