实验吧 天网管理系统

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}

 

posted @ 2018-09-28 22:31  Tri0mphe  阅读(201)  评论(0编辑  收藏  举报