[CTF/网络安全]攻防世界unserialize3解题详析及php序列化反序列化实例讲解

  • _wakeup()及php序列化反序列化
    • 序列化字符串结构分析
    • _wakeup()的利用
  • 解题思路
    • 伪属性数量绕过
  • 解题姿势
  • 总结

_wakeup()及php序列化反序列化

序列化是指将数据结构或对象转换为可传输或可存储的格式的过程。这通常需要将数据转换为字节流或其他形式的编码格式,以便能够在不同的系统和应用程序之间进行传输或存储。

在 PHP 中,可以使用 serialize() 函数将对象序列化为字符串,然后保存到文件或传输到其他应用程序中。

序列化后的数据包含了对象的属性、方法和类型等信息,但没有对象的实例本身

反序列化则是将序列化后的数据重新转换为对象、数据结构或变量的过程,以便在程序中进行操作或处理。

在 PHP 中,可以使用 unserialize() 函数将序列化后的字符串还原为原始的对象或数据,然后进行处理。

反序列化过程需要按照序列化时的格式和规则进行解析和处理,以确保数据的完整性和正确性。


这段代码涉及了 PHP 中的魔术方法 __wakeup() 和对象序列化的概念。其中 __wakeup() 在反序列化对象时自动调用,用于初始化对象的属性等操作。

对于上述代码中的 xctf 类,它有一个 $flag 属性,以及一个 __wakeup() 方法。当一个 xctf 对象被序列化并存储为字符串后,如果再次反序列化该字符串并尝试重建相应的对象时,PHP 就会自动调用该对象的 __wakeup() 方法。


因此,对于上述代码而言,如果访问一个类似 ?code=O:4:"xctf":1:{s:4:"flag";s:3:"111";} 的 URL 地址,该地址会将序列化后的 xctf 对象(即code.php?code=O:4:"xctf":1:{s:4:"flag";s:3:"111";})传递给 PHP 引擎处理。如果该对象被成功反序列化,那么 __wakeup() 方法将会被自动调用,程序将会直接终止执行并输出 bad requests

序列化字符串结构分析

O:4:"xctf":1:{s:4:"flag";s:3:"111";} 是一个序列化后的字符串,表示一个名为 xctf 的对象,该对象有一个属性 flag,属性值为 111。它的具体结构如下:

  • O:表示被序列化的是一个对象
  • 4:表示对象名 xctf 有4个字符
  • "xctf":表示对象的名称为 xctf
  • 1:表示该对象只有一个属性
  • {}:表示该对象的属性列表为空
  • s:表示属性类型为字符串
  • 4:表示属性名 flag 有4个字符
  • "flag":表示属性名为 flag
  • s:表示属性类型为字符串
  • 3:表示属性值 111 有3个字符
  • "111":表示属性值为 111

_wakeup()的利用

如果 __wakeup() 方法不终止程序执行,那么在将序列化字符串反序列化为对象时,该方法会自动被调用,并执行其中的代码。在上述 xctf 类中,我们可以在 __wakeup() 方法中编写一些初始化对象属性等操作,使得wakeup函数中的对象经反序列化后能够正确运行

如果将 __wakeup() 方法修改为如下代码:

public function __wakeup(){$this->flag = '222';
}

则在将序列化字符串 O:4:"xctf":1:{s:4:"flag";s:3:"111";} 反序列化为对象时,该对象的 $flag 属性值会被重置为 222。具体代码如下:

<?phpclass xctf{public $flag = '111';public function __wakeup(){$this->flag = '222';}
}$serializedObj = 'O:4:"xctf":1:{s:4:"flag";s:3:"111";}'; // 序列化后的字符串$obj = unserialize($serializedObj); // 反序列化var_dump($obj); // 输出反序列化后的对象

运行上述代码后,输出结果如下:

object(xctf)#1 (1) {["flag"]=>string(3) "222"
}

解题思路

由于反序列化时会自动调用_wakeup()函数,导致程序退出。
故可通过增大序列化字符串中表示对象属性个数的值,使其大于真实值,以此绕过_wakeup函数,(即伪属性绕过),从而实现程序正常运行。

伪属性数量绕过

假设有一个名为 Test 的 PHP 类,该类包含两个属性 $a$b,并且定义了 __wakeup() 方法。如果要绕过 __wakeup() 方法,可以将表示对象属性数量的值设定为大于 2 的值,如下所示:

class Test {private $a;private $b;public function __wakeup() {echo "Execute wakeup method";}
}$obj = new Test();
$obj->a = "aaa";
$obj->b = "bbb";$serializedObj = serialize($obj); // 将对象序列化为字符串并保存
echo $serializedObj . "\n"; // 输出序列化后的字符串// 将表示属性数量的值从 2 改成 3 并重新进行反序列化
$modifiedSerializedObj = str_replace("2", "3", $serializedObj);
$unserializedObj = unserialize($modifiedSerializedObj);
echo $unserializedObj->a . "\n"; // 正常输出 "aaa"
echo $unserializedObj->b . "\n"; // 正常输出 "bbb"

在上述代码中,首先创建一个名为 Test 的类,并在其中定义 __wakeup() 方法。在 __wakeup() 方法中,简单地输出了一条日志信息,表示该方法被正常执行。接着,创建一个 Test 对象 $obj,其中包含两个属性 $a$b

$obj 对象序列化为字符串,并输出该字符串的内容。再将该字符串中表示对象属性数量的值 2 修改为 3,并将修改后的字符串传入 unserialize() 函数进行反序列化。

由于修改后的字符串中的属性数量大于实际属性数量,因此在反序列化时不会触发 __wakeup() 方法。当我们访问反序列化后的对象中的属性 $a$b 时,可以正常输出它们的值(即 "aaa""bbb"

若字符串中的属性数量等于实际属性数量,则不会输出aaa及bbb,仅输出日志信息

解题姿势

  1. 将对象序列化
    O:4:"xctf":1:{s:4:"flag";s:3:"111";}

  2. 增加字符串中对象属性数量
    O:4:"xctf":2:{s:4:"flag";s:3:"111";}

  3. 构造GET传参 /?code=O:4:"xctf":2:{s:4:"flag";s:3:"111";}

回显如下,反序列化时成功绕过_wakeup函数


总结

以上为[CTF/网络安全]攻防世界unserialize3解题详析及php序列化反序列化实例讲解,分享序列化反序列化相关知识,读者可躬身实践。
我是秋说,我们下次见。

[CTF/网络安全]攻防世界unserialize3解题详析及php序列化反序列化实例讲解相关推荐

  1. [CTF/网络安全] 攻防世界 php_rce 解题详析

    [CTF/网络安全] 攻防世界 php_rce 解题详析 PHP REC ThinkPHP V5漏洞Payload 姿势 总结 PHP REC PHP RCE 指的是通过远程代码执行漏洞(Remote ...

  2. 攻防世界unserialize3

    又来了我的攻防世界 原题:攻防世界 怎么说呢...先看一下题目吧 看到题目的时候我第一反应是无从下手,之前说过博主是个刚起步的新手而且对php不是特别了解...这真的是难度一的题嘛...不过!在查找了 ...

  3. python小记--攻防世界simple_js解题脚本编写

    目录 \x格式十六转十进制 十进制转换ASCII值 \x格式十六转十进制 对应攻防世界web新手题simple_js 查看网页源代码之后看到了一串\x开头的数据 \x35\x35\x2c\x35\x3 ...

  4. 【CTF】攻防世界 MISC 新手练习区 003-012详解

    目录 003 如来十三掌 004 give_you_flag 005 stegano 006 坚持60s 007 gif 008 掀桌子 009 ext3 010 SimpleRAR 011 base ...

  5. forgot [XCTF-PWN][高手进阶区]CTF writeup攻防世界题解系列13

    题目地址:forgot 本题是高手进阶区的第二题,恭喜大家已经进入高手行列!好假好假,哈哈哈! 废话不说,看看题目先 这个题目有很长的描述,但是都是废话,不去管他了. 照例下载附件,做下安全检查 ro ...

  6. 【和小白一起练习CTF】攻防世界:web基础练习题(2)

    文章目录 1.simple_js 2.xff_referer 3.weak_auth 4.webshell 5.command_execution 6.simple_php 1.simple_js 题 ...

  7. Wirte-up:攻防世界Web解题过程新手区01-06

    文章更新于:2020-02-18 说明:为了标识图片边界,有些图片加了红线以增强观感. 注1: web 环境搭建参见: Windows&linux使用集成环境搭建 web 服务器 注2:DVW ...

  8. CTF(pwn)攻防世界warmup

    题目描述 这种题很有意思,只给了题目场景地址没有文件,让你盲打,类似于web中的盲注吧; nc连接,给了 目标地址, 思路是:利用栈溢出覆盖,返回这个地址; 具体是溢出多少是不确定的,是P64(),还 ...

  9. 【XCTF 攻防世界 web 练习详解系列(二)】【get_post的两种解法】

    目录 get_post 题目链接 题目描述 知识点 HTTP中GET.POST用法以及它们的区别 工具的使用 题解 方法1 方法2 get_post 题目链接 题目描述 X老师告诉小宁同学HTTP通常 ...

最新文章

  1. 删除u盘mbr多余启动项 linux,高手教你怎么修复U盘的MBR
  2. Springboot下使用WebSocket和浏览器进行长连接通信
  3. 人与人之间交往最重要的是什么?
  4. Ext中 get、getDom、getCmp的区别
  5. php对引用的简单理解
  6. 校运会计算机应用口号,校运会入场霸气押韵口号(精选60句)
  7. Kattis Doors
  8. 计算机房摆放布局,数据中心机房位置及设备布置的几点要求
  9. luooj1559最强阵容加强版
  10. 为什么英语会有主格和宾格之分?比如:I、me
  11. 2021_lg_03.SQL实战:如何用sql计算用户留存问题
  12. Java中多态的粗浅见解
  13. Java代码审计前置知识——Spring框架AOP和IoC
  14. KPS同意约21亿美元巨资收购Garrett全部资产
  15. 2022年全球市场脱脂小麦胚芽粉总体规模、主要生产商、主要地区、产品和应用细分研究报告
  16. 记录在阿L做外包的日子,给正在(金三银四)的你一点经验
  17. 附上两张本人觉得不错的WIN7桌面壁纸
  18. android如何开发流量监控软件
  19. 2020云栖大会智慧出行专场:聚焦高精地图/算法、智能模型、自动驾驶、AR导航...
  20. html 任务列表,任务列表.html

热门文章

  1. 7000G机械软件教程,免费分享
  2. 宏晶微电子 笔试题凉经
  3. 数字化和网络化双重驱动下 周界安防产品迎来新变革
  4. 配置与管理FTP服务器
  5. 快速排序 改进快排的方法
  6. python爬虫爬取4K图片实例
  7. dsp调音一次多少钱_自带专供调节系统的DSP 让你离调音大师又近了一步
  8. Android动画——逐帧动画
  9. 计算机软件著作权的价值,计算机软件著作权登记费是多少
  10. 【AD封装】micro USB座子,Type C座子,USB-A公头