JF0 2020-01-24
== 在进行比较的时候,会先将两边的变量类型转化成相同的,再进行比较
0e在比较的时候会将其视作为科学计数法,所以无论0e后面是什么,0的多少次方还是0。
因此CTF比赛中需要用到弱类型HASH比较缺陷最明显的标志便是管理员密码MD5之后的值是以0e开头
由漏洞成因我们可以分析出: 只要让我们输入的密码在经过函数加密之后是以0e开头即可
附上一部分md5加密之后是以0e开头的值:
ej0D ek06 el08 eo0n ey0M ey0O ez0s e006 e10l eU3Z eW3vfSoL fToh fTo1 fUoU fYou fapF fbpf fdpF fnpZ fppr fqpa frpj fwpD fyp5 f1p2 f4pN f7pu fDpQ fHpP fIp4 fJpX fLpv fOpi fQp3 fTpi fVpz feqN fjqN fvq1 fyqy fAqJ fEqk fFqg fFqi fHqX fIqF fKqh fLq6 fQq6 fQqA fRql fUq4 fUqA fXq0 farg farJ ftrT f7rm fCrB fErY fIrt QNKCDZO s878926199a s155964671a s214587387a s214587387a s878926199a
<?php $a = $_POST[‘pwd‘]; $password = "0e1998badb934bce65ad9ba8facc9121"; //注意:这里管理员密码md5的值是以0e开头的,如果没有看到0e而直接去解md5九成是解不出来的 if(md5($a) == $password){ //注意:这里是两个等号"=="进行判断,若是"==="则不存在弱类型hash比较缺陷 echo $flag; } ?>
在已知管理员密码md5值是以0e开头的前提下,观察代码逻辑,如果是使用"=="判断即可直接传入md5值是0e开头的任一密码
若是"==="判断,则可以通过数组返回NULL的方法来绕过
如下代码:
<?php $a = $_GET[‘pwd‘]; $password = "0e1998badb934bce65ad9ba8facc9121"; if(md5($a) == $password){ //注意:这里是三个等号"==="进行判断 echo $flag; } ?>
传入www.target.com/login.php?pwd[]=1就可以成功绕过判断。
这样的方法也可以用来绕过sha1()等hash加密函数相关的判断,也可以绕过正则判断