当前位置: 首页 > article >正文

网安学习第24天 PHP安全——PHP反序列化

一、序列化与反序列化1、序列化serialize()序列化是什么序列化就是把程序中的对象、数组、结构体等复杂数据转换成可以存储或传输的格式。简单说把“内存里的对象”变成“字符串/字节流”。例如 PHP 中有一个对象$user [ name admin, age 18 ];序列化后可能变成a:2:{s:4:name;s:5:admin;s:3:age;i:18;}其中各个字段代表的含义常见序列化格式包括JSON XML YAML PHP serialize Java Serializable Python pickle2、反序列化unserialize()序列化是什么反序列化就是把序列化后的字符串/字节流还原成程序中的对象或数据结构。简单说把“字符串/字节流”重新变回“内存里的对象”。例如$data a:2:{s:4:name;s:5:admin;s:3:age;i:18;}; $user unserialize($data);反序列化后$user又变成了数组[ name admin, age 18 ]所以序列化与反序列化 的操作可以直观地看作为3\3、为什么反序列化会有漏洞问题核心在于如果程序反序列化了用户可控的数据就可能被攻击者构造恶意对象。危险点不是“反序列化”本身而是反序列化的数据来自用户输入 程序中存在危险的魔术方法/特殊方法 这些方法里有文件操作、命令执行、SQL操作等危险逻辑就可能形成反序列化漏洞。4. PHP 反序列化漏洞例子例如 PHP 中有一个类?php class Test { public $cmd; function __destruct() { system($this-cmd); } } ?这里的__destruct()是魔术方法对象销毁时会自动执行。如果程序这样写$data $_GET[data]; unserialize($data);那么攻击者可以构造一个恶意序列化字符串O:4:Test:1:{s:3:cmd;s:2:id;}反序列化后程序会创建Test对象并且$cmd id。脚本结束时触发__destruct()于是执行system(id);这就可能造成RCE远程命令执行。二、常见的魔术方法__construct(): //当对象new的时候会自动调用__destruct()//当对象被销毁时会被自动调用__sleep(): //serialize()执行时被自动调用__wakeup(): //unserialize()时会被自动调用__invoke(): //当尝试以调用函数的方法调用一个对象时会被自动调用__toString(): //把类当作字符串使用时触发__call(): //调用某个方法,若方法存在,则调用;若不存在,则会去调用__call函数。__callStatic(): //在静态上下文中调用不可访问的方法时触发__get(): //读取对象属性时,若存在,则返回属性值;若不存在则会调用__get函数__set(): //设置对象的属性时,若属性存在,则赋值;若不存在,则调用__set函数。__isset(): //在不可访问的属性上调用isset()或empty()触发__unset(): //在不可访问的属性上使用unset()时触发__set_state()调用var_export()导出类时此静态方法会被调用__clone()当对象复制完成时调用__autoload()尝试加载未定义的类__debugInfo()打印所需调试信息三、反序列化漏洞利用1、POP链POP 链就是 PHP 反序列化漏洞里的“调用链”。全称Property-Oriented Programming Chain面向属性编程链。它的核心是攻击者通过控制反序列化对象的属性让程序自动触发魔术方法然后一步步调用已有代码最后到达危险函数。POP常用于上层语言构造特定调用链的方法序列化攻击都在PHP魔术方法中出现可利用的漏洞因自动调用触发漏洞但如关键代码没在魔术方法中而是在一个类的普通方法中。这时候就可以通过构造POP链寻找相同的函数名将类的属性和敏感函数的属性联系起来。2. POP 链的基本结构一条 POP 链一般有三部分入口点 Trigger ↓ 中间跳板 Gadget ↓ 危险终点 Sink入口点 Trigger一般是魔术方法例如__destruct() __wakeup() __toString()中间跳板 Gadget就是普通业务代码中的方法比如$this-obj-run(); $this-handler-save(); $this-logger-write();这些方法本来可能不是漏洞但可以被攻击者利用来继续调用下一个对象。危险终点 Sink最终危险操作例如system() eval() assert() include() require() file_put_contents() unlink()3. 一个简单例子看这三个类class A { public $b; public function __destruct() { $this-b-run(); } } class B { public $c; public function run() { $this-c-write(); } } class C { public $filename; public $content; public function write() { file_put_contents($this-filename, $this-content); } }单独看A::__destruct() B::run() C::write()都像正常代码。但是如果程序中有unserialize($_COOKIE[user]);攻击者就可能构造对象关系A 对象 └── b B 对象 └── c C 对象 ├── filename 可控文件名 └── content 可控内容执行流程变成unserialize() ↓ 恢复 A 对象 ↓ 脚本结束触发 A::__destruct() ↓ 调用 $this-b-run() ↓ 进入 B::run() ↓ 调用 $this-c-write() ↓ 进入 C::write() ↓ file_put_contents($filename, $content)这就是一条 POP 链。三、属性类型1、对象变量属性public(公共的):在本类内部、外部类、子类都可以访问protect(受保护的):只有本类或子类或父类中可以访问private(私人的):只有本类内部可以使用2、序列化数据显示public属性序列化的时候格式是正常成员名private属性序列化的时候格式是%00类名%00成员名protect属性序列化的时候格式是%00*%00成员名3、例?php header(Content-type: text/html; charsetutf-8); //public private protected说明 class test{ public $namexiaodi; private $age31; protected $sexman; } $anew test(); $aserialize($a); print_r($a); ?输出为O:4:test:3:{s:4:name;s:6:xiaodi;s:9: test age;s:2:31;s:6: * sex;s:3:man;}其中age —— test age sex —— * sex四、漏洞绕过1、__wakeup绕过为什么要绕过__wakeup()因为有些反序列化利用链中__wakeup()会破坏攻击者控制的属性。比如class Test { public $cmd; public function __wakeup() { $this-cmd echo safe; } public function __destruct() { system($this-cmd); } }攻击者本来想控制$cmd id;但是反序列化时会先触发__wakeup()把$cmd改成echo safe这样 POP 链就被破坏了。所以绕过__wakeup()的目的就是让对象恢复出来 但是不执行 __wakeup() 保留攻击者控制的属性 等到 __destruct() 或其他方法触发当属性数量不一致时会绕过__wakeup()正常序列化对象O:4:Test:1:{s:3:cmd;s:2:id;}这里属性数量是1。因为只有一个属性$cmd如果把属性数量故意改大O:4:Test:2:{s:3:cmd;s:2:id;}注意这里属性数量从 1 改成了 2。但实际后面只有一个属性。在部分老版本 PHP 中这种属性数量不一致会导致对象仍然可能被反序列化 但是 __wakeup() 不会被调用于是就达到了绕过效果。2、字符逃逸字符逃逸在 PHP 反序列化里核心意思是原本应该被当成“普通字符串内容”的字符因为长度变化或过滤处理逃出了字符串边界被unserialize()当成了新的序列化结构来解析。它经常出现在serialize() ↓ 字符串过滤 / 替换 ↓ unserialize()这个流程里。参考php反序列化-字符逃逸看这一篇就够了_php 反序列化-CSDN博客五、反序列化链项目1、-NotSoSecurehttps://github.com/NotSoSecure/SerializedPayloadGenerator为了利用反序列化漏洞需要设置不同的工具如 YSoSerial(Java)、YSoSerial.NET、PHPGGC 和它的先决条件。DeserializationHelper 是包含对 YSoSerial(Java)、YSoSerial.Net、PHPGGC 和其他工具的支持的Web界面。使用Web界面您可以为各种框架生成反序列化payload.Java – YSoSerial NET – YSoSerial.NET PHP – PHPGGC Python - 原生2、-PHPGGChttps://github.com/ambionics/phpggcPHPGGC是一个包含unserialize()有效载荷的库以及一个从命令行或以编程方式生成它们的工具。当在您没有代码的网站上遇到反序列化时或者只是在尝试构建漏洞时此工具允许您生成有效负载而无需执行查找小工具并将它们组合的繁琐步骤。 它可以看作是frohoff的ysoserial的等价物但是对于PHP。目前该工具支持的小工具链包括CodeIgniter4、Doctrine、Drupal7、Guzzle、Laravel、Magento、Monolog、Phalcon、Podio、ThinkPHP、Slim、SwiftMailer、Symfony、Wordpress、Yii和ZendFramework等。七、反序列化框架利用-ThinkPHPYiiLaravel通过上述工具构造payload实现反序列化

相关文章:

网安学习第24天 PHP安全——PHP反序列化

一、序列化与反序列化 1、序列化serialize() 序列化是什么?序列化就是把程序中的对象、数组、结构体等复杂数据,转换成可以存储或传输的格式。 简单说: 把“内存里的对象”变成“字符串/字节流”。 例如 PHP 中有一个对象: $u…...

用ESP32-C3的PWM做个RGB呼吸灯吧:从配置结构体到色彩渐变(乐鑫ESP-IDF实战)

ESP32-C3 RGB呼吸灯实战:从PWM配置到色彩渐变算法 当智能家居的灯光不再只是简单的开关控制,而是能像呼吸般自然渐变时,整个空间的氛围立刻变得生动起来。ESP32-C3凭借其出色的LED PWM控制器(LEDC)外设,为开…...

Claude Code用户告别封号与Token焦虑,无缝切换至Taotoken平台

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Claude Code用户告别封号与Token焦虑,无缝切换至Taotoken平台 对于依赖Claude Code进行编程辅助的开发者而言&#xff…...

别再纠结了!给激光焊接新手讲透单模和多模激光到底怎么选(附M²因子解读)

激光焊接设备选型指南:单模与多模激光的实战抉择 当你第一次站在激光焊接设备采购的十字路口,面对"单模"和"多模"这两个专业术语时,那种迷茫感我深有体会。五年前,我作为产线技术负责人,需要为汽车…...

告别Windows卡顿!在VMware里给Kubuntu 22.04 LTS分区和安装的保姆级避坑指南

告别Windows卡顿!在VMware里给Kubuntu 22.04 LTS分区和安装的保姆级避坑指南你是否已经厌倦了Windows系统越来越慢的启动速度、频繁的后台更新和资源占用?当你的电脑开始频繁卡顿,或许该考虑给系统来一次"减负"了。Kubuntu 22.04 L…...

从数据到模型:手把手教你预处理MPIIFaceGaze和EyeDiap数据集(Python实战)

从数据到模型:手把手教你预处理MPIIFaceGaze和EyeDiap数据集(Python实战)当你第一次打开MPIIFaceGaze或EyeDiap数据集的压缩包时,那种面对杂乱文件夹和神秘.mat文件的迷茫感,我太熟悉了。作为计算机视觉工程师&#xf…...

GEP协议深度解读:AI智能体自我进化的基因工程

OpenAI 官宣全面支持MCP协议,标志着AI应用架构的"连接标准"已定。如果说MCP是AI时代的USB-C,解决了模型与工具的连接问题,那么GEP(Genome Evolution Protocol,基因组进化协议)则正在解决另一个更本质的问题——智能体的自我进化与生命周期管理。 作为下一代AI基…...

别再盲调temperature=0.2!DeepSeek补全效果突变的4个隐藏参数,资深架构师压箱底调参清单

更多请点击: https://intelliparadigm.com 第一章:别再盲调temperature0.2!DeepSeek补全效果突变的4个隐藏参数,资深架构师压箱底调参清单 DeepSeek-R1/VL 等开源大模型在实际部署中,仅靠调节 temperature 往往收效甚…...

Claude Agent SDK 从 0 到 1 快速上手教程

Claude Agent SDK 从 0 到 1 快速上手教程 什么是 Claude Agent SDK? Claude Agent SDK 是 Anthropic 官方推出的用于构建 AI 智能体的开发工具包。它基于 Claude Code 构建,让开发者能够以编程方式创建、扩展和定制由 Claude 驱动的应用程序。与简单的聊天机器人不同,基于…...

Noto字体终极指南:告别“豆腐块“,让全球文字清晰显示

Noto字体终极指南:告别"豆腐块",让全球文字清晰显示 【免费下载链接】noto-fonts Noto fonts, except for CJK and emoji 项目地址: https://gitcode.com/gh_mirrors/no/noto-fonts 在数字世界中,你是否经常看到那些令人困…...

Nacos CVE-2021-29441漏洞深度解析:User-Agent绕过与鉴权失效

1. 这个漏洞不是“改个Header就能登录”,而是Nacos鉴权体系的一道裂缝CVE-2021-29441这个编号在Nacos社区里曾被轻描淡写地归为“低危”,直到我接手一个金融客户线上告警——他们的Nacos集群在凌晨三点被批量创建了37个高权限用户,所有操作日…...

保姆级教程:手把手教你为ESXi 6.7配置主板BIOS(VT-x/VT-d/AES全开)

从零开始:ESXi 6.7主板BIOS设置完全指南当你第一次接触企业级虚拟化平台时,那种既兴奋又忐忑的心情我完全理解。作为过来人,我清楚地记得自己第一次为ESXi配置BIOS时的迷茫——那些专业术语像天书一样,生怕设置错误导致服务器无法…...

遭遇薪酬倒挂后的反向谈判与资产重估策略「蒸汽求职分享」

在 2026 年全球科技大厂与跨国泛金融巨头追求极致人效、频繁进行组织架构重组(Reorg)的买方市场中,一个让无数海外名校留学生在入职两年后心态瞬间崩塌的现象,正在高频发生——“薪酬倒挂(Salary Inversion&#xff09…...

保姆级教程:手把手教你搞定ESXi 6.7安装前的BIOS设置(VT-x/VT-d/AES全开)

从零开始:ESXi 6.7安装前的BIOS设置终极指南当你第一次接触企业级虚拟化平台时,那种既兴奋又忐忑的心情我完全理解。作为过来人,我记得自己第一次在Dell PowerEdge服务器上安装ESXi时,光是搞清楚BIOS里那些晦涩的选项就花了整整一…...

大厂校招变了:AI 能力正在进入笔试和面试

最近不少同学投递校招时,应该已经发现一个变化: 以前 JD 里写的是“熟悉 Python / Java / SQL / Office 优先”。 现在越来越多岗位开始出现新的描述: “熟练使用 AI 工具者优先” “了解大模型应用者优先” “具备 AI 辅助编程经验优先” “…...

别再把大模型当搜索框了:一文讲透 LLM 的基本原理、能力边界与局限性

写在前面很多人把大语言模型当成“会聊天的搜索引擎”,结果一上线就遇到幻觉、口径不稳、上下文丢失、成本失控。真正理解 LLM,要先抓住一句话:它是基于 Transformer 的概率生成模型,核心能力来自海量预训练、上下文学习与后训练对…...

CentOS 8/Stream 8系统DNF换源后,安装软件还是慢?试试这几个排查命令和优化技巧

CentOS 8/Stream 8系统DNF换源后安装缓慢的深度排查与优化指南当你已经按照教程将CentOS 8/Stream 8的DNF源切换为国内镜像,却发现软件安装速度依然不尽如人意时,这种体验确实令人沮丧。作为长期使用CentOS系统的技术专家,我完全理解这种&quo…...

3分钟上手:NBTExplorer终极指南 - 可视化编辑Minecraft游戏数据的免费神器

3分钟上手:NBTExplorer终极指南 - 可视化编辑Minecraft游戏数据的免费神器 【免费下载链接】NBTExplorer A graphical NBT editor for all Minecraft NBT data sources 项目地址: https://gitcode.com/gh_mirrors/nb/NBTExplorer 你是否曾经想要修改Minecraf…...

完整指南:如何在5分钟内快速上手BioAge生物年龄计算工具包

完整指南:如何在5分钟内快速上手BioAge生物年龄计算工具包 【免费下载链接】BioAge Biological Age Calculations Using Several Biomarker Algorithms 项目地址: https://gitcode.com/gh_mirrors/bi/BioAge BioAge生物年龄计算工具包是一款基于R语言开发的强…...

手机也能玩转无人机仿真:用安卓QGC App连接同一WiFi下的PX4 JMAVSim模拟器

手机也能玩转无人机仿真:用安卓QGC App连接同一WiFi下的PX4 JMAVSim模拟器 无人机开发者和爱好者们,是否曾想过用手机就能完成整个无人机仿真测试流程?告别笨重的电脑束缚,只需一部安卓设备,就能在沙发上调试飞控算法。…...

独立开发者利用taotoken模型广场为不同任务选择性价比最优模型

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 独立开发者利用taotoken模型广场为不同任务选择性价比最优模型 对于独立开发者而言,在有限的预算内高效完成多样化的开…...

嵌入式Linux驱动开发 —— 从DTS到代码的桥梁与简单OF系列API(3)

接前一篇文章:嵌入式Linux驱动开发 —— 从DTS到代码的桥梁与简单OF系列API(2) 节点查找 API:如何在设备树中定位目标节点 有了数据结构基础,现在我们可以开始讲具体的API了。第一步是找到你要操作的节点。就像你想操…...

如何优化 MySQL 千万级数据分页查询的性能?

它的本质是:**传统 LIMIT offset, size 在大数据量下性能急剧下降,是因为 MySQL 必须 扫描并丢弃 前 offset 行数据。当 offset 很大时(如 LIMIT 1000000, 10),MySQL 需要读取 1,000,010 行记录,执行 1,000…...

3PEAK思瑞浦 TPA6531-S5TR SOT23-5 运算放大器

特性 供电电压:1.75V至5.5V 偏移电压:1.5mV(最大值) 最大可调工作频率:300kHz,斜率:0.15V/us 轨到轨输入和输出 0.1赫兹至10赫兹电压噪声:1伏峰值 开关电源时无显著输出抖动 低功耗:每通道最大25安培 工作温度范围:-40C至125C...

昇腾NPU模型服务化——从离线模型到高可用推理服务

模型训练完只是第一步。真正产生业务价值的是把模型部署成724小时在线服务——毫秒级延迟、支持动态Batching、能扛住流量洪峰,且具备高可用性。 这篇将手把手教你基于昇腾NPU构建生产级模型推理服务,涵盖框架选型、服务化架构、动态Batching优化、热加载…...

XXPermissions:Android权限管理框架的架构设计与最佳实践

XXPermissions:Android权限管理框架的架构设计与最佳实践 【免费下载链接】XXPermissions Android Permissions Framework, Adapt to Android 16 项目地址: https://gitcode.com/GitHub_Trending/xx/XXPermissions 在Android应用开发中,权限管理一…...

CMSIS-DAP调试器原理与应用:以Elektor mbed interface为例

1. 项目概述:Elektor mbed interface [150554] 是什么?如果你玩过ARM Cortex-M系列的单片机,尤其是NXP LPC800系列,那你可能对“CMSIS-DAP”这个调试器标准不陌生。它是由ARM官方推出的一个开源调试接口标准,最大的好处…...

收藏|2026年AI大模型就业爆发!岗位暴涨12倍、月薪6W+,小白零基础入门指南

2026年,AI已从“科技热点”彻底变为职场“刚需赛道”!脉脉高聘人才智库最新发布的《2026年1-2月中高端人才求职招聘洞察》,用硬核数据揭示行业真相:AI人才成招聘市场顶流,岗位量、薪资双双爆发式增长。尤其对零基础小白…...

终极解决方案:Windows Cleaner免费开源工具,3步彻底解决C盘爆红问题

终极解决方案:Windows Cleaner免费开源工具,3步彻底解决C盘爆红问题 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服! 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 你是否也经历过这样的…...

终极STL到STEP转换指南:如何实现3D打印模型到CAD设计的无缝衔接

终极STL到STEP转换指南:如何实现3D打印模型到CAD设计的无缝衔接 【免费下载链接】stltostp Convert stl files to STEP brep files 项目地址: https://gitcode.com/gh_mirrors/st/stltostp 在数字化制造和工程设计领域,STL到STEP转换已成为连接3D…...