NEUQCSA Summer Camp Closing Competition Writeup

发布于 2022-08-27  141 次阅读


neuqcsa recruitment competition

本人第一次打CTF比赛(虽然是校赛),心情还是很激动的,特此记录第一篇真正意义上的题解报告。

一、TIme can be over.....or not?

<?php
highlight_file(__FILE__);
include "fl4g.php";
$NEUQCSA = $_POST['ctf'];
$time = date("H");
$timme = date("d");
$timmme = date("i");
if(($time > "24") or ($timme > "31") or ($timmme > "60")){
    echo $fl4g;
}else{
    echo "Try harder!";
}
set_error_handler(
    function() use(&$fl4g) {
        print $fl4g;
    }
);
$fl4g .= $NEUQCSA;
?>

先关注这个if函数,正常来说这三个条件均不满足现实条件,因此要从后面入手

第十八行处的$fl4g .= $NEUQCSA;对POST传入的ctf变量进行拼接,显然传入的不一定非要是字符串

只要POST传入一个数组即可发生错误,运行set_error_handler函数,从而打印出flag

二、我们ikun不惹事,也撅不怕事!

进入后在网页注释中寻找源码<!-- can can source.php -->

在checkFile(&$page) 部分,会创建一个内容为 ('!','@','$','%','^','&','*','(',')','-') 的数组,并且随机选择一个作为$ext

白名单中可以发现提示hint.php,flag在flag.php中

接着观察源码,之后的操作会对传入的参数进行切割,从开头截取到$ext第一次出现的位置,并且判断截取后的内容是否在白名单内(source/hint)

因此,我们需要先传入source.php!,保证切割后的内容在白名单内(!可以换成数组内的任意一个符号,同时这个请求需要重复多次执行,即便payload正确也只有1/10的概率返回flag(还好不是0.6%)(最好加个保底,累计到多少次一定返回flag))

再传入我们要获取的flag,但source.php!/flag返回值为空,多次向上查找得到flag

81.70.101.23:8801/source.php?file=source.php!../../../../../flag