RCE漏洞原理及危害、相关危险函数
字数 1251 2025-08-10 17:51:46

RCE漏洞原理、危害及防御措施

一、RCE漏洞概述

RCE(Remote Code/Command Execute)漏洞是指由于程序中预留了执行代码或者命令的接口,并且提供了给用户使用的界面,导致被黑客利用控制服务器的安全漏洞。

RCE漏洞分为两种主要类型:

  1. 代码执行漏洞
  2. 命令执行漏洞

二、代码执行漏洞

原理

传入PHP代码到执行函数的变量,客户端可控,并且没有做严格的过滤,攻击者可以随意输入他想执行的代码,这些代码会在服务端执行。

危害

  • 攻击者可以通过RCE继承web用户的权限执行PHP代码
  • 如果web权限较高,可以读写目标服务器任意文件内容
  • 可能控制整个网站

相关危险函数

函数 描述
eval() 将字符串当作PHP代码执行
assert() 将字符串当作PHP代码执行
preg_replace() 将字符串正则匹配后替换(特别是使用/e修饰符时)
call_user_func() 回调函数
array_map() 回调函数

三、命令执行漏洞

原理

应用在调用系统命令函数时,将用户输入作为系统命令的参数拼接到命令行中,如果没有对用户输入进行过滤,就会造成命令执行漏洞。

危害

  1. 继承web服务器程序权限执行系统命令
  2. 继承web服务器权限读写文件
  3. 反弹shell
  4. 控制整个网站或服务器

相关危险函数

函数 描述
system() 将字符串当作OS命令执行
exec() 将字符串当作OS命令执行(只输出最后一行)
shell_exec() 将字符串当作OS命令执行
passthru() 将字符串当作OS命令执行
popen() 执行OS命令并将结果输出到文件
`(反引号) 执行OS命令

四、DVWA命令注入实例分析

测试过程

在DVWA的命令注入模块中,输入IP地址后提交,程序会执行ping命令:

127.0.0.1 & whoami
127.0.0.1 && whoami
127.0.0.1 | whoami
127.0.0.1 || whoami
127.0.0.1; whoami

这些命令尝试执行多条指令,测试命令注入可能性。

源代码分析

<?php
if(isset($_POST['Submit'])) {
    $target = $_REQUEST['ip'];
    
    if(stristr(php_uname('s'), 'Windows NT')) {
        $cmd = shell_exec('ping '.$target);
    } else {
        $cmd = shell_exec('ping -c 4 '.$target);
    }
    
    echo "<pre>{$cmd}</pre>";
}
?>

代码执行流程:

  1. 检查是否点击了提交按钮
  2. 通过GPC方式获取IP地址赋值给$target变量
  3. 拼接命令"ping $target"并由shell_exec()执行
  4. 当用户提交时,服务器执行拼接后的命令

五、防御措施

  1. 避免使用危险函数

    • 尽量避免使用eval等危险函数
    • 如果必须使用,要进行严格的过滤
  2. 函数使用规范

    • 放弃使用preg_replace()函数的/e修饰符
    • 在php.ini中禁用危险函数:
      disable_functions=system,assert
      
  3. 输入处理

    • 参数值尽量用引号包裹
    • 在拼接前调用addslashes()进行转义
  4. 其他措施

    • 实施最小权限原则
    • 使用白名单验证用户输入
    • 对命令参数进行严格过滤和转义
    • 使用安全的替代函数

通过以上措施,可以有效降低RCE漏洞的风险,保护服务器安全。

RCE漏洞原理、危害及防御措施 一、RCE漏洞概述 RCE(Remote Code/Command Execute)漏洞是指由于程序中预留了执行代码或者命令的接口,并且提供了给用户使用的界面,导致被黑客利用控制服务器的安全漏洞。 RCE漏洞分为两种主要类型: 代码执行漏洞 命令执行漏洞 二、代码执行漏洞 原理 传入PHP代码到执行函数的变量,客户端可控,并且没有做严格的过滤,攻击者可以随意输入他想执行的代码,这些代码会在服务端执行。 危害 攻击者可以通过RCE继承web用户的权限执行PHP代码 如果web权限较高,可以读写目标服务器任意文件内容 可能控制整个网站 相关危险函数 | 函数 | 描述 | |------|------| | eval() | 将字符串当作PHP代码执行 | | assert() | 将字符串当作PHP代码执行 | | preg_replace() | 将字符串正则匹配后替换(特别是使用/e修饰符时) | | call_user_func() | 回调函数 | | array_map() | 回调函数 | 三、命令执行漏洞 原理 应用在调用系统命令函数时,将用户输入作为系统命令的参数拼接到命令行中,如果没有对用户输入进行过滤,就会造成命令执行漏洞。 危害 继承web服务器程序权限执行系统命令 继承web服务器权限读写文件 反弹shell 控制整个网站或服务器 相关危险函数 | 函数 | 描述 | |------|------| | system() | 将字符串当作OS命令执行 | | exec() | 将字符串当作OS命令执行(只输出最后一行) | | shell_exec() | 将字符串当作OS命令执行 | | passthru() | 将字符串当作OS命令执行 | | popen() | 执行OS命令并将结果输出到文件 | | ` (反引号) | 执行OS命令 | 四、DVWA命令注入实例分析 测试过程 在DVWA的命令注入模块中,输入IP地址后提交,程序会执行ping命令: 这些命令尝试执行多条指令,测试命令注入可能性。 源代码分析 代码执行流程: 检查是否点击了提交按钮 通过GPC方式获取IP地址赋值给$target变量 拼接命令"ping $target"并由shell_ exec()执行 当用户提交时,服务器执行拼接后的命令 五、防御措施 避免使用危险函数 : 尽量避免使用eval等危险函数 如果必须使用,要进行严格的过滤 函数使用规范 : 放弃使用preg_ replace()函数的/e修饰符 在php.ini中禁用危险函数: 输入处理 : 参数值尽量用引号包裹 在拼接前调用addslashes()进行转义 其他措施 : 实施最小权限原则 使用白名单验证用户输入 对命令参数进行严格过滤和转义 使用安全的替代函数 通过以上措施,可以有效降低RCE漏洞的风险,保护服务器安全。