Phar反序列化超详细介绍

作者:隐形卟 时间:2023-06-05 07:06:02 

Phar是什么

在百度中得到介绍是这样的:

在软件中,PHAR(PHP归档)文件是一种打包格式,通过将许多PHP代码文件和其他资源(例如图像,样式表等)捆绑到一个归档文件中来实现应用程序和库的分发。phar文件本质上是一种压缩文件,会以序列化的形式存储用户自定义的meta-data。当受影响的文件操作函数调用phar文件时,会自动反序列化meta-data内的内容。

理解为php特有的一种打包方式,需要使用php代码进行大包,且无法通过普通的工具进行解压解包。

如何创建一个Phar 文件

创建之前了解Phar文件的组成结构:

stub:phar文件的标志,必须以 <?php xxx; __HALT_COMPILER();?>, 结尾,否则无法识别。xxx可以为自定义内容。
stub这一部分,在了解时发现其实这样写 < __HALT_COMPILER();> 也是可以正常解析的
manifest:phar文件本质上是一种压缩文件,其中每个被压缩文件的权限、属性等信息都放在这部分。这部分还会以序列化的形式存储用户自定义的meta-data,这是漏洞利用最核心的地方。
content:被压缩文件的内容
signature (可空):签名,放在末尾。

开始之前需要修改配置php.ini配置文件,修改phar.readonly 配置为Off,之后重启生效

Phar反序列化超详细介绍

最常见的创建Phar 文件php代码

<?php
class Test{
  public  $test="test";
}
$p = new Test();
$phar = new Phar("test.phar");//要创建的Phar文件名,必须是phar后缀
$phar->startBuffering();//写入之前开始缓冲Phar写入操作
$phar->setStub("<?php __HALT_COMPILER();?>");//设置stub
$phar->setMetadata($p);//将自定义的meta-data存入manifest,这一部分就是把序列化的对象加入到meta-data
$phar->addFromString("test.txt", "test");//添加要压缩的文件(这一步必须要有,如果不设置就无法生成phar文件,文件随便)
$phar->stopBuffering();//签名自动计算
?>

执行代码后会在当前代码目录下生成test.phar文件,以文本格式查看test.phar文件,在内容中可以看到Test类被序列化写入了。O:4:&ldquo;Test&rdquo;:1:{s:4:&ldquo;test&rdquo;;N;}

Phar反序列化超详细介绍

如何反序列化利用

我们在构造特殊的meta-data数据后,在php中如果使用一些文件系统函数去引用调用phar文件就会触发反序列化,下面是知道创宇测试确认受影响的函数。

Phar反序列化超详细介绍

这里使用is_dir函数,这是一个判断传入的是否是一个目录的函数,创建与之前设置meta-data 的一个Test类,__wakeup魔术方法与__destruct 魔术方法在反序列化对象时都会触发,__destruct 魔术方法是在销毁时触发。

<?php
class Test{
   function __wakeup()
   {
       echo($this ->test) ;
   }
}
is_dir('phar://test.phar');//以phar伪协议的格式传入
?>

输出结果,meta-data中的数据被反序列化触发了__wakeup魔术方法,打印了test

Phar反序列化超详细介绍

在学习过程中,发现存在伪协议phar://关键词不能出现在开头的情况,师傅们的绕过方法是,使用下面的方式也能达到一样的效果。

如果在上传对phar文件头进行校验的检测,可以根据相应的文件修改添加文件头,如gif(GIF89a)

compress.bzip://phar:///test.phar/test.txt
compress.bzip2://phar:///test.phar/test.txt
compress.zlib://phar:///home/sx/test.phar/test.txt
php://filter/resource=phar:///test.phar/test.txt

来源:https://blog.csdn.net/qq_42077227/article/details/127593239

标签:Phar,反序列化
0
投稿

猜你喜欢

  • Python3使用TCP编写一个简易的文件下载器功能

    2021-02-20 09:58:07
  • PDO::getAvailableDrivers讲解

    2023-06-08 22:24:20
  • 重新阅读《HTTP协议基础》

    2008-04-04 17:40:00
  • 浅谈python字符串方法的简单使用

    2021-07-14 11:16:25
  • MySQL存储IP地址的方法

    2024-01-23 06:01:02
  • python读写配置文件操作示例

    2021-12-12 03:51:29
  • SVN与Git版本控制的优缺点差异全面分析

    2023-12-18 13:39:02
  • Go实现MD5加密的三种方法小结

    2024-02-08 03:47:37
  • javascript FAQ函数(提问+回复)

    2024-04-19 09:55:54
  • centos 安装python3.6环境并配置虚拟环境的详细教程

    2021-06-10 12:24:49
  • 200行python代码实现2048游戏

    2023-02-28 16:07:21
  • 一文教你用Pyecharts做交互图表

    2022-11-20 22:33:38
  • python计算机视觉opencv图像金字塔轮廓及模板匹配

    2021-10-10 09:15:33
  • 解决vue脚手架项目打包后路由视图不显示的问题

    2024-04-27 16:06:31
  • CentOS7开启MySQL8主从备份、每日定时全量备份(推荐)

    2024-01-15 20:31:18
  • java正则表达式匹配所有数字的案例

    2023-07-07 02:59:38
  • js删除数组中指定元素的几种方式

    2024-04-10 10:50:48
  • 从MySQL导大量数据的程序实现方法

    2009-03-06 14:34:00
  • Python3之手动创建迭代器的实例代码

    2021-10-15 21:00:30
  • 深入了解mysql长事务

    2024-01-28 10:29:32
  • asp之家 网络编程 m.aspxhome.com