打开是一个简单的登陆界面,查看源码: <?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。
时间: 2024-10-11 22:02:39