面相小白的php反序列化漏洞原理剖析
前言
欢迎来到我的博客
个人主页:北岭敲键盘的荒漠猫-CSDN博客
本文整理反序列化漏洞的一些成因原理
建议学习反序列化之前
先对php基础语法与面向对象有个大体的了解
(我觉得我整理的比较细致,了解这俩是个啥就行)

漏洞实战情况
这个漏洞黑盒几乎不会被发现,除非极少数个别特别奇葩离谱少见,或者有内鬼作祟,明摆着告诉你这里有个漏洞,你来打我的情况。
大多数是白盒审计得出。
序列化与反序列化概念
需求分析
这里假设我们有一个类对象,我们想要引用可以直接用文件导入。
但是假设我们想要传输这个类对象给其他主机。
我们不可能把整个类的代码都给复制然后发送。
这个时候就需要把他们转化为一种更能方便传输的形式。
这个过程成为序列化。
反序列化则是把序列的产物重新变为类对象
序列化
函数:
serialize()
序列化后的产物模式:

代码演示
<?php
class student{public $name="joker";private $age=11;public function sayhello(){echo "hellohello";}
}$a=new student();
$b=serialize($a);
echo $b;
?>
结果如下:

反序列化
函数:
unserialize()
他就是反过来,能够把序列化的字符串转化为类对象可供使用。
代码演示
<?php
class student{public $name="joker";private $age=11;public function sayhello(){echo "hellohello";}
}$a=new student();
$b=serialize($a);
$c=unserialize($b);
$c->sayhello();
?>
结果如下:

反序列化漏洞的成因与复现
原理分析
目标执行类中本不能执行的eval等危险函数。
反序列化可以覆盖原本的变量值,所以可以帮住我们运行本不应该被运行的区域。
自拟案例演示
以下为一串代码。
<?php
class student{public $name="joker";public $age=11;public function runeval(){echo $this->age; //输出为19if ($this->age >= 18){system("ipconfig"); //原本不能执行的区域被执行}}
}$b=$_GET["x"];
$c=unserialize($b);
$c->runeval();
?>
代码解析
get传递一个x参数,然后把他反序列化,之后运行runeval方法。
类中,有name,age属性,以及一个方法。
方法输出age的值,并且当age>=18的时候就会执行
system
而朋友,system是个高危函数,这里是固定的ipconfig,如果这个参数可控,那么就是一个大漏洞。
但是age明显固定是11啊,根本不会执行system。这里就轮到反序列化漏洞登场。
漏洞利用过程
我们新建一个php文件
把上面类的php代码全复制过来。
<?php
class student{public $name="joker";public $age=11;public function runeval(){echo $this->age; //输出为19if ($this->age >= 18){system("ipconfig"); //原本不能执行的区域被执行}}
}$b=new student;$c=serialize($b);echo $c;
?>
接下来删减代码,仅保留我们要更改的地方
要尽量的减少对原代码运行的影响,防止功能错乱。
这里我们只需要改一个age属性值,让他能过检查即可,那么把age留下其余的全部删除
<?php
class student{public $age=19;
}$b=new student;$c=serialize($b);echo $c;
?>
然后下面给他序列化输出一下。

把这串序列化字符串作为x传入原先的地方。

这里对比一下源代码
<?php
class student{public $name="joker";public $age=11;public function runeval(){echo $this->age; //输出为19if ($this->age >= 18){system("ipconfig"); //原本不能执行的区域被执行}}
}$b=$_GET["x"];
$c=unserialize($b);
$c->runeval();
?>
runeval函数中输出age的地方输出了19
也就是说我们覆盖了原先的11
并且过了检查执行了system。
现在我们试想一下真实场景。
假如这个age是判断你是不是vlp呢?
这样能不能绕过?
对吧,这个就是反序列化漏洞的一个基础的攻击形式。
反序列化进阶操作
在开发中几乎一定会用一些构造方法,类中实例化其他类对象的操作。
而这些操作让我们有更大的操作空间,让这个实例化跟打内网一样在类中各种横向移动建立隧道。
构造方法玩法
开发中几乎类都会执行一些构造方法。
构造方法的特点就是实例化的时候直接执行!!!!
没错直接执行!!!
具体的魔术方法以及作用参考我的这篇文章(太多了。。。)
(有php面向对象基础的可以直接看下面,没有的话先仔细看这个魔术方法,不然看不懂下面是啥)
php反序列化常见魔术方法整理-CSDN博客
看我们之前的代码
<?php
class student{public $name="joker";public $age=11;public function runeval(){echo $this->age; //输出为19if ($this->age >= 18){system("ipconfig"); //原本不能执行的区域被执行}}
}$b=$_GET["x"];
$c=unserialize($b);
$c->runeval();
?>
看下面类对象的实例化。
我们是直接传入然后手动执行了runeval。
但是如果不执行的话,那不就是一点办法没有了嘛。
所以如果他有构造方法,构造方法就会在反序列化的时候自动执行。
大大提升了我们的可玩性!!
看这个代码
<?php
class student{public $name="joker";public $age=11;public function __destruct(){echo "aa";echo $this->age; //输出为19if ($this->age >= 18){system("ipconfig"); //原本不能执行的区域被执行}}}$b=$_GET["x"];
$c=unserialize($b);
?>
仅仅进行了反序列化,并没有执行方法,但是类中有一个构造方法。
这个方法会在类结束的时候自动执行,所以不好意思,上一个payload依旧秒掉。
(注意一下实例化加个(),我上面给忘了。。。)
<?php
class student{public $age=19;
}$b=new student();$c=serialize($b);echo $c;
?>

pop链类跳跃
看下面代码
<?php
class student1{public $name="joker";public $age=11;public function getip(){echo system("ipconfig");}
}class student2{public $name;public $age;public function __toString(){echo "runing";$this->name->{$this->age}();
}
}$b=$_GET["x"];
$c=unserialize($b);
echo $c;
?>
这里有两个类,仅仅靠源代码,他们毫无关联。
很明显system在student1中
然而getip方法显然是没有被执行的。
student2有toString的方法,如果类对象被当做字符串处理则会执行。
而下面那个echo明显作为了字符串,所以能够执行toString。
然后里面的
$this->name->{$this->age}();
两个属性值都能够被反序列化恶意更改让他实例化为student1并执行函数。
所以
<?php
class student1{
}class student2{public $name;public $age="getip";
}$c=new student2();$z=new student1();$c->name=$z;$d=serialize($c);echo $d;
?>

结语
看到这应该就会了解php反序列化漏洞的一个工作原理了。
但还是老规矩绕过策略与特殊玩法写在别的博客中。
别问我为毛老说写一个完整体系结果又写别的去了。。。
因为我写的过程中遇到一个点攻不破我就想摆烂了。
相关文章:
面相小白的php反序列化漏洞原理剖析
前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文整理反序列化漏洞的一些成因原理 建议学习反序列化之前 先对php基础语法与面向对象有个大体的了解 (我觉得我整理的比较细致,了解这俩是个啥就行) 漏洞实战情况 这个漏洞黑盒几乎不会被发现&am…...
文本转SQL(Text-to-SQL),场景介绍与 Spring AI 实现
在众多的 AI 大模型的应用场景中,Text-to-SQL,也就是文本转 SQL,是其中实用性很高的一个。Text-to-SQL 充分利用了大模型的优势,把用户提供的自然语言描述转换成 SQL 语句,还可以执行生成的 SQL 语句,再把查…...
科研绘图系列:R语言组合堆积图(stacked plot)
文章目录 介绍加载R包数据数据预处理画图1画图2组合图形系统信息介绍 堆积图(Stacked Chart),也称为堆叠图,是一种常用的数据可视化图表,主要用于展示不同类别的数据量在总体中的分布情况。堆积图可以是柱状图、条形图或面积图的形式,其中各个类别的数据量被叠加在一起,…...
YOLOv11及自研模型更新汇总
YOLOv11使用教程:YOLOv11入门到入土使用教程(含结构图) 缝合教程:深度学习模块创作(缝合)教程|适合1-360月小宝宝食用,干货满满 YOLO中的yaml文件详解:https://xy2668825911.blog.csdn.net/article/details…...
系统安全架构
一个完整的信息安全系统至少包含三类措施: 技术方面的安全措施, 管理方面的安全措施 相应的政策法律。 网络安全威胁 授权侵犯:为某一特权使用一个系统的人却将该系统用作其他未授权的目的。假冒:一个实体(人或系统)假装成另一个实体非法…...
Qt(程序打包)
Qt开发的程序最终都是要给用户使用的,用户的电脑上不可能装一个Qt的开发环境导入项目使用。因此项目项目开发完成后需要打包——制作成安装包,用户直接下载并安装即可使用。 1. 设置图标 设置图标的操作步骤如下: 1. 准备好图标文件ÿ…...
牛客sql题目总结(1)
1.第N高的薪水 AC: create function getnthhighestsalary(n int) returns int begindeclare m int; set m n - 1; return (select distinct salaryfrom employeeorder by salary desclimit m, 1); end 2.平均播放进度大于60%的视频类别 AC: select tb_video_info…...
RocketMQ 自动注入消费者
目录 前言一、情景介绍二、问题分析三、代码实现 前言 之前接到一个需求,我们项目的技术负责人希望通过配置的形式,在项目启动的时候自动根据配置生成对应的消费者 觉得还有点意思,随即记录一下~ 一、情景介绍 比如我这里有一个消费者 Mes…...
RibbitMQ-安装
本文主要介绍RibbitMQ的安装 RabbitMQ依赖于Erlang,因此首先需要安装Erlang环境。分别下载erlang-26.2.5-1.el7.x86_64.rpm、rabbitmq-server-4.0.3-1.el8.noarch.rpm 官网地址:https://www.rabbitmq.com/ 官网文档:https://www.rabbitmq.c…...
非计算机背景但是想从事医学AI研究,需要掌握的编程语言|个人观点·24-11-08
小罗碎碎念 目前,我们从事医学AI研究的,接触的最多的两种编程语言应该就是R和Python了。那么初学者很容易提出一个疑问,**我想从事医学AI相关的研究的话,应该学哪些编程语言呢?**在文章的开头,我可以先给出…...
内置函数【MySQL】
文章目录 日期函数字符串函数数学函数其他函数 日期函数 current_date函数用于获取当前的日期 mysql> select current_date(); ---------------- | current_date() | ---------------- | 2024-11-03 | ---------------- 1 row in set (0.00 sec)current_time函数用于获…...
RNA-seq 差异分析的点点滴滴(1)
引言 本系列[1])将开展全新的转录组分析专栏,主要针对使用DESeq2时可能出现的问题和方法进行展开。 为何使用未经标准化的计数数据? DESeq2 工具包在接收输入时,期望得到的是未经处理的原始计数数据,比如从 RNA-seq 或其他高通量测…...
Windows10/11开启卓越性能模式 windows开启卓越性能电源模式 工作电脑开启卓越性能模式 电脑开启性能模式
Windows10/11开启卓越性能模式 windows开启卓越性能电源模式 工作电脑开启卓越性能模式 电脑开启性能模式 1、所要用到的激活工具2、开启电脑卓越性能模式Windows11Windows10在电源模式中选择卓越性能模式 3、将系统版本切换为 工作站版本 1、所要用到的激活工具 KMS激活工具(…...
day20-21之间的项目实战:若依ruoyi开发(可以跳过)
一,项目概述 官网文档地址:http://doc.ruoyi.vip/ rouyi是一个后台管理系统,基于经典技术组合(spring boot,apache shiro,mybatis,thymeleaf)主要是让开发者注重专注业务࿰…...
双向链表及如何使用GLib的GList实现双向链表
双向链表是一种比单向链表更为灵活的数据结构,与单向链表相比可以有更多的应用场景,本文讨论双向链表的基本概念及实现方法,并着重介绍使用GLib的GList实现单向链表的方法及步骤,本文给出了多个实际范例源代码,旨在帮助…...
ProCalun卡伦纯天然万用膏,全家的皮肤健康守护
受季节交替、生活环境变化、空气污染等方面因素的影响,加上作息不规律导致的免疫力降低,我们或多或少会出现一些如湿疹、痤疮、瘙痒之类的皮肤问题,且反复概率很高。很多人盲目用药,甚至诱发激素依赖性皮炎。所以近年来࿰…...
FastAPI全方位分析:优劣尽显
近年来,随着技术的飞速发展,快速构建高性能API的需求越来越强烈。Python作为一个广泛使用的编程语言,也在这一领域下涌现出了许多优秀的框架。FastAPI便是其中一颗璀璨的新星。 FastAPI以其卓越的性能和独特的功能吸引了众多开发者。本文将深入剖析FastAPI的各个方面,详细…...
【rust】rust基础代码案例
文章目录 代码篇HelloWorld斐波那契数列计算表达式(加减乘除)web接口 优化篇target/目录占用一个g,仅仅一个actix的helloWorld demo升级rust版本, 通过rustupcargo换源windows下放弃吧,需要额外安装1g的toolchain并且要…...
【深度学习】PromptFix:多功能AI修图
PromptFix:你来提示,我们修图 NeurIPS 2024 最近,在计算机视觉和图像处理领域,一个名为PromptFix的新项目引起了广泛关注。PromptFix是一个基于PyTorch实现的开源项目,旨在根据用户的自然语言指令,对受损或需要处理的图像进行智能修复和优化。 本文将详细介绍PromptFix…...
2024最新AI绘画系统软件(Midjourney)+GPT4文档分析总结,多模态识图理解,AI文生图/图生图/混图生图(图像混合)
一、前言 人工智能的快速发展已成为全球关注的焦点,其应用领域广泛,涵盖绘图、语言处理、视频编辑等。前沿技术不仅推动科技创新,还在艺术创作、内容生产和商业实践等方面展示出巨大潜力。例如,AI语言模型显著提升了内容自动生成、…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
sshd代码修改banner
sshd服务连接之后会收到字符串: SSH-2.0-OpenSSH_9.5 容易被hacker识别此服务为sshd服务。 是否可以通过修改此banner达到让人无法识别此服务的目的呢? 不能。因为这是写的SSH的协议中的。 也就是协议规定了banner必须这么写。 SSH- 开头,…...
【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解
一、前言 在HarmonyOS 5的应用开发模型中,featureAbility是旧版FA模型(Feature Ability)的用法,Stage模型已采用全新的应用架构,推荐使用组件化的上下文获取方式,而非依赖featureAbility。 FA大概是API7之…...

