千家信息网

怎么浅析phar反序列化漏洞攻击及实战

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,怎么浅析phar反序列化漏洞攻击及实战,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。前言phar反序列化漏洞很久之前就开
千家信息网最后更新 2026年11月02日怎么浅析phar反序列化漏洞攻击及实战

怎么浅析phar反序列化漏洞攻击及实战,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

前言

phar反序列化漏洞很久之前就开始接触了;因为当时出了点问题导致一直无法成功,所以当时直接去学习其他的漏洞了;今天觉得是时候把这个漏洞补上去了;

漏洞成因

phar文件会以序列化的形式存储用户自定义的meta-data;该方法在文件系统函数(file_exists()、is_dir()等)参数可控的情况下,配合phar://伪协议,可以不依赖unserialize()直接进行反序列化操作

原理分析

phar的组成

通过查阅手册发现phar由四部分组成;翻阅手册可以知道,phar由四个部分组成,分别是stub、manifest describing the contents、 the file contents、 [optional] a signature for verifying Phar integrity (phar file format only) 下面进行解释一下;

1 .0 a stub

标识作用,格式为xxx,前面任意,但是一定要以__HALT_COMPILER();?>结尾,否则php无法识别这是一个phar文件;

2 .0 a manifest describing the contents

其实可以理解为phar文件本质上是一中压缩文件,其中包含有压缩信息和权限,当然我们需要利用的序列化也在里面;

图片选自于 seebug

3 .0 the file contents

这里指的是被压缩文件的内容;

4 .0 [optional] a signature for verifying Phar integrity (phar file format only)

签名,放在结尾;

试验

这里引用开心师傅给的一个实例;来进行生成;

startBuffering();    $phar->setStub(""); //设置stub    $o = new TestObject();    $phar->setMetadata($o); //将自定义的meta-data存入manifest    $phar->addFromString("test.txt", "test"); //添加要压缩的文件    //签名自动计算    $phar->stopBuffering();?>

然后在服务器之下运行,发现成功生成phar文件;

然后打开这个phar文件,我们发现已经成功;并且数据的存储方式是以序列化的方式存储的;

那么既然有序列化,那么就一定有反序列化,php的很多文件系统函数在通过phar://伪协议解析phar文件的时候。都会将mate-data进行反序列化。

将phar伪造为其他类型的文件

前面在讲的时候已经介绍了phar的四个部分,这里注意到第一个部分stub;因为这个部分的存在,纵然我们修改了phar后缀,服务器读取到stub的时候依然会当作phar文件;再准确点讲就是下面的代码;(二进制的编译器有点问题,简单用记事本来看看;)也还是可以发现是以序列化形式存储的;

实战

拿一道 SWPUCTF 中的一道题目来讲;进去就发现了包含漏洞,然后直接读取源码,发现并没有对phar进行过滤;而且源代码里有提示,所以差不多实锤了,就是phar反序列化漏洞了;

直接来对关键的代码进行分析;class.php

这里面看到有三个类,再明显不过了,这就是主要的pop链的构造处;然后发现了危险的函数 file_get_contents();那看来就是利用这个读源码了;

一步步分析;先看到C1e4r这个类里面有echo;那要利用echo;以达到输出字符串的目的;

然后看到show类里有一个 __toString()方法,这个方法在对象被转化为字符串的时候会自动调用;比如进行echo print的时候会进行调用并返回一个字符串;

然后审计Test类,发现file_get_contents()函数,那就是利用了;一步一步向前追溯 file_get->get->__get();这里主要还是调用__get()方法;

那么这里思路差不多清晰了;简单来讲;在test类中要调用__get方法,那么触发这个方法我们需要在show类里寻,因为这个类里面运用了source属性,所以只需要将 str['str'] 赋值为 Test类就可以,那么触发 __toString()方法就需要用到我们的第一个类里面的echo了;

那么思路清晰就构造处pop链;

exp编写

生成phar文件,改后缀为gif绕过限制,上传之后进入upload目录之下(或者根据源代码算出上传后的文件名),复制文件名到读取文件的窗口读取 file=phar://xxxxxx.jpg然后得到base64的编码解码就好;

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

文件 序列 漏洞 方法 时候 就是 函数 存储 成功 字符 字符串 部分 分析 生成 实战 差不多 一道 个部 代码 内容 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 北京路客互联网科技有限公司 互联网属科技 今日互联网科技 互联网为科技 互联网科技开发公司 深圳互联网络科技有限公司 紫鲸互联网科技 碳银互联网科技有限公司 一五八零互联网科技 甘肃拓世互联网科技有限公司 深圳前海聚择互联网科技有限公司 南山科技园互联网公司有哪些 互联网科技项目计划书材料类 苏州五指互联网络科技有限 工业互联网展湾科技股份有限公司 互联网科技圈年度人物 四川互联网展示科技馆设计 陕西彩京云互联网科技有限公司 瑞安市蟠桃会互联网科技有限公司 互联网 科技节活动 微视频大赛 博彦科技互联网金融 互联网科技的发展 互联网科技小贷 中国互联网有什么科技含量 重庆互联网医院沙龙医盟信息科技 华中科技大学互联网的牛人 国大互联网教育科技有限公司薪资 科技互联网的核心竞争力 互联网金融运营模式中的金融科技 优雇互联网科技有限公司
0