攻防世界WEB(新手模式)3-unserialize3

进题目,可以发现这是一个反序列化的题目。

这段代码定义了一个名为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}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值