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 文件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:“Test”:1:{s:4:“test”;N;}
如何反序列化利用
我们在构造特殊的meta-data数据后,在php中如果使用一些文件系统函数去引用调用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文件头进行校验的检测,可以根据相应的文件修改添加文件头,如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


猜你喜欢
- 新下载了一个Pycharm,建了个小demo,期间产生了一个sqlite3文件,由于是第一次打开,就弹出选择打开方式的对话框,手一块直接点了
- 安装python虚拟环境核心目的就是为了复制一个python环境,这样新项目下载的所有包,都会存放在虚拟环境下的python site-pa
- 这是一条颠覆常规的插入方法,一条INSERT语句可以完成向多张表的插入任务。小小地展示一下这种插入方法。1.创建表T并初始化测试数据,此表作
- 1 前置阅读在阅读本文章之前,你可以先阅读:什么是依赖注入2 简介Autofac与C#语言的结合非常紧密,并学习它非常的简单,也是.NET领
- 一、使用loadVariables 一个例子简单的描述了如何通过GET方法向服务器端的ASP发送请求: _root. pushAc
- 学生信息管理系统负责编辑学生信息,供大家参考,具体内容如下第一次发帖,下面通过python实现一个简单的学生信息管理系统要求如下:1.添加学
- 打开VB6,新建ActiveX DLL 2、在工程引用中加入Microsoft Active Server Pages Object Lib
- Python求解微分方程(数值解法)对于一些微分方程来说,数值解法对于求解具有很好的帮助,因为难以求得其原方程。比如方程:但是我们知道了它的
- 本文跟大家谈谈为什么要学python以及如何学好python。一、作为初学者,应该如何学python?很多人对python缩进试的简洁表达不
- 在机器学习的时候,当开始就遇到问题,pycharm启动jupyter notebook之后,浏览器前两行代码执行的好好的,后面就不执行了,上
- 一、查询操作可以使用Dataframe的index属性和columns属性获取行、列索引。import pandas as pddata =
- 前言模糊查询是数据库的基本操作之一,实现对给定的字符串是否与指定的模式进行匹配。如果字符完全匹配,可以用=等号表示,如果部分匹配可认为是一种
- 在服务器上训练的网络放到本地台式机进行infer,结果出现报错:AssertionError: Invalid device id仔细检查后
- Python 的代码风格由 PEP 8 描述。这个文档描述了 Python 编程风格的方方面面。在遵守这个文档的条件下,不同程序员编写的 P
- 我在使用python读取几十万行的文件中的数据,并构造字典,列表等数据结构时,再访问字典,列表时,一般都会出现内存不够的问题,然后只能循环读
- 前言;Python基础知识+结构+数据类型Python基础学习列表+元组+字典+集合Python基础学习函数+模块+类今天给大家分享的是第四
- 1.获取页面titletitle:获取当前页面的标题显示的字段from selenium import webdriverimport ti
- 之前就想要把自己的BlogsToWordpress打开成exe了。一直没去弄。又看到有人提到python打开成exe的问题。所以打算现在就去
- 用法:mean(matrix,axis=0) 其中 matrix为一个矩阵,axis为参数以m * n矩阵举例:axis 不设置
- 下面代码的功能是先训练一个简单的模型,然后保存模型,同时保存到一个pb文件当中,后续可以从pd文件里读取权重值。import tensorf