首页 > 编程语言 >记录一次CTF解题PHP反序列

记录一次CTF解题PHP反序列

时间:2024-04-18 11:44:49浏览次数:20  
标签:__ 序列化 函数 对象 flag CTF 解题 wakeup PHP

攻防世界的一个php反序列化题unserialize3

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类型,如果是一个i是int型,4表示变量名的长度,后面接着就是变量的值。

题目分析

给出了一个类xctf,包含一个变量flag和一个魔术函数__wakeup(),用code去接收一个序列化后的字符串。

image

分析给出的源码,魔法函数 __wakeup() 是一个突破点,将在被序列化后立即被调用。

serialize() 和 unserialize() 函数对魔术方法 __wakeup() 的处理:

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

unserialize()函数反序列化对象时,如果对象中定义了__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()在初始化反序列化后的对象状态时就就会失效。

image

成功get flag!

标签:__,序列化,函数,对象,flag,CTF,解题,wakeup,PHP
From: https://www.cnblogs.com/smileleooo/p/18143157

相关文章

  • php随笔(1)
    easyui1.jquerycdn:https://releases.jquery.com/2.menuhtml<!doctypehtml><html><head> <metahttp-equiv="Content-Type"content="text/html;charset=UTF-8"> <metaname="keywords"content="......
  • Opcache-PHP
    PHP7/8OPCACHE缓存文件导致的RCEOPcache基础OPcache(OpcodeCache)是PHP的一个内置的加速模块,通过解析的PHP脚本预编译存放在共享内存中的字节码来避免每次加载和解析PHP脚本的开销,解析器可以直接从共享内存读取已经缓存过的字节码,从而大大提高了PHP的执行效率。PHP的......
  • 新手大白话 UUCTF 2022 新生赛ezpop 字符串逃逸
    今天做个字符串逃逸的题目,这个题还挺不错的,不多bb直接看源码。点击查看代码<?php//flaginflag.phperror_reporting(0);classUUCTF{public$name,$key,$basedata,$ob;function__construct($str){$this->name=$str;}function__wakeup(){......
  • 正六面体教会我们什么 | 解题经验
    前言正六面体,也就是正方体,是我们从小学和初中就学习的数学素材,高中阶段的深入学习中也多次研究这个重要素材。编辑中。。。经验总结➊依托正方体研究、理解棱柱、棱锥、棱台的结构特征;➋正方体中的正四面体,补体;➌正方体中的内切球、棱切球、外接球;➍确定基向量,来表示空间中......
  • PHP响应SSE
    使用PHP创建一个SSE响应来与客户端保持连接<?phpheader('Content-Type:text/event-stream');header('Cache-Control:no-cache');header('Connection:keep-alive');//模拟数据更新(实际应用中可能是从数据库查询、监控系统获取等)functiongenerateEventData(){$dat......
  • 新手大白话 [LitCTF 2023]刷题记录1
    我Flag呢直接看源码PHP是世界上最好的语言!进入页面查看源码发现为RCE漏洞。直接system('cat/flag');点击Runcode导弹迷踪js源码问题,f12点开调试器查看game.js代码点击查看代码varMessages={START:{title:getLevelString,text:......
  • htbctf wp
    htbctfwpCrypto[VeryEasy]Dynastic凯撒变体source.pyfromsecretimportFLAGfromrandomimportrandintdefto_identity_map(a):returnord(a)-0x41deffrom_identity_map(a):returnchr(a%26+0x41)defencrypt(m):c=''f......
  • php读取xml
    截图代码直接抄的:https://www.w3schools.com/php/php_ajax_xml.asp动动手做练习,几番调试,添加了右边绿色字体的注释。平素写码都不带注释的,写博是要分享的,就装装样子。初始学习xml是04年夏,捧一本买回来外加光盘的厚书翻了半本,仅就记得xml文件的大概结构,十来年了xml作为数据传输......
  • PHP strlen() 和mb_strlen()函数
    <?php   //测试时文件的编码方式要是UTF8   $str='中文a字1符';   echostrlen($str).'<br>';//14   echomb_strlen($str,'utf8').'<br>';//6   echomb_strlen($str,'gbk').'<br>';//8   echomb_s......
  • 新手大白话 FSCTF 2023刷题记录1
    [FSCTF2023]源码!启动!进入页面ctrl+u查看源码得到flagwebshell是啥捏进入页面,发现给出源码笨办法,一个一个找出表情代表啥,最后发现为命令执行函数passthru,而passthru出现在了漏洞点eval处,也就是RCE漏洞,而且进一步查看发现没有过滤,直接打它:细狗2.0进入页面随意输入试试,......