• Phar反序列化学习


    Phar是什么?

    在百度中得到介绍是这样的:
    在软件中,PHAR(PHP归档)文件是一种打包格式,通过将许多PHP代码文件和其他资源(例如图像,样式表等)捆绑到一个归档文件中来实现应用程序和库的分发。phar文件本质上是一种压缩文件,会以序列化的形式存储用户自定义的meta-data。当受影响的文件操作函数调用phar文件时,会自动反序列化meta-data内的内容。
    理解为php特有的一种打包方式,需要使用php代码进行大包,且无法通过普通的工具进行解压解包。

    如何创建一个Phar 文件

    创建之前了解Phar文件的组成结构:

    stub:phar文件的标志,必须以 <?php xxx; __HALT_COMPILER();?>, 结尾,否则无法识别。xxx可以为自定义内容。
    stub这一部分,在了解时发现其实这样写 < __HALT_COMPILER();> 也是可以正常解析的
    manifest:phar文件本质上是一种压缩文件,其中每个被压缩文件的权限、属性等信息都放在这部分。这部分还会以序列化的形式存储用户自定义的meta-data,这是漏洞利用最核心的地方。
    content:被压缩文件的内容
    signature (可空):签名,放在末尾。
    
    • 1
    • 2
    • 3
    • 4
    • 5

    开始之前需要修改配置php.ini配置文件,修改phar.readonly 配置为Off,之后重启生效
    在这里插入图片描述

    最常见的创建Phar 文件php代码

    
    class Test{
       public  $test="test";
    }
    $p = new Test();
    $phar = new Phar("test.phar");//要创建的Phar文件名,必须是phar后缀
    $phar->startBuffering();//写入之前开始缓冲Phar写入操作
    $phar->setStub("");//设置stub
    $phar->setMetadata($p);//将自定义的meta-data存入manifest,这一部分就是把序列化的对象加入到meta-data
    $phar->addFromString("test.txt", "test");//添加要压缩的文件(这一步必须要有,如果不设置就无法生成phar文件,文件随便)
    $phar->stopBuffering();//签名自动计算
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    执行代码后会在当前代码目录下生成test.phar文件,以文本格式查看test.phar文件,在内容中可以看到Test类被序列化写入了。O:4:“Test”:1:{s:4:“test”;N;}

    在这里插入图片描述

    如何反序列化利用

    我们在构造特殊的meta-data数据后,在php中如果使用一些文件系统函数去引用调用phar文件就会触发反序列化,下面是知道创宇测试确认受影响的函数。
    在这里插入图片描述

    这里使用is_dir函数,这是一个判断传入的是否是一个目录的函数,创建与之前设置meta-data 的一个Test类,__wakeup魔术方法与__destruct 魔术方法在反序列化对象时都会触发,__destruct 魔术方法是在销毁时触发。

    
    <?php
    class Test{
        function __wakeup()
        {
            echo($this ->test) ;
        }
    }
    is_dir('phar://test.phar');//以phar伪协议的格式传入
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    输出结果,meta-data中的数据被反序列化触发了__wakeup魔术方法,打印了test

    在这里插入图片描述

    在学习过程中,发现存在伪协议phar://关键词不能出现在开头的情况,师傅们的绕过方法是,使用下面的方式也能达到一样的效果。
    如果在上传对phar文件头进行校验的检测,可以根据相应的文件修改添加文件头,如gif(GIF89a)

    compress.bzip://phar:///test.phar/test.txt
    compress.bzip2://phar:///test.phar/test.txt
    compress.zlib://phar:///home/sx/test.phar/test.txt
    php://filter/resource=phar:///test.phar/test.txt
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • 相关阅读:
    如何理解ROS的ros::NodeHandle,学习ROS一年后的体会
    (数据科学学习手札146)geopandas中拓扑非法问题的发现、诊断与修复
    基于Django+Vue.js+Scrapy+Sqlite3电影数据可视化(柱状图、折线图、饼图、词云图)设计
    牛客小白月赛60-D-游戏购买!
    Spring boot admin 服务监控利器
    Java责任链模式之总有你想不到的知识
    Docker Compose 一键快速部署 RocketMQ
    通关算法题之 ⌈二叉树⌋ 上
    计算机网络学习
    【PG】postgreSQL参数解释二 WRITE-AHEAD LOG部分
  • 原文地址:https://blog.csdn.net/qq_42077227/article/details/127593239