进题目,可以发现这是一个反序列化的题目。
这段代码定义了一个名为xctf
的类,其中包含一个公共属性$flag
,初始值为'111',并且定义了一个__wakeup()
魔术方法。
魔术方法 __wakeup()
__wakeup()
方法在对象反序列化时被调用。这段代码中,当该类对象被反序列化时,将立即调用exit('bad requests')
,终止脚本执行并输出“bad requests”。
潜在的反序列化漏洞
反序列化漏洞通常发生在未经过滤的用户输入被反序列化的情况下。如果攻击者能够控制反序列化的数据,他们可能会注入恶意对象,触发类中的特定方法或属性,导致意外行为。
分析 URL 参数
假设我们有一个URL参数?code=
,这通常用来传递用户输入。在反序列化时,如果$_GET['code']
包含序列化对象数据,就可能触发反序列化漏洞。
下面复制这个类的代码,改写成php
<?php
class xctf
{
public $flag = '111';
public function __wakeup()
{
exit('bad requests');
}
}
$a = new xctf();
print(serialize($a));
?>
攻击者可能会构造序列化对象数据,使__wakeup()
方法被调用,从而终止脚本执行。例如:
$payload = 'O:4:"xctf":1:{s:4:"flag";s:3:"111";}'; // 序列化对象数据
通过如下URL传递:
?code=O:4:"xctf":1:{s:4:"flag";s:3:"111";}
这里介绍一下序列化对象后字符串的含义:
O:表示对象Object
4:表示对象的字符串长度为4
“xctf”:表示对象的名称
1:表示对象里面有一个变量
s:表示变量的数据类型是string型
4:表示变量的名称长度为4
“flag”:表示变量的名称
s:表示变量类型
3:表示变量长度
“111”:是变量值
当序列化字符串中属性个数大于实际属性个数时,不会执行反序列化,从而跳过wakeup()
原本:O:4:"xctf":1:{s:4:"flag";s:3:"111";}
改为:O:4:"xctf":3:{s:4:"flag";s:3:"111";}
最后得出flag:cyberpeace{99ddb825a76b2f91147379adca6661df}
标签:WEB,攻防,对象,unserialize3,flag,111,wakeup,序列化,xctf From: https://blog.csdn.net/m0_74138139/article/details/140511655