深入探讨RCE漏洞及其防御策略

1. RCE漏洞

1.1. 漏洞原理

远程代码执行(RCE)漏洞允许攻击者远程注入并执行操作系统命令或代码,从而控制后台系统。

1.2. 漏洞产生条件

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

1.3. 漏洞挖掘

命令执行和代码执行漏洞通常需要结合网站实际情况进行分析。如果网站只是一个简单的静态页面,通常不存在此类漏洞。如果网站包含用户输入、调用接口等功能,可能存在漏洞,特别是通过代码审计或访问源代码能够有效挖掘这些漏洞。

1.4. 漏洞分类

1.4.1. 命令执行

1.4.1.1. 漏洞原理

由于应用系统需要提供指定的远程命令操作接口(如防火墙的WEB界面中提供Ping操作),如果设计者未对这些功能进行严格控制,可能导致攻击者提交恶意命令,从而控制服务器。

1.4.1.2. 命令执行危险函数
  • PHP:exec、shell、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.1.3. 漏洞检测
  • 白盒:代码审计
  • 黑盒:使用漏洞扫描工具、公开漏洞信息,手工检查功能点及参数值,关注是否涉及相关漏洞函数。如参数值加密,则需进行解密。

1.4.2. 代码执行

1.4.2.1. 漏洞原理

与命令执行漏洞类似,代码执行漏洞源于应用程序需要执行用户输入的部分代码。开放的代码执行接口需要严格控制,以避免出现漏洞。

1.4.2.2. 代码执行危险函数
  • PHP: eval、assert、preg_replace()、+/e模式(PHP版本 < 5.5.0)
  • JavaScript: eval
  • VBScript:Execute、Eval
  • Python: exec
1.4.2.3. 漏洞检测
  • 白盒:代码审计
  • 黑盒:使用漏洞扫描工具、公开漏洞信息,手工检查功能点及参数值,关注是否涉及相关漏洞函数。如参数值加密,则需进行解密。

1.5. 命令执行和代码执行区别

命令执行调用操作系统命令进行执行,代码执行调用服务器网站的代码进行执行。

2. 命令执行

2.1. 命令执行函数介绍

参考链接

2.1.1. system函数

执行系统命令,并输出结果,返回最后一行的结果字符串,执行失败返回false。

<?php
highlight_file(__FILE__);
system('pwd');
?>

2.1.2. exec函数

执行系统命令,不输出结果,返回最后一行的结果,可结合output输出结果。

<?php
highlight_file(__FILE__);
exec('pwd', $output);
var_dump($output);
?>

2.1.3. passthru函数

调用命令并输出结果,不返回值。

<?php
highlight_file(__FILE__);
passthru('ls');
?>

2.1.4. shell_exec函数

不输出结果,返回执行结果。使用反引号(``)时调用此函数。

<?php
highlight_file(__FILE__);
var_dump(shell_exec('ls'));
?>

2.1.5. 总结

还有其他命令执行函数,可以自行搜索学习。

2.2. 命令执行前置基础

在进行命令执行之前,需了解基本的Windows和Linux命令。

2.2.1. Windows基础命令

常用的cmd命令:

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

2.2.2. Linux命令

常用的Linux命令:

cd                  # 切换目录
ls                  # 显示当前目录下的文件
ifconfig            # 查看IP地址
cat /etc/passwd     # 查看password文件内容
id                  # 查看当前用户的id号
cat /etc/group      # 查看用户组文件内容
pwd                 # 显示当前目录
uname -a            # 查看系统版本
natstat -pantu      # 查看服务器端口信息
netstat -nr         # 查看网关和路由

2.2.3. 拼接符

|     # 只执行|后面的语句
||    # 前面命令失败时执行后面的语句
&     # 前后命令都执行
&&    # 前面命令成功时执行后面的语句
;     # 前后都执行

2.3. 命令执行案例

使用DVWA靶场进行演示。

2.3.1. 乱码解决

在DVWA\dvwa\includes目录下,将所有“charset=utf-8”替换为“charset=gb2312”。

修改编码

2.3.2. Low级别

2.3.2.1. 介绍

Low级别接受用户输入的IP,执行ping命令,对输入内容无过滤。

2.3.2.2. 操作
  1. 使用拼接符“|”,输入“127.0.0.1 | net user”。

使用 | 拼接符

  1. 使用拼接符“&&”,输入“127.0.0.1 && net user”。

使用 && 拼接符

2.3.3. Medium级别

2.3.3.1. 介绍

Medium级别过滤“&&”和“;”,可使用其他拼接符。

2.3.3.2. 操作

使用拼接符“&”,输入“127.0.0.1 & net user”。

使用 & 拼接符

2.3.4. High级别

2.3.4.1. 介绍

High级别过滤“| ”。

2.3.4.2. 操作

绕过空格过滤,输入“127.0.0.1|net user”。

绕过空格过滤

2.4. 命令执行总结

示例中使用“net user”命令,其他命令也可测试。确保开发过程中对参数进行严格限制,防止此类漏洞。

3. 代码执行

3.1. 代码执行函数介绍

3.1.1. ${} 执行代码

将中间的PHP代码进行解析。

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

3.1.2. eval函数

将字符串当作代码执行,需传入完整语句,以分号结尾。

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

3.1.3. assert函数

判断是否为字符串,如果是则执行代码。PHP7.0.29之后版本不支持动态调用。

低版本
<?php 
assert($_POST['a']);
?>
7.0.29之后
<?php
$a = 'assert';
$a(phpinfo());
?>

3.1.4. array_map函数

为数组的每个元素应用回调函数。

<?php
highlight_file(__FILE__);
$a = $_GET['a'];
$b = $_GET['b'];
$array[0] = $b;
$c = array_map($a, $array);
?>
构建的payload
?a=assert&b=phpinfo();

3.1.5. 总结

代码执行函数众多,可自行研究学习。

3.2. 代码执行前置基础

确保了解并掌握代码执行函数和基础代码执行技巧。

3.3. 代码执行案例

以低版本DVWA为例展示常见代码执行漏洞。

3.3.1. Low级别

3.3.1.1. 介绍

Low级别代码执行直接执行用户输入的PHP代码。

3.3.1.2. 操作
  1. 输入PHP代码,如${phpinfo()},进行代码执行。

Low级别代码执行

3.3.2. Medium级别

3.3.2.1. 介绍

Medium级别代码执行对输入代码进行一定过滤,但仍可绕过。

3.3.2.2. 操作
  1. 使用变种的eval函数进行代码执行。

Medium级别代码执行

3.3.3. High级别

3.3.3.1. 介绍

High级别代码执行对输入代码进行更严格的过滤。

3.3.3.2. 操作
  1. 通过调试和分析,找到未过滤的执行函数进行代码执行。

High级别代码执行

3.4. 代码执行总结

代码执行漏洞需对用户输入进行严格过滤和验证,避免直接执行用户输入的代码。

4. 防御与总结

4.1. 防御措施

  1. 禁用或严格控制危险函数。
  2. 对用户输入进行严格过滤和验证。
  3. 使用安全编程规范和最佳实践。
  4. 定期进行代码审计和安全测试。
  5. 及时更新和修补系统漏洞。

4.2. 总结

命令执行和代码执行漏洞是常见且危害严重的安全漏洞。通过合理的防御措施和代码审计,可以有效预防和应对此类漏洞。定期进行安全测试和漏洞修复是保障系统安全的重要措施。

  • 14
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值