PHP反序列化漏洞原理(附带pikachu靶场演示)

1.反序列化概念

  1. 序列化:是将变量转换为可保存或传输的字符串的过程;实现函数是serialize()
  2. 反序列化:就是在适当的时候把这个字符串再转化成原来的变量使用,就是序列化的逆过程。实现函数是unserialize()

直白一点就是:序列化是把对象转换成字节流,反序列化就是为了恢复到之前的状态,把字节流转换成对象的过程。

序列化数据格式

数据类型

序列化格式

解释

整数

i:42;

表示整数值为42

浮点数

d:3.14;

表示浮点数值为3.14

字符串

s:5:"hello";

表示字符串长度为5,内容为"hello"

空字符串

s:0:"";

表示一个空字符串

数组

a:3:{i:0;s:5:"apple";i:1;s:6:"banana";i:2;s:5:"cherry";}

表示包含3个元素的数组

关联数组(对象)

O:8:"stdClass":2:{s:4:"name";s:5:"Alice";s:3:"age";i:30;}

表示一个包含两个属性的对象

布尔值

b:1;b:0;

表示真(true)或假(false)

NULL

N;

表示空值

这个表格更详细地列出了各种数据类型在PHP中的序列化格式和相应的解释。

举个详细的例子:

输出结果:

O:8:"examlple":5:{s:6:"string";s:4:"test";s:17:" examlple integer";s:1:"1";s:7:" * null";s:4:"null";s:6:"double";s:3:"1.2";s:4:"bool";s:4:"True";}

反序列化漏洞

反序列化漏洞:也叫对象注入,就是当程序在进行反序列化时,会自动调用一些函数,但是如果传入函数的参数可以被用户控制的话,用户可以输入一些恶意代码到函数中,从而导致反序列化漏洞。

可以理解为程序在执行unserialize()函数是,自动执行了某些魔术方法(magic method),而魔术方法的参数被用户所控制(通过控制属性来控制参数),这就会产生安全问题。

漏洞利用条件:

  1. unserialize()函数的参数可控。
  2. 存在可利用的魔术方法。

属性赋值

要利用反序列化漏洞,必须向unserialize()函数传入构造的序列化数据(定义合适的属性值)。那么,如

何构造序列化数据呢?

<?php
show_source( __FILE__);
error_reporting(0);
class DEMO{
public $func;
public $arg ;
public function safe(){
echo $this->arg;
}
public function evi0{
eval($this->arg);
}
public function run(){
$this->{$this->func}();
}
function_construct(){
$this->func ='evil';
}
}
$obj=unserialize($_GET['a']);
$obj->run();
?>

直接写序列化数据显示是不合适的,因为序列化数据不符合人类直观,很容易出错。实际上,都是利用serialize()函数来生成序列化数据的。

生成步骤:

  1. 把题目代码复制到本地;
  2. 注释掉与属性无关的内容(方法和没用的代码);
  3. 对属性赋值;
  4. 输出ur编码后的序列化数据:
  5. 将序列化数据发送到目标服务器。

进行URL编码的原因:

  1. 原始的序列化数据可能存在不可见字符;
  2. 如果不进行编码,最后输出的结果是片段的,不是全部的,会有类似截断导致结果异常,所以需要进行ur编码。

属性赋值的三种方法:

  1. 直接在属性中赋值:优点是方便,缺点是只能赋值字符串
<?phpClasS DEMO{
public $func='evi1';
public $arg='phpinfo();';
# public function safe(){
# echo $this->arg;
# }
# public function evil(){	
# eval($this->arg);
#}
# public function run(){
# $this->{$this->func}();
# }
#function_construct(){
# $this->func ='evil]':
# }
}
# $obj=unserialize($_GET['a']);
# $obj->run();
echo(urlencode(serialize(new DEMO())));
?>

2.外部赋值:优点是可以赋值任意类型的值,缺点是只能操作public属性。

<?php
Class DEMO{
public $func;
public $arg ;
}
$o = neW DEMO();
$o->func ='evil';
$o->arg ='phpinfo();';
echo(urlencode(serialize($o)));

3.构造方法赋值(万能方法):优点是解决了上述的全部缺点,缺点是有点麻烦

<?phpClass DEMO{
public $func;
public $arg ;
function_construct(){
$this->func ='evil';
$this->arg='phpinfo();';
}
}
$o = new DEMO();
echo(urlencode(serialize($o)));

魔术方法

魔术方法是一种特殊的方法,在某些情况下会自动调用。魔术方法的命名是以两个下划线开头的,常见

的魔术方法有:

漏洞利用

此处以pikachu为例

输入一个正常的序列化数据O:1:"S":1:{s:4:"test";s:7:"pikachu";}

输入构造好的xss

O:1:"S":1:{s:4:"test";s:30:"<script>alert('11')</script>";}

成功弹框

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

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

相关文章

SpringAOP从入门到源码分析大全(四)SpringAOP的源码分析

文章目录 系列文档索引六、EnableAspectJAutoProxy源码分析1、AnnotationAwareAspectJAutoProxyCreator源码&#xff08;1&#xff09;wrapIfNecessary方法&#xff08;2&#xff09;createProxy 2、getAdvicesAndAdvisorsForBean查找所有Advisor&#xff08;1&#xff09;find…

深入理解CAS机制-基础使用与三大问题

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 1. 前言 2. 原子性问题 3. 乐观锁与悲观锁 4. CAS操作 5. CAS算法带来的三大…

Dynamic Wallpaper for Mac激活版:视频动态壁纸软件

Dynamic Wallpaper for Mac 是一款为Mac电脑量身打造的视频动态壁纸应用&#xff0c;为您的桌面带来无限生机和创意。这款应用提供了丰富多样的视频壁纸选择&#xff0c;涵盖了自然风景、抽象艺术、科幻奇观等多种主题&#xff0c;让您的桌面成为一幅活生生的艺术画作。 Dynami…

【教程】MySQL数据库学习笔记(五)——约束(持续更新)

写在前面&#xff1a; 如果文章对你有帮助&#xff0c;记得点赞关注加收藏一波&#xff0c;利于以后需要的时候复习&#xff0c;多谢支持&#xff01; 【MySQL数据库学习】系列文章 第一章 《认识与环境搭建》 第二章 《数据类型》 第三章 《数据定义语言DDL》 第四章 《数据操…

Linux基本命令之正则表达式(转义字符)

一&#xff1a;查看二进制文件 strings 命令&#xff1a;strings 文件名 生成链接文件 ln 命令&#xff1a;ln 选项 源文件(f1) 链接文件&#xff08;f2&#xff09; 软连接&#xff1a;eg:ln -s f1 f2 软链接不能跨分区链接&#xff0c;但可以在同一分区的不同目录下链接…

go+react实现远程vCenter虚拟机管理终端

文章目录 React-VcenterDemoQuick Start React-Vcenter 基于go & react实现远程vSphere vcenter虚拟机终端console页面&#xff0c;提供与vcenter管理中的Launch Web Console相同的功能。 项目地址&#xff1a;react-vcenter Demo URL: http://localhost:3000 Quick St…

3-氨基苯硼酸接枝的透明质酸(HA-PBA)和聚乙烯醇(PVA )水凝胶负载胶束和药物

3-氨基苯硼酸接枝的透明质酸&#xff08;HA-PBA&#xff09;和聚乙烯醇&#xff08;PVA &#xff09;水凝胶负载胶束和药物 苯硼酸酯交联形成水凝胶的步骤&#xff1a; HA-PBA的制备&#xff1a;首先&#xff0c;3-氨基苯硼酸通过与透明质酸&#xff08;HA&#xff09;中的羧基…

Selenium web自动化测试环境搭建

Selenium web自动化环境搭建主要要经历以下几个步骤&#xff1a; 1、安装python 在python官网&#xff1a;Welcome to Python.org&#xff0c;根据各自对应平台如&#xff1a;windows&#xff0c;下载相应的python版本。 ​ 下载成功后&#xff0c;点击安装包&#xff0c;一直…

数据结构10:堆和堆排序

文章目录 树的概念及结构树的概念树的相关概念树的表示树在实际中的应用表示文件系统的目录树结构 二叉树概念及结构概念特殊的二叉树二叉树的性质二叉树的存储结构顺序存储链式存储 二叉树的顺序结构及实现二叉树的顺序结构堆的概念及结构 堆的实现堆的插入堆的删除堆的创建向…

【数据结构】08排序

08 排序 1. 冒泡排序&#xff08;BubbleSort&#xff09;1.1 循环嵌套实现1.2 递归实现 2. 选择排序2.1 嵌套循环实现2.2 递归实现 3. 插入排序4. 希尔排序4.1 代码实现 5. 快速排序5.1 代码实现6. 归并排序6.1 递归实现6.2 循环实现 7. 堆排序7.1 构建大顶堆7.2 堆排序7.3 代码…

春秋云镜 CVE-2023-51048

靶标介绍&#xff1a; S-CMS v5.0 被发现存在SQLI。 开启靶场 根据题目查找S-CMS v5.0漏洞&#xff0c;百度没有查询到&#xff0c;使用必应搜索S-CMS v5.0 查找到githubCVE-2023-51052的描述 S-CMS v5.0 was discovered to contain a SQL injection... CVE-2023-51052 Git…

达梦数据库的AWR报告

达梦数据库的AWR报告 数据库快照是一个只读的静态的数据库。 DM 快照功能是基于数据库实现的&#xff0c;每个快照是基于数据库的只读镜像。通过检索快照&#xff0c;可以获取源数据库在快照创建时间点的相关数据信息。 为了方便管理自动工作集负载信息库 AWR&#xff08;Auto…

C++修炼之路之多态---多态的原理(虚函数表)

目录 一&#xff1a;多态的原理 1.虚函数表 2.原理分析 3.对于虚表存在哪里的探讨 4.对于是不是所有的虚函数都要存进虚函数表的探讨 二&#xff1a;多继承中的虚函数表 三&#xff1a;常见的问答题 接下来的日子会顺顺利利&#xff0c;万事胜意&#xff0c;生活明朗--…

Vue3+TS版本Uniapp:封装uni.request请求配置

作者&#xff1a;前端小王hs 阿里云社区博客专家/清华大学出版社签约作者✍/CSDN百万访问博主/B站千粉前端up主 封装请求配置项 封装拦截器封装uni.request 封装拦截器 uniapp的封装逻辑不同于Vue3项目中直接使用axios.create()方法创建实例&#xff08;在create方法中写入请求…

【探讨】RocketMQ消息灰度方案-消息逻辑隔离

vivo 鲁班平台 RocketMQ 消息灰度方案 - 稀土掘金分布式- vivo鲁班RocketMQ平台的消息灰度方案MQ消息在生产环境和灰度环境隔离一般怎么实现?消息隔离的原则 中心正常消费者,可以同时消费正常的消息和特定标签的消息(自动识别);特定标签的消费者,只能消费特定标签的消息。灰…

内存管理下及模板初阶

嗨喽&#xff0c;今天阿鑫给大家带来内存管理下以及模板初阶的博客&#xff0c;下面让我们开始今天的学习吧&#xff01; 内存管理下及模板初阶 new和delete的实现原理定位new表达式(placement-new)常见面试题泛型编程函数模板类模板 1. new和delete的实现原理 1.1 内置类型…

用全连接对手写数字识别案例(附解决TensorFlow2.x没有examples问题)

数据集介绍 数据集直接调用可能出现问题&#xff0c;建议从官网直接下载下来&#xff0c;下载存在这四个文件 手写数字识别数据集下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1nqhP4yPNcqefKYs91jp9ng?pwdxe1h 提取码&#xff1a;xe1h 55000行训练数据集&a…

【树莓派Linux内核开发】入门实操篇(虚拟机Ubuntu环境搭建+内核源码获取与配置+内核交叉编译+内核镜像挂载)

【树莓派Linux内核开发】入门实操篇&#xff08;虚拟机Ubuntu环境搭建内核源码获取与配置内核交叉编译内核镜像挂载&#xff09; 文章目录 【树莓派Linux内核开发】入门实操篇&#xff08;虚拟机Ubuntu环境搭建内核源码获取与配置内核交叉编译内核镜像挂载&#xff09;一、搭建…

判断完数(C语言)

一、N-S流程图&#xff1b; 二、运行结果&#xff1b; 三、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int n 0;int i 1;int j 0;int result 1;//提示用户&#xff1b;printf("请输入一个…

目标检测网络YOLO进化之旅

yolo系列网络在目标检测领域取得了巨大的成功&#xff0c; 尤其是在工程实践中&#xff0c; 以其出色的性能优势获得了广泛的应用落地。 YOLO的前3个版本是由同一个作者团队出品&#xff0c; 算是官方版本。 之后的版本都是各个研究团队自己改进的版本&#xff0c; 之间并无明…