实验吧 天网管理系统
0x01 ==
这道题确实可以学习很多新的知识.点进去以后,点了几下登入系统并没有什么用.
F12,在注释里面看到了一句话
<!-- $test=$_GET['username']; $test=md5($test); if($test=='0') -->
用户名经过md5加密后与'0'进行比较.又是==号.==号不会检查表达式的类型. 比较的时候会把含有数字的字符串转换成数值类型比较. 如果参数是字符串,会将后面的不是数字的字符串丢弃,返回前面的数字.
比如'243aaaa'返回243. 而且对于'0e123'会转为科学计数法类型.所以我们只要找到一个字符串MD5加密后以0开头就行. 这里使用 s878926199a
在用户名处输入,下方显示,继续访问.
/user.php?fame=hjkleffifer
0x02 序列化
进去以后,有一行代码.意思就是将password反序列化后得到一个数组,数组里的user和pass的值和某字符串相等就显示flag.
$unserialize_str = $_POST['password']; $data_unserialize = unserialize($unserialize_str); if ($data_unserialize['user'] == '???' && $data_unserialize['pass'] == '???') { print_r($flag); } 伟大的科学家php方言道:成也布尔,败也布尔。 回去吧骚年
但是我们并不知道字符串是什么,下面的话提醒我们使用布尔.bool类型的true和任意字符串 用==比较都相等.所以我们就构造一个序列化后的数组.
让user和pass的值都为true.
<?php $array = array(); $array['user'] = true; $array['pass']=true; $a = serialize($array); echo $a; ?>
得到一个序列化后的数组
a:2:{s:4:"user";b:1;s:4:"pass";b:1;}
在password处输入得到flag
ctf{dwduwkhduw5465}