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

BUUCTF:[安洵杯 2019]easy_serialize_php 反序列化字符串逃逸漏洞深度解析

1. 漏洞背景与场景还原这道来自BUUCTF安洵杯2019的题目典型地展示了PHP反序列化漏洞中一个精妙的攻击手法——字符串逃逸。题目环境模拟了一个简单的图片查看功能用户可以通过show_image功能查看指定图片。表面上看系统对用户输入进行了严格过滤但实际上存在致命的设计缺陷。我们先来看关键代码逻辑当访问/index.php?fhighlight_file时服务器会返回源码。核心漏洞点出现在filter()函数中它使用preg_replace过滤了包含php、flag等关键词的内容。而extract($_POST)这个危险函数使得攻击者可以通过POST请求覆盖已有变量。最致命的是系统先将$_SESSION序列化经过过滤后再反序列化这个处理流程为字符串逃逸创造了条件。我曾在实际渗透测试中遇到过类似场景某CMS系统在保存用户配置时先序列化数据然后进行关键词替换结果导致攻击者可以通过精心构造的payload突破原有数据结构。这种漏洞往往被开发者忽视因为它需要同时满足多个条件才会触发。2. 反序列化字符串逃逸原理2.1 序列化字符串结构解析PHP的序列化字符串有严格的格式要求。比如一个数组序列化后是这样的a:3:{s:4:user;s:5:guest;s:8:function;s:10:show_image;s:3:img;s:20:Z3Vlc3RfaW1nLnBuZw;}其中a:3表示这是一个包含3个元素的数组s:4:user表示键是长度为4的字符串users:5:guest表示值是长度为5的字符串guest这种结构化的数据格式使得PHP在反序列化时会严格按照长度标识来解析数据。如果我们在过滤过程中改变了字符串的实际长度但不更新长度标识就会导致反序列化程序误读后续内容。2.2 过滤函数导致的长度不一致题目中的filter()函数会移除所有匹配/php|flag|php5|php4|fl1g/i的内容。比如字符串phphacker经过过滤后会变成hacker长度从9变成了6。但序列化字符串中的长度标识s:9:phphacker仍然保持原样这就产生了3个字节的差异。这种长度标识与实际内容的不匹配就是字符串逃逸漏洞的核心。攻击者可以利用这个差异精心构造payload使得反序列化时解析边界发生偏移从而注入恶意数据。3. 漏洞利用链完整分析3.1 关键利用点梳理通过审计源码我们发现几个关键利用点extract($_POST)允许覆盖$_SESSION中的变量filter()函数会对序列化后的字符串进行内容过滤最终通过file_get_contents读取图片内容攻击链可以这样构造通过POST传入精心设计的$_SESSION数据这些数据在序列化后会被过滤处理过滤导致的字符串长度变化引发解析错位最终控制img参数实现任意文件读取3.2 实际漏洞利用过程让我们通过具体payload来理解这个漏洞。假设我们传入以下POST数据_SESSION[flagphp];s:6:mochu7;s:3:img;s:20:L2V0Yy9wYXNzd2Q;}这个payload经过序列化后会变成a:3:{s:7:flagphp;s:49:;s:6:mochu7;s:3:img;s:20:L2V0Yy9wYXNzd2Q;};...}当filter()函数处理时如果flagphp中的某些字符被过滤比如包含php就会导致实际字符串变短但长度标识不变。例如过滤掉php后字符串实际长度可能减少了3个字节但s:49这个长度标识仍然存在。这种错位会导致反序列化时后续的内容被错误解析。原本属于值的部分可能被当作新的键值对来解析。通过精心设计我们可以逃逸出原有的数据结构注入一个新的img键从而控制文件读取路径。4. 漏洞防御与修复方案4.1 安全编码建议针对这类漏洞我总结了几点防御建议避免危险函数组合不要在使用serialize()后对结果进行内容替换。如果必须过滤应该在序列化前处理原始数据。严格处理用户输入extract()函数极其危险应该避免使用。必须使用时要设置EXTR_SKIP等安全选项。使用JSON替代序列化对于简单数据传输JSON是更安全的选择它没有PHP序列化的那些特性。实施完整性校验可以在序列化数据后添加HMAC签名确保数据未被篡改。4.2 实际修复案例在某次代码审计中我发现类似漏洞后建议的修复方案是// 修复前 $data filter(serialize($_SESSION)); // 修复后 function safe_filter($array) { foreach($array as $k$v) { $array[$k] preg_replace(/php|flag/i, , $v); } return serialize($array); } $data safe_filter($_SESSION);这个修复的关键点是先过滤内容再序列化避免了序列化后字符串被修改导致的结构破坏。5. CTF解题技巧与实战心得在CTF比赛中这类反序列化题目很常见。我总结了一些解题技巧关注过滤函数看到preg_replace等过滤函数要特别注意计算过滤前后字符串长度变化构造精确payload使用占位符计算好逃逸所需的字符数比如需要逃逸20个字节就构造能产生20字节差异的payload分步验证先在本地测试payload效果确认反序列化后的数据结构是否符合预期利用注释符有时候在payload末尾添加}或;可以帮助闭合数据结构记得有一次比赛我花了3小时才意识到长度计算错误。后来发现用这个公式很有效需要逃逸的字节数 原始payload长度 - 过滤后payload长度掌握这个计算技巧后构造payload就变得容易多了。

相关文章:

BUUCTF:[安洵杯 2019]easy_serialize_php 反序列化字符串逃逸漏洞深度解析

1. 漏洞背景与场景还原 这道来自BUUCTF安洵杯2019的题目,典型地展示了PHP反序列化漏洞中一个精妙的攻击手法——字符串逃逸。题目环境模拟了一个简单的图片查看功能,用户可以通过show_image功能查看指定图片。表面上看,系统对用户输入进行了严…...

SMAPI错误拦截与自动修复:如何确保星露谷物语游戏稳定性的完整指南

SMAPI错误拦截与自动修复:如何确保星露谷物语游戏稳定性的完整指南 【免费下载链接】SMAPI The modding API for Stardew Valley. 项目地址: https://gitcode.com/gh_mirrors/smap/SMAPI SMAPI(Stardew Valley Modding API)作为星露谷…...

AMGTA就增材制造在资源高效型制造体系中的作用发布独立报告

电子、信息和通信领域获奖者:Cynthia Dwork博士 生命科学领域获奖者:Akira Shizuo博士和Zhijian “James” Chen博士 日本奖基金会(会长:Ryozo Nagai)于4月14日(周二)在东京涩谷区的东京新国立剧…...

QuickRecorder终极指南:5分钟掌握macOS专业录屏技巧

QuickRecorder终极指南:5分钟掌握macOS专业录屏技巧 【免费下载链接】QuickRecorder A lightweight screen recorder based on ScreenCapture Kit for macOS / 基于 ScreenCapture Kit 的轻量化多功能 macOS 录屏工具 项目地址: https://gitcode.com/GitHub_Trend…...

Python百度搜索API开源项目:无限制免费搜索引擎集成的终极解决方案

Python百度搜索API开源项目:无限制免费搜索引擎集成的终极解决方案 【免费下载链接】python-baidusearch 自己手写的百度搜索接口的封装,pip安装,支持命令行执行。Baidu Search unofficial API for Python with no external dependencies 项…...

多核系统缓存一致性与并行编程优化实践

1. 多核系统架构与缓存一致性挑战现代多核处理器通常采用共享内存架构,每个核心拥有独立的L1缓存,而L2缓存可能是独立或共享的设计。以Intel Core i7为例,其典型架构包含:每个物理核心独享32KB L1指令缓存和32KB L1数据缓存256KB私…...

NVIDIA Profile Inspector终极指南:解锁显卡隐藏性能的5个技巧

NVIDIA Profile Inspector终极指南:解锁显卡隐藏性能的5个技巧 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector NVIDIA Profile Inspector是一款强大的NVIDIA显卡配置工具,能够深…...

突破性VPS系统切换方案:5分钟实现全平台迁移

突破性VPS系统切换方案:5分钟实现全平台迁移 【免费下载链接】reinstall 一键DD/重装脚本 (One-click reinstall OS on VPS) 项目地址: https://gitcode.com/GitHub_Trending/re/reinstall 在数字化时代,VPS(虚拟专用服务器&#xff0…...

Qwen3-Embedding-4B部署实录:CentOS系统环境配置避坑指南

Qwen3-Embedding-4B部署实录:CentOS系统环境配置避坑指南 1. 引言:为什么选择Qwen3-Embedding-4B? 如果你正在寻找一个能在普通显卡上跑起来,又能处理长文档、支持多语言的文本向量化模型,那Qwen3-Embedding-4B可能就…...

Mediapipe项目PyInstaller打包实战:根治FileNotFoundError的路径解析与资源部署

1. 问题现象与根源分析 最近在帮同事打包一个基于Mediapipe的手势识别项目时,遇到了一个典型的FileNotFoundError错误。控制台输出的错误信息显示,程序在尝试加载某个二进制图文件时失败了,提示"路径不存在"。这个错误看似简单&…...

Qwen3-ASR-0.6B效果展示:粤语普通话混合语音识别能力边界测试报告

Qwen3-ASR-0.6B效果展示:粤语普通话混合语音识别能力边界测试报告 1. 引言:为什么这次测试不一样? 市面上大多数轻量级语音识别工具,标称支持“中文识别”,实际只认普通话;标榜“中英文混合”&#xff0c…...

Nanbeige 4.1-3B Streamlit UI实操手册:自定义背景色与气泡样式的修改方法

Nanbeige 4.1-3B Streamlit UI实操手册:自定义背景色与气泡样式的修改方法 1. 引言:从“能用”到“好看”的界面定制 如果你已经体验过Nanbeige 4.1-3B Streamlit WebUI,第一印象可能是“清爽”、“现代”。它确实打破了Streamlit原生界面的…...

mysql如何给已有数据表添加索引_使用CREATE INDEX提升查询速度

MySQL建索引需严格校验语法、字段与表名;优先用ALTER TABLE ADD INDEX;复合索引顺序须匹配查询条件;避免冗余索引;大表操作选低峰期;唯一索引承载约束语义;建索引后需ANALYZE TABLE更新统计信息。CREATE IN…...

拼多多如何批量上下架商品?拼多多一键下架所有商品操作步骤

拼多多商家怎么进行上下架商品的操作?怎么设置商品预售?拼多多一键下架所有商品操作步骤,下面来一步一步说明一下:一、上下架商品:1.进入拼多多商家版后台,找到【商品管理】--【商品列表】选项并点击&#…...

保姆级教程:用PMW3901光流+VL53L1X激光搞定Pixhawk室内悬停(附QGC参数配置)

从零搭建Pixhawk室内悬停系统:PMW3901光流与VL53L1X激光的实战指南 当GPS信号消失在钢筋水泥的丛林里,无人机如何在室内保持优雅悬停?这个问题困扰过无数开发者。去年夏天,我在一个仓库巡检项目中就遇到了这个难题——客户需要无人…...

WooCommerce 中根据用户登录状态动态显示或隐藏元素的正确方法

...

怎么为MongoDB事务调优:将读操作尽量移到事务外面执行.txt

PHP脚本CPU飙高根本原因是代码导致CPU持续满负荷运转,常见于死循环、回溯灾难正则、无超时远程请求及同步I/O阻塞;定位需用top、strace和microtime打点,FPM场景应调优进程管理与超时配置。PHP脚本执行时CPU飙高导致风扇狂转根本原因不是PHP本…...

手把手教你用DSP28335驱动W5500实现TCP客户端(附完整代码与避坑指南)

DSP28335与W5500以太网通信实战:从硬件连接到稳定数据传输 在工业自动化、远程监控和智能设备领域,嵌入式系统联网已成为刚需。TI的DSP28335凭借其强大的实时处理能力,结合W5500这款硬连线TCP/IP协议栈芯片,能够为设备赋予稳定可靠…...

欧拉角、quat四元组和旋转矩阵的关系

在具身智能和机器人领域中,经常会涉及这三个的转化 1. 介绍 这里介绍这三种姿态的表示方法欧拉角(Euler Angles): 用3个角度描述旋转:(roll, pitch, yaw) 或 (x, y, z),表示按顺序绕 x → y → z 轴旋转 致…...

手把手教你学Simulink——基于Simulink的双三相PMSM缺相容错控制

目录 手把手教你学Simulink ——基于Simulink的双三相PMSM缺相容错控制 一、问题背景 二、双三相PMSM数学模型与故障影响 1. 正常状态数学模型 2. A相开路故障影响 三、容错控制策略:“检测-重构-补偿” 1. 故障检测(Detection) 2. 控制重构(Reconfiguration) 3.…...

SPOOLing 技术(假脱机技术)独占设备 → 虚拟共享设备

一、基础定义与核心定位 SPOOLing 全称:Simultaneous Peripheral Operations On-Line 中文:假脱机技术 一句话核心: 在联机状态下,用软件模拟实现脱机I/O的效果,将低速独占设备虚拟成高速共享设备,让 CPU 与…...

AI Agent在物联网(IoT)中的应用前景

AI Agent在物联网(IoT)中的应用前景:从传感器孤岛到自治协作的智能数字生态 副标题:基于LLM/多模态感知、边缘云协同与分布式自治架构的深度实践与未来展望摘要/引言 问题陈述 当前的物联网(IoT)系统正陷入…...

JDBC事务管理:确保数据一致性的关键技术

JDBC事务管理:确保数据一致性的关键技术 在Java编程的世界里,JDBC(Java Database Connectivity)作为连接Java应用程序与各种关系型数据库的桥梁,扮演着至关重要的角色。它提供了一套标准的API,使得开发者能…...

中国信任度再居全球前列,但“信任孤岛“趋势浮现 | 美通社头条

、美通社消息:近日,国际领先的传播咨询机构爱德曼公关联合清华大学国家形象传播研究中心,在华发布了《2026年爱德曼信任度调查中国报告》。今年报告以"筑‘信为桥,跨越孤岛"为主题,聚焦全球社会在经历两极分…...

P13 | 异步任务:后台长时间操作的最佳实践

P13 | 异步任务:后台长时间操作的最佳实践 💰 付费文章 | 第二阶段:后端开发 为什么需要异步任务? 有些操作耗时很长,不适合同步等待: 操作 耗时 是否需要异步 查询列表 < 200ms ❌ 上传单张图片 1-3s ⚠️ 可选 批量生成 ZIP 打包下载 10s-5min ✅ 必须 AI 人脸识别…...

ROS实战:用rosbag_filter_gui和topic_renamer高效清洗与合并KITTI的sync/extract数据包

ROS数据工程实战&#xff1a;KITTI数据集高效清洗与合并全流程解析 在自动驾驶和机器人领域&#xff0c;KITTI数据集就像是一块未经雕琢的璞玉——原始数据包中混杂着不同频率的传感器数据、冗余话题和需要校正的时间戳。我曾花了整整三天时间处理一个27GB的KITTI数据包&#x…...

实战篇(一):从零构建领域知识图谱——基于Protege的本体建模与知识表示

1. 知识图谱与本体建模入门指南 第一次接触知识图谱时&#xff0c;我被那些复杂的术语吓得不轻。直到自己动手做了几个项目才发现&#xff0c;这东西就像搭积木一样有趣。知识图谱本质上就是用计算机能理解的方式&#xff0c;把现实世界中的事物和关系组织起来。比如在游戏领域…...

Python实战:三种GUI库打造可玩性五子棋(附完整源码)

1. 为什么用Python开发五子棋 五子棋作为经典策略游戏&#xff0c;用Python实现不仅能巩固编程基础&#xff0c;还能深入理解游戏逻辑与GUI交互。我最初选择用Python开发五子棋&#xff0c;就是看中它快速验证想法的特性——短短几十行代码就能看到棋子落在棋盘上的效果&#x…...

SystemVerilog Clocking Block实战:从接口同步到Verdi Delta Cycle调试

1. SystemVerilog Clocking Block基础解析 Clocking Block是SystemVerilog中用于接口同步的核心语法结构&#xff0c;它本质上是一个时序控制单元&#xff0c;能够精确管理信号采样和驱动的时序关系。想象一下&#xff0c;这就像在繁忙的十字路口设置红绿灯&#xff0c;确保不同…...

Unity3D——UGI基础知识(1)

一、六大基础组件介绍1、组件创建在UI中创建一个image&#xff0c;unity就会自动创建一个Canvas和一个EventSystem&#xff0c;这是必不可少的重要UGI内容。下面是他们的组件类别及作用概述。2、了解组件内容1.Canvas组件1.1Canvas组件的作用Canvas是画布&#xff0c;它是UGUI中…...