PHP反序列化

序列化通俗来讲就是将对象转化为可以存储、传输的字符串,反序列化就是把字符串再变回对象的过程。

例如:

<?php
class chybate {
var $test = '123456';
}
$cless1 = new chybate; // 序列化
$cless1_ser = serialize($cless1);
echo $cless1_ser . '\n'; // 反序列化
$cless1_user = unserialize($cless1_ser);
print_r($cless1_user);
?>
O:7:"chybate":1:{s:4:"test";s:6:"123456";}
chybate Object
(
[test] => 123456
)

这里序列化结果中的O表示object对象,数字7表示对象类名长度为7,对象类名为"chybate"。数字1表示对象有一个变量,大括号里的s代表的是string类型,数字4表示变量名的长度,后面接着就是变量的值。

题目分析

题目给出了一个类xctf,其中包含一个变量flag和一个魔术函数__wakeup()。并且提示用code接收一个序列化后的字符串。

其中魔术函数__wakeup()是一个突破点,当使用unserialize()函数反序列化一个对象时,如果该对象类中定义了__wakeup()函数,则会自动调用该方法。

关于serialize()unserialize()对魔术函数的处理:

serialize()函数序列化对象时,如果对象类中定义了__sleep()魔术函数,将会调用该方法来确定哪些属性需要被序列化。如果对象类没有定义__sleep()函数,将会序列化对象的所有属性。

unserialize() 函数反序列化对象时,如果对象中定义了__wakeup()魔术函数,将会在对象反序列化后调用该方法__wakeup()函数用于初始化反序列化后的对象状态,通常用于重新建立对象和其相关资源之间的联系。

那么如何利用__wakeup()魔术函数呢?

__wakeup()的一个绕过点:一个对象被序列化后,如果它的属性被修改,那么它在反序列化的过程中则不会执行__wakeup()函数。

解题

解题思路就是,修改序列化后中的属性值来绕过__wakeup()。

<?php
class xctf{
public $flag = '111';
public function __wakeup(){
exit('bad requests');
}
}
$c = new xctf;
print(serialize($c));
?>

xctf序列化字符串:

O:4:"xctf":1:{s:4:"flag";s:3:"111";}

当被反序列化的字符串中对应的对象的属性个数发生变化时,会导致反序列化失败而同时使得__wakeup()函数失效。

构造payload /?code=O:4:"xctf":2:{s:4:"flag";s:3:"111";},这里将变量的个数改为2,属性个数发生变化,这样__wakeup()在初始化反序列化后的对象状态时就会失效,从而阻止了exit()函数的执行。

get flag!

总结

PHP反序列化漏洞原理就是,在反序列化该对象时触发魔术方法从而执行命令或代码。

PHP序列化需注意以下几点:

  • 序列化只序列属性,不序列方法。

  • 能控制的只有类的属性,攻击就是寻找合适能被控制的属性,利用作用域本身存在的方法,基于属性发起攻击。


若有错误,欢迎指正!o( ̄▽ ̄)ブ

记录一次CTF经典PHP反序列化的更多相关文章

  1. ctf经典好题复习

    WEB200-2 这是swpu-ctf的一道题. <?php if(isset($_GET['user'])){ $login = @unserialize(base64_decode($_GE ...

  2. 从一道ctf看php反序列化漏洞的应用场景

    目录 0x00 first 前几天joomla爆出个反序列化漏洞,原因是因为对序列化后的字符进行过滤,导致用户可控字符溢出,从而控制序列化内容,配合对象注入导致RCE.刚好今天刷CTF题时遇到了一个类 ...

  3. 【CTF WEB】反序列化

    反序列化 漏洞代码 <?php error_reporting(0); if(empty($_GET['code'])) die(show_source(__FILE__)); class ex ...

  4. CTF中PHP反序列化和命令注入的一次简单利用

    代码来自第六届防灾科技学院网络安全技能大赛,侵删. 目标 获取Linux服务器根目录下的flag 代码 /*home.php*/ class home{ private $method; privat ...

  5. php反序列化(昨天的补充)

    魔术方法 在对PHP反序列化进行利用时,经常需要通过反序列化中的魔术方法,检查方法里是否有敏感操作来进行利用. 常见方法: 创建对象时触发:__construct() 对象被销毁时触发:__destr ...

  6. ISCTF2022WP

    ISCTF2022改名叫套CTF吧(bushi),博主菜鸡一个,套题太多,挑一些题写下wp,勿喷. MISC 可爱的emoji   下载下来是个加密压缩包,根据hint掩码爆破密码 得到密码:KEYI ...

  7. 「2014-2-23」Note on Preliminary Introduction to Distributed System

    今天读了几篇分布式相关的内容,记录一下.非经典论文,非系统化阅读,非严谨思考和总结.主要的着眼点在于分布式存储:好处是,跨越单台物理机器的计算和存储能力的限制,防止单点故障(single point ...

  8. Google Analytics:为链接点击设定事件追踪的方法

    在 Google Analytics 中,可以使用 Event Tracking 功能跟踪自定义的事件.但是,如果你要跟踪的是一个链接点击,那么单纯这样写则很有可能导致漏掉许多事件: <a hr ...

  9. CSharpGL(44)用ShadowMapping方式画物体的影子

    CSharpGL(44)用ShadowMapping方式画物体的影子 在(前文)已经实现了渲染到纹理(Render To Texture)的功能,在此基础上,本文记录画物体的影子的方式之一——shad ...

  10. Mybatis基本用法--上

    Mybatis基本用法--上 本文只是为自己查漏补缺.全面的请看官方文档,支持中英文 原理参考:http://blog.csdn.net/luanlouis/article/details/40422 ...

随机推荐

  1. VMware Workstation Pro 开启虚拟化引擎

    摘要:想开启 VMware Workstation Pro 虚拟机上的 虚拟化 Intel VT-x/EPT 或 AMD-V/RVI 选项,却发现打不开.在网上一番搜集之后找到了解决办法. ️ 注意: ...

  2. MS SQL的ROUND函数用来数值的四舍五入

    MS SQL的ROUND函数用来数值的四舍五入 MS SQL要进行数值的四舍五入,有一好用的函数ROUND. 语法 ROUND ( numeric_expression , length [ ,fun ...

  3. k8s 知识

    命令 Pod 管理 kubectl get pods 查看pod在哪个node上 kubectl get pods -o wide kubectl describe pod pod_name 创建新的 ...

  4. Pointer Event Api-整合鼠标事件、触摸和触控笔事件

    Pointer Events API 是Hmtl5的事件规范之一,它主要目的是用来将鼠标(Mouse).触摸(touch)和触控笔(pen)三种事件整合为统一的API. Pointer Event P ...

  5. Angular 18+ 高级教程 – Naming Conversion

    前言 命名规范对项目维护是很重要的. Angular 对项目的渗透很大的, 必须做好命名规范, 不然会很乱. InjectionToken InjectionToken = UPPER_SNAKE_C ...

  6. [USACO1.5] 八皇后 Checker Challenge 题解

    [USACO1.5] 八皇后 Checker Challenge 题目描述 一个如下的 \(6 \times 6\) 的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括 ...

  7. 揭秘最为知名的黑客工具之一: Netcat!适用安全测试、渗透测试、黑客攻击!

    在网络安全领域,黑客工具一直备受关注.它们既可以被用于攻击,也可以用于防御.本文将为大家揭秘一款知名的黑客工具: Netcat. 1.Netcat是什么? Netcat被誉为"网络的瑞士军刀 ...

  8. 利用PaddleHub 进行人脸检测识别、并对图片进行抠图

    利用PaddleHub 进行人脸检测识别.并对图片进行抠图   本文是利用百度的飞桨平台的paddle进行人脸的检测和抠图,但是里面也有一些小问题,特记录一下笔记,以便以后观看学习. 环境:pytho ...

  9. 线段树与二分操作 vases and flowers ——hdu 4614

    操作1,的关键是找到第一只和最后一只空花瓶,完全可以利用二分法查找,找第一只花瓶可以在[X,N]内查找,第一个位置pos1,最后一只花瓶则在[POS1,N]中找,然后更新[POS1,POS2],全部置 ...

  10. 项目实战:Qt+OSG爆破动力学仿真三维引擎测试工具v1.1.0(加载.K模型,子弹轨迹模拟动画,支持windows、linux、国产麒麟系统)

    需求   1.使用osg三维引擎进行动力学模型仿真性能测试:  2.打开动力学仿真模型文件,.k后缀的模型文件,测试加载解析过程:  3.解决第三方company的opengl制作的三维引擎,绘制面较 ...