实验吧 天网管理系统
打开这道题,这是一道传说中的简单题目
进入题目,两个输入框,上面白纸黑字的写着用户名和密码(你觉得我会相信你吗?。。。好吧我相信了)
尝试一下username 和password 都是admin。。(明显不行)
那就查看一下源代码,在源代码中发现了一句话:
<!-- $test=$_GET['username']; $test=md5($test); if($test=='0') -->
这句话表示,用户名要是一个MD5加密之后是0的值,所以在网上找到一字符串,输入之后出现了一个网址,访问这个网址。
我得到了如下的提示:
$unserialize_str = $_POST['password']; $data_unserialize = unserialize($unserialize_str); if($data_unserialize['user'] == '???' && $data_unserialize['pass']=='???') { print_r($flag); } 伟大的科学家php方言道:成也布尔,败也布尔。 回去吧骚年
根据这句话,我得到几个信息
1.首先是构造一个字符串,作为密码,它需要被反序列化
2.这个字符串的序列化的值被导入数组,user部分应该等于“???”,pass
部分也应该等于“???”
3.这个知识点和bool类型的值有关
于是我查询了资料,找到了解题原理:
在php中 “==”
的判断是不严谨的,也就是说,如果有一个字符串是“3kjahkfafaj” ,和数字3比较大小,在
“=="
的判断条件下,这两个值是相等的,它省略了字符串“3”后面的字符,并且把字符类型转换成了数字类型
而特殊情况是:ture针对所有类型的值都在“==”
的情况下相等,无论后面是“???”还是什么其他的字符串,
都可以相等,所以我们就得到了密码:
a:2:{s:4:”user”;b:1;s:4:”pass”;b:1;}
输入密码,得到flag