【RCE漏洞】黑客如何隔空控制你的电脑?

news/2025/3/10 22:52:08/文章来源:https://www.cnblogs.com/o-O-oO/p/18763922

你有没有想过,为什么黑客能够坐在千里之外,却能控制你的电脑或服务器?这就是今天我们要聊的"远程代码执行"(Remote Code Execution,简称RCE)漏洞的魔力。让我用通俗的语言,把这个听起来很复杂的安全问题讲清楚。

一、什么是远程代码执行(RCE)?

简单来说,远程代码执行就是黑客能够"遥控"你的电脑或服务器,让它执行黑客想要运行的指令,而这些指令本来是未经你授权的。就像有人偷偷拿到了你家的遥控器,可以随意打开关闭你家的电器一样。

想象一下这个场景:你开发了一个网站,允许用户输入他们的名字,然后网站会显示"你好,XXX"。看起来很简单对吧?但如果你的代码是这样写的:

var name = request.get("name")
var cmd = "echo 'Hello " + name + "'"
RUN_CMD(cmd)

表面上看,这段代码只是获取用户输入的名字,然后执行一个命令来打印"Hello [名字]"。
但是,如果有人不输入正常的名字,而是输入类似"; rm -rf /* ;"'这样的恶意内容,那么执行的命令就变成了:

echo 'Hello '; rm -rf /* ;''

这个命令会先打印"Hello",然后执行rm -rf /*,这是一个危险的命令,会尝试删除系统中所有文件!这就是最简单的远程代码执行漏洞示例。

二、RCE与命令注入:一家亲还是远亲?

在讨论安全问题时,我们经常听到"远程代码执行"和"命令注入"这两个术语。它们之间有什么区别呢?

区别在于执行的目标和权限

远程代码执行(RCE)主要关注的是在操作系统层面执行代码,比如运行whoami命令来查看当前用户身份。RCE通常涉及到对操作系统底层功能的控制,如调试、分析系统信息等。

命令注入则主要是在应用程序层面执行相关代码,比如运行phpinfo()来获取PHP环境信息。命令注入通常是因为应用程序对用户提交的数据过滤不严格,导致用户能够注入恶意命令。

简单说:

  • RCE是控制整个系统
  • 命令注入是控制某个应用程序

但它们常常交叉重叠

实际上,这两者经常是交叉的。一个命令注入漏洞如果能够执行系统命令,那么它也是一种RCE漏洞。
比如:

$user_input = $_GET['input'];
system('whoami ' . $user_input);

如果用户能控制$_GET['input']的值,并使其执行系统命令,那么这既是一个命令注入漏洞,又是一个RCE漏洞。但如果只能在应用程序层面执行命令,不能影响操作系统,那就只能称为命令注入漏洞。

三、常见的可导致RCE的危险函数

不同的编程语言有不同的函数,如果使用不当,都可能导致RCE漏洞。

PHP中的危险函数

远程代码执行:

eval() 
# 直接把字符串当作PHP代码执行
assert() 
# 本意是检查断言是否为假,但也可以执行代码
preg_replace() 
# 用于正则表达式搜索和替换,某些用法可执行代码
call_user_func() 
# 将第一个参数作为函数名调用
call_user_func_array() 
# 调用回调函数,并传入参数数组
array_map() 
# 为数组的每个元素应用回调函数

远程命令执行:

exec() 
# 执行外部程序
passthru() 
# 执行外部程序并显示原始输出
proc_open() 
# 执行命令并打开文件指针用于输入/输出
shell_exec() 
# 通过shell执行命令并返回完整输出
system() 
# 执行外部程序并显示输出

Python中的危险函数

远程代码执行:

eval() 
# 执行字符串表达式并返回结果
exec() 
# 执行存储在字符串中的Python语句
pickle.loads() 
# 反序列化pickle对象,可能执行任意代码
getattr() 
# 获取对象属性,如果不安全可能执行不安全方法

远程命令执行:

os.system() 
# 执行系统命令
os.popen() 
# 从命令打开管道
subprocess.call()
# 执行命令

Java中的风险点

Java的设计使得直接执行字符串形式的代码比较困难,但它有其他风险点:

反序列化漏洞:Java中最著名的RCE风险来自不安全的反序列化操作。比如Apache Commons Collections库的某些版本存在的漏洞,攻击者可以构造特殊的序列化对象,在反序列化时触发代码执行。

命令执行:

Runtime.getRuntime().exec()
# 执行系统命令
ProcessBuilder()
# 创建操作系统进程

四、深入理解:用户态、系统调用与内核态

要理解RCE漏洞的本质,我们需要了解一些操作系统的基本概念。

用户态与内核态

现代操作系统通常分为两种运行模式:

用户态:普通程序运行的模式,对系统资源的访问受到限制,不能直接操作硬件或执行特权指令。

内核态:操作系统核心部分运行的模式,拥有对硬件的完全访问权限,可以执行任何指令。

这种设计是为了保护系统不受普通程序的影响,确保系统的稳定性和安全性。

系统调用:搭建桥梁

那么普通程序需要执行一些需要特权的操作(如读写文件、网络通信)怎么办呢?这就需要通过"系统调用"(syscall)来实现。

系统调用就像是用户态和内核态之间的一座桥梁,普通程序可以通过它请求操作系统帮忙完成需要特权的操作。系统调用确保了即使在执行这些高权限操作时,系统的安全性也得到了保障。

举个例子,当你在C语言中使用open()函数打开一个文件时,实际上是在请求操作系统通过系统调用来完成这个操作。
这个过程是这样的:

  1. 程序调用open()函数
  2. 该函数内部会触发系统调用,从用户态切换到内核态
  3. 操作系统在内核态中执行打开文件的操作
  4. 操作完成后返回用户态,并将结果返回给程序

例子:创建文件的系统调用

#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>int main() {// 打开文件int file_descriptor = open("example.txt", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);if (file_descriptor == -1) {perror("Error opening file");return1;}// 写入文件constchar *text = "Hello, System Call!";ssize_t bytes_written = write(file_descriptor, text, strlen(text));if (bytes_written == -1) {perror("Error writing to file");close(file_descriptor);return1;}// 关闭文件close(file_descriptor);return0;
}

在这个例子中,open()、write()和close()都是系统调用。程序通过这些系统调用请求操作系统执行打开文件、写入内容和关闭文件的操作。

五、RCE漏洞与Shell的关系

大多数RCE漏洞的威力来自于它们能够访问系统的Shell(命令解释器)。Shell是用户与操作系统交互的接口,能够执行各种命令。

当应用程序通过Shell执行外部命令时,如果这些命令包含未经过滤的用户输入,就可能导致RCE漏洞。恶意构造的输入被Shell解释执行,从而允许攻击者运行任意代码。

Fork与Execve:进程创建的双剑客

在Unix/Linux系统中,进程的创建和命令的执行通常通过fork()和execve()系统调用实现:

  • fork()创建一个新的进程,它是当前进程的副本。

  • execve()用一个新的程序替换当前进程的内容。

这两个系统调用经常一起使用来执行命令。
例如,当你在终端输入bash -c whoami时,内部发生了什么?

  1. Shell进程调用fork()创建一个新进程(PID: 52350)

  2. 新进程调用execve()加载并执行bash程序

  3. bash程序接收-c whoami参数,意味着它需要执行whoami命令

  4. bash进程再次调用fork()创建另一个新进程(PID: 52796)

  5. 新进程调用execve()加载并执行/bin/whoami程序

  6. /bin/whoami程序执行完毕,返回结果

  7. 所有子进程依次退出

这个过程涉及多次进程创建和程序执行,使用了多个系统调用。正是这些机制使得RCE漏洞如此危险,因为它们允许攻击者利用系统本身的功能来执行任意命令。

六、受限环境下的RCE利用

有时候,攻击者可能面临受限的环境,例如沙箱环境、受限的服务器配置或权限受限的账户。在这些情况下,直接执行任意命令可能不可行,但攻击者仍然可以通过一些技巧来实现RCE。

利用现有命令的特殊参数

在一个只允许执行特定命令(如curl)的环境中,攻击者可能利用该命令的功能和参数来绕过限制。例如:

curl https://example.com/file.txt -o >(cat)

这个命令使用了>(cat)这种命令替换语法,它将cat命令的输出作为文件路径传递给-o参数。这种方法可以被用来绕过写入文件的限制,直接在标准输出上显示下载的内容,从而在受限环境中实现间接的RCE。

总结:RCE漏洞的本质

远程代码执行漏洞的本质是允许攻击者在未经授权的情况下,在目标系统上执行任意代码或命令。这通常是由于应用程序对用户输入的处理不当,例如将用户输入直接拼接到命令字符串中,然后执行。

当我们不能执行任意进程的时候(我们的输入只是某个特定进程的输入的时候),突破口取决于使用的进程程序本身的参数是否能被利用。这就像是即使你不能直接控制汽车的方向盘,但如果你能控制导航系统,也可能间接影响汽车的行驶方向。

如何防范RCE漏洞?

  • 避免直接执行用户输入:永远不要将未经过滤的用户输入直接传递给能执行代码或命令的函数。
  • 使用参数化执行:如果必须执行外部命令,使用参数化的方式而不是字符串拼接。
  • 实施输入验证:对所有用户输入进行严格的验证和过滤,只允许预期的格式和内容。
  • 最小权限原则:应用程序应以最小所需权限运行,减少潜在漏洞的影响范围。
  • 定期更新和补丁:确保所有软件和库都及时更新,修复已知的安全漏洞。

RCE漏洞虽然危险,但通过正确的安全实践,我们可以有效地防范它们。理解它们的工作原理是保护我们系统的第一步。就像了解小偷是如何撬门的,才能更好地加固我们的家门一样。

总之,远程代码执行漏洞是黑客手中的一把"遥控器",而我们的目标是确保这个遥控器永远不会落入他们手中,或者即使落入他们手中,也无法控制我们的系统。

原创 HW安全之路

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/897025.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android Studio的配置学习以及整日的总结

所花时间:5h 代码量(行):130 博客量:6 了解的知识点: 首先,今天对于Android Studio的整体配置有了一个新的认识,原因是AS的SDK和虚拟机AVD的默认安装位置在C盘 还有环境变量gradle的下载配置,这些都要了解明白是干什么的,下面我具体的说一下:安装好AS,下载好gradle…

额外添加 _网卡的配置,网络的基础的概念

配置好网卡,上网用 修改网络模式,修改静态ip,动态ip获取方式 system control 系统控制,systemctl 查看当前的上网信息 1.确保你的机器,是连接的网络的,是插上了网线的。(模拟了物理服务器的软件是什么?看你的虚拟的机器(vmware))3.编辑网卡的配置文件 编辑网卡配置文…

用集合说明可以用与或非来表示异或

用集合说明可以用与或非来表示异或 异或(XOR,记作 A⊕BA⊕B)可以通过与(AND,记作 ∧∧)、或(OR,记作 ∨∨)、非(NOT,记作 )的组合来表示。以下是两种常见的表达式形式: 1. 直接组合形式 异或的逻辑可以描述为:当且仅当 A 和 B不同时为真时输出真。 即:A B A⊕B0…

2025.3.10

1,访问PHP文件路径不能出现中文,会显示0行错误 2,<br>换行,<hr>分割线 3,“ ”解析并输出,‘ ’直接输出 4,字符串拼接用. 5,输出 echo "" print_r() 专门输出数组的格式 varr_dump() 数据类型和值6,二维数组

4.9.1 分布偏移的类型

下面介绍一下坐标系中协变量偏移的情况如上图,绿色的曲线是正确的曲线。我们训练的数据是左图,测试的数据是右图。按照左图的数据学习是学不出来绿色曲线的,就会导致右图的数据的准确率很低,这就是协变量偏移

贴现率8%和12%分别计算每个项目的净现值

使用贴现率8%和12%分别计算每个项目的净现值(NPV) JAVA实现 净现值求解实现代码(JAVA):package com.zuoye.Three;import java.math.BigDecimal;public class TieXianLu { public static void main(String[] args) throws Exception { //数据集合 int[] ma…

Netty基础—1.网络编程基础一

大纲 1.什么是OSI开放系统互连 2.OSI七层模型各层的作用 3.TCP/IP协议的简介 4.TCP和UDP的简介 5.TCP连接的三次握手 6.TCP连接的四次挥手 7.TCP/IP中的数据包 8.TCP通过确认应答与序列号提高可靠性 9.HTTP请求的传输过程 10.HTTP协议报文结构 11.Socket、短连接、长连接、网络…

硅基流动+Chatbox实现deepseek R1使用自由

解锁 DeepSeek R1 全能力:高性价比AI对话全流程指南🌟 用最低成本体验顶尖开源模型,对话成本低至 2 分钱/次!一、注册 SiliconFlow 领取千万Tokens▶️ 操作步骤:点击专属链接注册:https://cloud.siliconflow.cn/i/KoKtjLvD 手机验证码登录 → 立即获得 2000万 Tokens(…

3.1.1 线性回归的基本元素

看看批量梯度下降和小批量梯度下降的图形,与我们的理解是相符的注意到小批量梯度下降不是严格单减的,只是趋势是单调减少的(图中的纵轴Cost指的是对于整个训练数据的损失) 每次的批量的大小显然是一个超参数。当批量大小为\(1\)的时候叫做随机梯度下降,当批量大小为\(m\)的…

报错

SSM整合报org.springframework.beans.factory.NoSuchBeanDefinitionException 显示没有找到serviceImpl对应的bean,但@autowired显示正常原因:web.xml文件中没有配置监听器ContextLoaderListener,导致web服务器启动后,没有读取Spring的配置文件,使得bean没有注入到Spring的…

ssh登录ubuntu后终端不显示颜色

1、在 ~/.bashrc 文件找到 “#force_color_prompt=yes”,去掉前面的注释; 2、在 ~/.bash_profile文件种添加以下脚本,并执行 “source ~/.bash_profile”# if running bash if [ -n "$BASH_VERSION" ]; then # include .bashrc if it exists if [ -f "$…