反序列化漏洞分析讲解,零基础入门到精通,收藏这篇就够了
一、什么是反序列化1.1 漏洞简介PHP反序列化漏洞也叫PHP对象注入是一个非常常见的漏洞这种类型的漏洞虽然有些难以利用但一旦利用成功就会造成非常危险的后果。漏洞的形成的根本原因是程序没有对用户输入的反序列化字符串进行检测导致反序列化过程可以被恶意控制进而造成代码执行、getshell等一系列不可控的后果。反序列化漏洞并不是PHP特有也存在于Java、Python等语言之中但其原理基本相通。1.2反序列化函数在我们讲PHP反序列化的时候基本都是围绕着serialize()**unserialize()**这两个函数。那么什么是序列化呢序列化说通俗点就是把一个对象变成可以传输的字符串。举个例子不知道大家知不知道json格式这就是一种序列化有可能就是通过array序列化而来的。而反序列化就是把那串可以传输的字符串再变回对象。直接上例子便于理解我们先讲一讲比较简单的序列化我们就用序列化json来举例子吧。虽然序列化Json和我们讲PHP反序列化的漏洞没有什么关系。但是在理解序列化这个概念和之后的内容会有所帮助json_encode()json_decode()这两个函数一眼就能看出来是做什么用的吧直接上例子?php $book array(book1Harry Potter, book2MR.Bean, book3History); $json json_encode($book); echo $json; ?这边有一个book的数组‘book1’‘Harry Potter’,‘book2’‘MR.Bean’,‘Book3’‘Python Cookbook’,‘Book4’‘History’如果我们想传输这个数组怎么办呢我们就可以请json_encode()这个函数帮助我们将这个数组序列化成一串字符串所以在这里我们将数组序列化成json格式的字串的目的就是为了方便传输。我们可以看见这里json格式来保存数据主要是使用键值对的形式。假设我们写了一个class这个class里面存有一些变量。当这个class被实例化了之后在使用过程中里面的一些变量值发生了改变。以后在某些时候还会用到这个变量如果我们让这个class一直不销毁等着下一次要用它的时候再一次被调用的话浪费系统资源。当我们写一个小型的项目可能没有太大的影响但是随着项目的壮大一些小问题被放大了之后就会产生很多麻烦。这个时候PHP就和我们说你可以把这个对象序列化了存成一个字符串当你要用的时候再放他出来就好了。?php class DemoClass { public $name sms2056; public $sex man; public $age 7; } $example new DemoClass(); $example-name jone; $example-sex woman; $example-age 18; ?这里我们先创了个DemoClass里面存了点信息后来我们new了一个实例$example的时候将这个class里的一些信息给改变了。如果我们之后还要用到这个实例怎么办呢我们就先将他序列化存起来到时候用的时候再放出来就好啦。是不是很简单只要用serialize()这个函数就行了?php class DemoClass { public $name sms2056; public $sex man; public $age 7; } $example new DemoClass(); $example-name jone; $example-sex woman; $example-age 18; echo serialize($example); ?这个时候我们发现这次序列化出来的格式和我们上一个序列化json的格式有点不同呢解释一下然后如果反序列化回来的话?php class DemoClass { public $name sms2056; public $sex man; public $age 7; } $example new DemoClass(); $example-name jone; $example-sex woman; $example-age 18; $val serialize($example); $NewExample unserialize($val); echo $NewExample-age; ?二. 为什么会产生漏洞那么问题来了这么序列化一下然后反序列化为什么就能产生漏洞了呢这个时候我们就要了解一下PHP里面的魔术方法了魔法函数一般是以__开头通常会因为某些条件而触发不用我们手动调用在研究反序列化漏洞的时候碰见这几个魔法函数就要仔细研究研究了__construct()当一个对象创建时被调用 __destruct()当一个对象销毁时被调用 __toString()当一个对象被当作一个字符串使用 __sleep() 在对象在被序列化之前运行 __wakeup将在序列化之后立即被调用这些就是我们要关注的几个魔术方法了如果服务器能够接收我们反序列化过的字符串、并且未经过滤的把其中的变量直接放进这些魔术方法里面的话就容易造成很严重的漏洞了。举个别人的例子?php class A{ var $test demo; function __destruct(){ echo $this-test; } } $a $_GET[test]; $a_unser unserialize($a); ?这里我们只要构造payloadhttp://127.0.0.1/test.php?testO:1:“A”:1:{s:4:“test”;s:5:“hello”;}就能控制echo出的变量比如你能拿这个来进行反射型xss。三、 实例分析这里实战一题比较简单的ctf题目吧?php require_once(shield.php); $x new Shield(); isset($_GET[class]) $g $_GET[class]; if (!empty($g)) { $x unserialize($g); } echo $x-readfile(); ?可以看见 先是包含了shield.php 然后从中new了个新的实例出来 最后接收用户的反序列化 输出readfile()方法跟进?php //flag is in pctf.php class Shield { public $file; function __construct($filename ) { $this - file $filename; } function readfile() { if (!empty($this-file) stripos($this-file,..)FALSE stripos($this-file,/)FALSE stripos($this-file,\\)FALSE) { return file_get_contents($this-file); } } } ?这里我们可以看见只要操控$file这个参数为pctf.php就可以了这里construct函数在实例被创建的时候(也就是new Shield()的时候)执行所以不会影响我们对$file的操作直接构造序列化对象传过去 O:6:“Shield”:1:{s:4:“file”;s:8:“pctf.php”;} 就行了。四、反序列漏洞的利用思路在反序列化中,我们所能控制的数据就是对象中的各个属性值,所以在PHP的反序列化有一种漏洞利用方法叫做 “面向属性编程” ,即 POP( Property Oriented Programming)。和二进制漏洞中常用的ROP技术类似。在ROP中我们往往需要一段初始化gadgets来开始我们的整个利用过程,然后继续调用其他gadgets。在PHP反序列化漏洞利用技术POP中,对应的初始化gadgets就是__wakeup() 或者是__destruct() 方法, 在最理想的情况下能够实现漏洞利用的点就在这两个函数中,但往往我们需要从这个函数开始,逐步的跟进在这个函数中调用到的所有函数,直至找到可以利用的点为止。下面列举些在跟进其函数调用过程中需要关注一些很有价值的函数。如果在跟进程序过程中发现这些函数就要打起精神,一旦这些函数的参数我们能够控制,就有可能出现高危漏洞.五、现实中查找反序列化漏洞的方法PHP的 unserialize() 函数只能反序列化在当前程序上下文中已经被定义过的类.在传统的PHP中你需要通过使用一大串的include() 或者 require()来包含所需的类定义文件。于是后来出现了 autoloading 技术,他可以自动导入需要使用的类,再也不需要程序员不断地复制粘贴 那些include代码了。这种技术同时也方便了我们的漏洞利用.因为在我们找到一个反序列化点的时候我们所能使用的类就多了,那么实现漏洞利用的可能性也就更加高。还有一个东西要提一下,那就是Composer,这是一个php的包管理工具,同时他还能自动导入所以依赖库中定义的类。这样一来 unserialize() 函数也就能使用所有依赖库中的类了,攻击面又增大不少。1.Composer配置的依赖库存储在vendor目录下2.如果要使用Composer的自动类加载机制,只需要在php文件的开头加上require __DIR__ . /vendor/autoload.php;找PHP链的基本思路.1.在各大流行的包中搜索 __wakeup() 和 __destruct() 函数.2.追踪调用过程3.手工构造 并验证 POP 链4.开发一个应用使用该库和自动加载机制,来测试exploit.构造exploit的思路1.寻找可能存在漏洞的应用2.在他所使用的库中寻找 POP gadgets3.在虚拟机中安装这些库,将找到的POP链对象序列化,在反序列化测试payload4.将序列化之后的payload发送到有漏洞web应用中进行测试.六、参考其它不错的PHP反序列化文章链接1、最通俗易懂的PHP反序列化原理分析https://www.freebuf.com/articles/web/167721.html2、由Typecho 深入理解PHP反序列化漏洞https://www.freebuf.com/column/161798.html3、Typecho install.php 反序列化导致任意代码执行https://p0sec.net/index.php/archives/114/4、HP反序列化漏洞成因及漏洞挖掘技巧与案例https://www.anquanke.com/post/id/84922学习资源如果你是也准备转行学习网络安全黑客或者正在学习这里开源一份360智榜样学习中心独家出品《网络攻防知识库》,希望能够帮助到你知识库由360智榜样学习中心独家打造出品旨在帮助网络安全从业者或兴趣爱好者零基础快速入门提升实战能力熟练掌握基础攻防到深度对抗。1、知识库价值深度 本知识库超越常规工具手册深入剖析攻击技术的底层原理与高级防御策略并对业内挑战巨大的APT攻击链分析、隐蔽信道建立等提供了独到的技术视角和实战验证过的对抗方案。广度 面向企业安全建设的核心场景渗透测试、红蓝对抗、威胁狩猎、应急响应、安全运营本知识库覆盖了从攻击发起、路径突破、权限维持、横向移动到防御检测、响应处置、溯源反制的全生命周期关键节点是应对复杂攻防挑战的实用指南。实战性 知识库内容源于真实攻防对抗和大型演练实践通过详尽的攻击复现案例、防御配置实例、自动化脚本代码来传递核心思路与落地方法。2、 部分核心内容展示360智榜样学习中心独家《网络攻防知识库》采用由浅入深、攻防结合的讲述方式既夯实基础技能更深入高阶对抗技术。360智榜样学习中心独家《网络攻防知识库》采用由浅入深、攻防结合的讲述方式既夯实基础技能更深入高阶对抗技术。内容组织紧密结合攻防场景辅以大量真实环境复现案例、自动化工具脚本及配置解析。通过策略讲解、原理剖析、实战演示相结合是你学习过程中好帮手。1、网络安全意识2、Linux操作系统3、WEB架构基础与HTTP协议4、Web渗透测试5、渗透测试案例分享6、渗透测试实战技巧7、攻防对战实战8、CTF之MISC实战讲解3、适合学习的人群‌一、基础适配人群‌‌零基础转型者‌适合计算机零基础但愿意系统学习的人群资料覆盖从网络协议、操作系统到渗透测试的完整知识链‌‌开发/运维人员‌具备编程或运维基础者可通过资料快速掌握安全防护与漏洞修复技能实现职业方向拓展‌或者转行就业‌应届毕业生‌计算机相关专业学生可通过资料构建完整的网络安全知识体系缩短企业用人适应期‌‌二、能力提升适配‌1、‌技术爱好者‌适合对攻防技术有强烈兴趣希望掌握漏洞挖掘、渗透测试等实战技能的学习者‌2、安全从业者‌帮助初级安全工程师系统化提升Web安全、逆向工程等专项能力‌3、‌合规需求者‌包含等保规范、安全策略制定等内容适合需要应对合规审计的企业人员‌因篇幅有限仅展示部分资料完整版的网络安全学习资料已经上传CSDN朋友们如果需要可以在下方CSDN官方认证二维码免费领取【保证100%免费】

相关新闻

全栈开发的演变:从LAMP到MEAN再到现代JavaScript

全栈开发的演变:从LAMP到MEAN再到现代JavaScript

全栈开发者概述在众多企业中,尤其是创业型公司,人力资源部门在招聘时常常渴望能够找到一位技术上的多面手,即全栈开发者。那么,究竟什么是全栈开发者,他们需要掌握哪些核心技能呢?◆ 定义与技能要求传统上&…

2026/7/3 6:35:59 阅读更多 →
【python使用DrissionPage如何关闭浏览器

【python使用DrissionPage如何关闭浏览器

在DrissionPage中关闭浏览器主要通过调用close()方法实现,具体操作取决于浏览器控制方式(如Selenium模式或无头模式)。以下是详细步骤和示例代码: 1. 基本关闭方法 from DrissionPage import ChromiumPage# 创建页面对象&#xff…

2026/5/17 6:48:24 阅读更多 →
直接上结论:更贴合本科生需求的AI论文工具,千笔·专业学术智能体 VS 灵感ai

直接上结论:更贴合本科生需求的AI论文工具,千笔·专业学术智能体 VS 灵感ai

随着人工智能技术的迅猛迭代与普及,AI辅助写作工具已逐步渗透到高校学术写作场景中,成为本科生完成毕业论文不可或缺的智能助手。越来越多的学生开始依赖这类工具简化写作流程、提升创作效率,但与此同时,市场上涌现的AI写作工具功…

2026/5/17 3:00:39 阅读更多 →

最新新闻

为什么我们需要SDD(规格驱动开发)

为什么我们需要SDD(规格驱动开发)

输入“使用 FastAPI 在 Python 中创建一个登录接口。”改一下提示词:“使用JWT”。想了想,再输入:“数据存储到MySQL”。如此来回折腾数次之后,满心欢喜的交付给测试。这就是Vibe Coding,你和大模型进行对话&#xff0…

2026/7/6 4:10:16 阅读更多 →
Java3:Java运算符详解:编程世界的加减乘除

Java3:Java运算符详解:编程世界的加减乘除

目录 写在前面 一、运算符是什么? 二、算术运算符:最基础的数学工具 2.1 基本四则运算: - * / % 2.2 增量运算符: - * / % 2.3 自增/自减运算符: -- 三、关系运算符:比较大小的利器 四、逻辑运算符&…

2026/7/6 4:10:16 阅读更多 →
Kubernetes 资源隔离:AI 任务别和核心服务抢饭碗

Kubernetes 资源隔离:AI 任务别和核心服务抢饭碗

Kubernetes 资源隔离:AI 任务别和核心服务抢饭碗 一、AI 任务很容易吃资源 AI 推理、批处理、向量化、模型评测都会消耗 CPU、内存、GPU 和 IO。如果这些任务和核心在线服务混在同一个资源池里,低优先级任务就可能把在线服务挤慢。Kubernetes 提供很多隔…

2026/7/6 4:10:16 阅读更多 →
湿地生态好不好,不能只看绿不绿

湿地生态好不好,不能只看绿不绿

湿地体检不能只看绿不绿:WEI如何读懂黄河三角洲的生态完整性湿地体检不能只看绿不绿:WEI如何读懂黄河三角洲30年生态变化?一、为什么传统生态指数在湿地里会“看走眼”?1. 只看单一指标,容易把复杂湿地看得太简单2. RS…

2026/7/6 4:08:16 阅读更多 →
什么是.NET Compact Framework

什么是.NET Compact Framework

基于.NET Compact Framework开发的程序,可以叫做托管程序,英文叫做Managed code。所谓Managed code就是使用C#,VB.NET语言来编写代码,使用.NET Compact Framework来开发,编译成平台无关的中间语言(Intermediate Lanuage, IL)的文件…

2026/7/6 4:02:14 阅读更多 →
LangChain FewShotPromptTemplate少样本应用实战

LangChain FewShotPromptTemplate少样本应用实战

里有个容易踩的坑:创建 FewShotPromptTemplate 的时候,examples 和 example_selector 这两个参数是互斥的,必须填其中一个,不然代码直接报错。绝大多数情况下,我们直接用 examples 参数把准备好的示例数据传进去就行。…

2026/7/6 4:02:14 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻