题目
代码来自:23128/challenge18.php~
<?php
header("Content-type: text/html; charset=utf-8");
if(isset($_POST['login']))
{
if(isset($_POST['user']))
{
if(@strcmp($_POST['user'],$USER))//USER是被隐藏的复杂用户名[原题已有注释]
{
die('user错误!');
}
}
if (isset($_POST['name']) && isset($_POST['password']))
{
if ($_POST['name'] == $_POST['password'] )
{
die('账号密码不能一致!');
}
if (md5($_POST['name']) === md5($_POST['password']))
{
if(is_numeric($_POST['id'])&&$_POST['id']!=='72' && !preg_match('/s/', $_POST['id']))
{
if($_POST['id']==72)
die("flag{xxxxxxxxxxxxx}");
else
die("ID错误2!");
}
else
{
die("ID错误1!");
}
}
else
die('账号密码错误!');
}
}
?>
分析
-
不提交user
-
需要
==比较不等
并且md5后全等
的两个变量
-
弱比较绕过
is_numeric($_POST['id'])
+$_POST['id']!=='72'
+$_POST['id']==72
=>id=72.
知识点
MD5不能处理数组,处理任意数组返回值都相同
0E开头的两个md5值==
不===
PHP在处理哈希字符串时,会利用!=
或==
来对哈希值进行比较,它把每一个以0E
开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以0E
开头的,那么PHP将会认为他们相同,都是0。
72.
是数字字符串
检测变量是否为数字或数字字符串
is_numeric ( mixed $var ) : bool
如果 var 是数字和数字字符串则返回 TRUE,否则返回 FALSE。
解法
name[]=1&password[]=2&id=72.&login=Check