ctf序列化

本文介绍了PHP中的序列化和反序列化概念,强调了`serialize()`和`unserialize()`函数的使用。在讨论中,作者提到了在解决xctf的Web_php_unserialize题目时遇到的问题,涉及`__construct()`, `__destruct()`, `__wakeup()`等魔术方法。题目解答关键在于理解`%00`截断和私有属性的访问。最终,作者通过修改源代码并利用base64编码找到了正确答案。" 82192933,5114835,使用Apache Curator实现Zookeeper分布式锁,"['分布式锁', 'zookeeper', 'Apache Curator']

一、基础
序列化和反序列化
php中的两个函数
序列化函数:serialize()
反序列化函数:unserialize()
当在php中创建了一个对象后,可以通过serialize()把这个对象转变成一个字符串,保存对象的值方便之后的传递与使用。
具体使用如下:

<?php
class xu{
	var $a='1';
}
$class1=new xu;
echo serialize($class1);
?>

运行结果:O:2:“xu”:1:{s:1:“a”;s:1:“1”;}
反序列化

<?php
$data='O:2:"xu":1:{s:1:"a";s:1:"1";}';
$class2=unserialize($data);
var_dump($class2);
?>

php中有一类特殊的方法叫“Magic function”, 这里我们着重关注一下几个:
构造函数__construct():当对象创建(new)时会自动调用。但在unserialize()时是不会自动调用的。
析构函数__destruct()和__wakeup():当对象被销毁时会自动调用。
题目:
xctf:Web_php_unserialize

<?php 
class Demo { 
    private $file = 'index.php';
    public function __construct($file) { 
        $this->file = $file; 
    }
    function __destruct() { 
        echo @highlight_file($this->file, true); 
    }
    function __wakeup() { 
        if ($this->file != 'index.php') { 
            //the secret is in the fl4
CTF比赛中,反序列化漏洞通常出现在应用程序将用户输入反序列化为对象时,未能正确验证输入内容,从而导致攻击者可以构造恶意输入,执行任意代码或实现其他形式的攻击。这类漏洞在PHP、Java、Python等语言中都有可能出现,具体取决于应用程序如何使用反序列化机制。 ### 解题思路分析:CTF序列化漏洞题目 `canyoufindme` #### 1. 理解题目背景 `canyoufindme` 是一道典型的反序列化漏洞利用题目。通常,这类题目会提供一段可读取用户输入并进行反序列化的代码,或者隐藏了反序列化操作的入口点。目标是通过构造恶意序列化数据,触发漏洞,从而获取flag或实现远程代码执行。 #### 2. 寻找反序列化入口点 在题目提供的源码中,通常会出现 `unserialize()`(PHP)、`ObjectInputStream.readObject()`(Java)或 `pickle.loads()`(Python)等函数。例如,在PHP中: ```php $data = unserialize($_GET['data']); ``` 这类代码是典型的反序列化操作,攻击者可以通过构造恶意的序列化数据来控制程序行为。 #### 3. 构造恶意序列化对象 反序列化漏洞利用的核心在于构造一个恶意对象,该对象在反序列化时会触发某些危险操作。例如,在PHP中可以利用魔术方法 `__wakeup()` 或 `__destruct()`,这些方法在反序列化时自动调用。 假设题目中存在一个类,其 `__destruct()` 方法会执行某些危险操作,如删除文件或执行命令: ```php class VulnerableClass { public $file = 'index.php'; public function __destruct() { unlink(dirname(__FILE__) . '/' . $this->file); } } ``` 攻击者可以构造如下序列化字符串: ```php $payload = 'O:16:"VulnerableClass":1:{s:4:"file";s:9:"flag.txt";}'; ``` 当该字符串被反序列化时,`__destruct()` 方法将尝试删除 `flag.txt` 文件,这可能被用于触发某些特定条件。 #### 4. 利用反序列化链(Gadget Chain) 在更复杂的题目中,可能需要使用反序列化链(Gadget Chain)来实现远程代码执行。Gadget Chain 是指通过多个类的魔术方法调用链,最终触发危险函数(如 `system()` 或 `eval()`)。 例如,在PHP中,可以利用 `phar://` 协议结合反序列化漏洞触发文件操作,进而执行任意命令。 #### 5. 挖掘隐藏的flag 在某些情况下,flag可能被隐藏在文件系统中,或者需要通过特定的反序列化操作才能触发flag的输出。例如,构造一个对象,其属性包含flag路径,并在反序列化时自动读取并输出flag。 #### 6. 绕过过滤机制 题目可能对用户输入进行一定的过滤,如过滤特殊字符、限制输入长度或使用白名单机制。此时需要尝试绕过这些限制,例如使用编码转换、多层嵌套对象或利用协议特性(如 `phar://`)。 ### 示例代码:构造PHP反序列化payload ```php class Exploit { public $command = "cat /flag"; public function __destruct() { system($this->command); } } $payload = serialize(new Exploit()); echo $payload; ``` 将生成的序列化字符串作为参数传递给存在漏洞的反序列化函数,即可触发命令执行。 ### 总结 在 `canyoufindme` 这类题目中,关键在于识别反序列化入口点、构造恶意对象,并利用魔术方法或Gadget Chain 实现攻击目标。同时,需要关注题目中可能存在的过滤机制,并尝试绕过这些限制。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值