首页 > 代码库 > 三个等号的题

三个等号的题

打开是一个简单的登陆界面,查看源码:

<?php
if (isset($_GET[‘name‘]) and isset($_GET[‘password‘])) 
{
    if ($_GET[‘name‘] == $_GET[‘password‘])
        echo ‘<p>Your password can not be your name!</p>‘;
    else if (sha1($_GET[‘name‘]) === sha1($_GET[‘password‘]))
      die(‘Flag: ‘.$flag);
    else
        echo ‘<p>Invalid password.</p>‘;
}
else
    echo ‘<p>Login first!</p>‘;
?>
如果想登录成功,必须满足两个条件:

$_GET[‘name‘] != $_GET[‘password‘]
sha1($_GET[‘name‘]) === sha1($_GET[‘password‘])

这里需要注意一下,第二个条件是===,和==是有点区别的:

===是恒等计算符   同时检查表达式的值与类型

==是比较运算符号  不会检查条件式的表达式的类型

所以,===会比较类型,比如bool。
在这里,sha1()函数和md5()函数存在着漏洞,sha1()函数默认的传入参数类型是字符串型,那要是给它传入数组呢,当然,会出现错误,使sha1()函数返回错误,也就是返回false,这样一来===运算符就可以发挥作用了,所以,这道题需要构造username和password既不相等,又同样是数组类型,构造url:

http://ctf4.shiyanbar.com/web/false.php?name[]=a&password[]=b

a,b既可以看成不同的值,也可以看成a,b啦。
得到flag。

 

三个等号的题