源码:
<?php
$flag="flag";
if(isset($_GET['name'])andisset($_GET['password']))
{
if($_GET['name']==$_GET['password'])
echo'<p>Yourpasswordcannotbeyourname!</p>';
elseif(sha1($_GET['name'])===sha1($_GET['password']))
die('Flag:'.$flag);
else
echo'<p>Invalidpassword.</p>';
}
else
echo'<p>Loginfirst!</p>';
?>
函数释义:
sha1()函数计算字符串的 SHA-1 散列。
===会比较类型,比如bool sha1()函数和md5()函数存在漏洞,sha1()函数默认的传入参数类型是字符串型,如果传入数组类型会出现错误,从而使sha1()函数返回false,这样===运算符就可以发挥作用,因此获取flag需要构造username和password既不相等,又同样是数组类型。
代码分析:
输出flag的条件:
$_GET['name']==$_GET['password']name和password的值不能相等
且需要
sha1($_GET['name'])===sha1($_GET['password'])
===会比较类型,比如bool sha1()函数和md5()函数存在漏洞,sha1()函数默认的传入参数类型是字符串型,如果传入数组类型会出现错误,从而使sha1()函数返回false,这样===运算符就可以发挥作用,因此获取flag需要构造username和password既不相等,又同样是数组类型。
解题过程:
两个参数都不赋值时尝试:
http://localhost:63342/php_bugs-master/07%20sha()%E5%87%BD%E6%95%B0%E6%AF%94%E8%BE%83%E7%BB%95%E8%BF%87.php?name=&password=
两个参数都设置成数组类型且值不相同,可获取flag:
http://localhost:63342/php_bugs-master/07%20sha()%E5%87%BD%E6%95%B0%E6%AF%94%E8%BE%83%E7%BB%95%E8%BF%87.php?name[]=1&password[]=2
参考链接:
https://github.com/bowu678/php_bugs