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
猜你喜欢
- 最近在研究雨哲软件采集程序的时候,需要获取真实软件地址时遇到了需要读取跳转页面跳转后的真实地址的问题。在网上找了很多方法,使用WinHttp
- 在运用xmlhttp组件编写程序中,会碰到 "msxml3.dll 错误 ‘800c0005’&nb
- 写任何编程代码,不同的开发者都会有不同的见解。但参考一下总是好的,下面是来自 Javascript Toolbox 发布的 14条最佳JS代
- 下面这段代码能够显示,当前用户所能够看到的所有的用户和表有兴趣的, 可以把每个表的内容加上<% Dim objOraSess
- window.opener 的用法 window.opener 返回的是创建当前窗口的那个窗口的引用,比如点击了a.htm上的一
- 笔者通过一周的时间,询问了许多设计人员真实用户,以便确保这六个方面确实是大多数用户所不喜并且有非常大的概率普遍存在于众多的医疗网站之中。那么
- 先简单说一下MP3的ID3 标记,因为主要是操作这个玩意MP3最开始的时候没有我们今天看到的那样,有歌手、年代,专集等等信息只有一些简单的参
- 通常用户看到的页面的样式会受到三层控制,第一层是浏览器的默认样式,第二层是网页定义样式,第三层是用户自定义样式。和CSS一样,后面的优先级高
- 如何在SQL2000的查询中使用XML-Data?具体程序如下:orders.asp<%@ Language=VBScrip
- 问题:如何保护自己的ASP源代码不泄露? 答:下载微软的Windows Script Encoder,对ASP的脚本和客户端javascri
- 在域环境下我没配置成果,也许是域用户的原因,因为我在生产环境下搞的,更改域用户需要重启SQLServer ,所以这个方法放弃了,只能用证书形
- 各位想必都知道,onfocus="this.blur()"这条代码能消除链接时的虚线框,但你有没有想过,如果你的网页上有
- 使用ewebeditor作为后台编辑器时,尤其是一个页面中使用多次该编辑器时,在提交数据时,可能会遇到数据被重复提交的情况。搜索找来一些解决
- 知识点: 函数 replicate 以下代码是实现如下功能: 代码如下:declare @sql varchar(200), --需填充的字
- 良好的编程习惯是每个程序员都应该具备的工作素质,在我的软件生涯中屡屡发现一些程序员的身上总有这样或者那样的坏毛病。这些毛病在一些从业时间不是
- 一直以来都对DOMDocument与 XMLHTTP 两者的区别不甚了解,今天用 eXeScope 查看了msxml6.dll 内
- 第二次遇到FF下正则兼容性问题( 第一次是关于"g"全局标志的,现在网上已有很多相关文章介绍)。以下正则在FF和IE下的
- 首先,FSO是FileSystemObject的简称。当然也就是我们的俗称FSO组件了,该组件可以用来处理驱动器、文件夹以及文件。它可以检测
- ASP开发中有用的function集合,挺有用处的!希望大家保留!<% '**
- CSS网页布局应该避免滥用div元素一直是我们倡导的,以合适的HTML标签组织文档是CSS网页布局的基础。页面中div与span元素的使用是