md5

 

 

代码审计:
绕过level1,让
PHP
$_GET["param1"] == hash("md4", $_GET["param1"])
就可以绕过,通过对比md5的漏洞分析PHP在处理科学计数法的时候如果是0exxx会当成0,所以如果一个数字是0exxx它经过md4最后也是0exxx,那么他们就(==弱等于),在这里需要说明一下0e后面必须是数字才能实现(==弱等于)。“0e251288019”和“0e898201062”都可以绕过,还要说明一下是is_numeric()函数有漏洞,当数字里面有e的话is_numeric()函数会当成xxx*10^xxx相当于科学计数法。
 
绕过level2,重点是 md5($_GET['param2']) == md5(md5($_GET['param3'])),双md5加密,其实很简单,避免陷入技术思维,一个值的md5后再md5要与另外一个值一样,完全可以输入param3随便给个值,然后param2为param3的md5值就行。这样绝对绕过限制。
例如:
param3=QNK
param2=651571d4a1fa4ce19dc1e5bba0f6be37
此时md5("QNK")为651571d4a1fa4ce19dc1e5bba0f6be37,此次再md5两个一样的值肯定md5一样
V5VDSHva7fjyJoJ33IQl md5后得0e18bb6e1d5c2e19b63898aeed6b37ea 为0e开头,此次再md5肯定一样
PHP
($_GET['param2']) && isset($_GET['param3']) md5($_GET['param2'])==md5(md5($_GET['param3']))
 
绕过level3,直接使用数组绕过,原因是md5在处理数组的时候默认是NULL,最后构造Payload:
PHP
?param1=0e251288019&param2=0e18bb6e1d5c2e19b63898aeed6b37ea&param3=V5VDSHva7fjyJoJ33IQl&param4[]=1&param5[]=2
 
posted @ 2021-06-07 18:31  中毒219  阅读(55)  评论(0编辑  收藏  举报