启动靶场读取源码
<?php highlight_file('flag.php'); $_GET['id'] = urldecode($_GET['id']); $flag = 'flag{xxxxxxxxxxxxxxxxxx}'; if (isset($_GET['uname']) and isset($_POST['passwd'])) { if ($_GET['uname'] == $_POST['passwd']) print 'passwd can not be uname.'; else if (sha1($_GET['uname']) === sha1($_POST['passwd'])&($_GET['id']=='margin')) die('Flag: '.$flag); else print 'sorry!'; } ?>分析一下代码:
必须传入GET参数uname,还要传入POST参数passwd;
uname(GET)和password(POST)不能相等,否则会返回“passwd can not be uname”
uname 的sha1加密结果和passwd的sha1的加密结果必须完全相等(===),同时GET参数id必须等于margin;
满足所有条件,就会输出flag。
漏洞就在于如果给sha1加密函数传入一个数组就会返回NULL
NULL === NULL是严格相等的。
例如 uname[]=123和 passwd[]=456
这个时候sha1(uname) === sha1(passwd)就成立了