RCE 漏洞审计

news2024/12/28 20:58:48

Command Injection

命令注入(Command Injection)是一种安全漏洞,命令注入攻击的目的是,在易受攻击的应用程序中注入和执行攻击者指定的命令。在这种情况下,执行不需要的系统命令的应用程序就像一个伪系统外壳,攻击者可以将其作为任何授权的系统用户使用。但是,执行命令的权限和环境与 web 服务相同。

在大多数情况下,由于缺少正确的输入数据验证,攻击者对例如表单、cookies、HTTP标头等进行操控,使得命令注入攻击成为可能。此攻击也称为“远程命令执行 (RCE)”。

通过 RCE 远程查找操作系统上 web 服务的用户以及机器主机名。

low

This allows for direct input into one of many PHP functions that will execute commands on the OS. It is possible to escape out of the designed command and executed unintentional actions. 这允许直接输入到许多将在操作系统上执行命令的 PHP 函数之一。通过在请求中添加内容,可以在成功执行命令后运行其他命令,从而可能逃离预设的命令并执行意外的操作。 This can be done by adding on to the request, "once the command has executed successfully, run this command". 这可以通过以下方式实现:“一旦命令成功执行,就运行这个命令”。

代码审计:

源码如下,php_uname(mode) 函数会返回运行php的操作系统的相关描述,当参数是 “s” 时操作系统名称。stristr() 函数搜索字符串在另一字符串中的第一次出现,返回字符串的剩余部分(从匹配点),未找到所搜索的字符串返回 FALSE。在这里使用者 2 个函数,目的是为了区分 DVWA 搭建在什么系统上,因为 Windows 系统和 Linux 的 Ping 还是有区别的。不过对于最重要的传入的 ping 命令的参数 target,并没有进行任何过滤。

<?php
2
3if (isset($_POST['Submit'])) {
4    // 检查是否存在表单 POST 提交(即提交按钮被点击)
5
6    // 获取用户输入的 IP 地址
7    $target = $_REQUEST['ip'];
8
9    // 根据操作系统类型执行不同的 ping 命令
10    if (stristr(php_uname('s'), 'Windows NT')) {
11        // 如果当前操作系统为 Windows NT
12        
13        // 执行 ping 命令
14        $cmd = shell_exec('ping ' . $target);
15        // 将 ping 命令的结果存储在变量 $cmd 中
16    } else {
17        // 如果当前操作系统为类 Unix(*nix)系统
18        
19        // 执行 ping 命令,并发送 4 个 ICMP 包
20        $cmd = shell_exec('ping -c 4 ' . $target);
21    }
22
23    // 将 ping 命令的结果输出到页面上,供用户查看
24    echo "<pre>{$cmd}</pre>";
25    // 使用 <pre> 标签将变量 $cmd 中存储的 ping 命令结果格式化后展示在 HTML 页面上
26}
27?>

渗透测试:可以看到这里直接将target 变量放入 shell_exec()执行ping命令,没有进行任何过滤,用户端可以直接拼接特定的命令,来执行并获取想要的信息。

在文本框中输入ping 127.0.0.1 & whoami 会与ping -c 4拼接在一起,然后当做命令执行。

这就给了我们很大的操作空间。

可以看到这里我加上 & whoami 后爆出了当前用户名。

这里只要有权限很多命令都是可以执行的,尤其是读取文件。

Medium

The developer has read up on some of the issues with command injection, and placed in various pattern patching to filter the input. However, this isn't enough.Various other system syntaxes can be used to break out of the desired command.

开发者已经阅读了一些关于命令注入问题的资料,并放置了各种模式修补来过滤输入。但是,这还不够。可以使用其他各种系统语法来突破预期的命令。

代码审计:

<?php
2
3// 检测表单中"Submit"按钮是否被点击
4if (isset($_POST['Submit'])) {
5
6    // 获取用户输入的 IP 地址
7    $target = $_REQUEST['ip'];
8
9    // 定义黑名单字符及替换规则
10    $substitutions = array(
11        '&&' => '',
12        ';'  => '',
13    );
14
15    // 防止命令注入,过滤目标地址中的黑名单字符
16    $target = str_replace(array_keys($substitutions), $substitutions, $target);
17
18    // 根据操作系统类型执行不同的 ping 命令
19    if (stristr(php_uname('s'), 'Windows NT')) {
20        // 如果当前操作系统为 Windows
21        $cmd = shell_exec('ping ' . $target);
22        // 执行 Windows 系统下的 ping 命令并将结果赋值给变量 $cmd
23    } else {
24        // 如果当前操作系统为类 Unix(*nix)系统
25        $cmd = shell_exec('ping -c 4 ' . $target);
26        // 在 *nix 系统下执行发送 4 个 ICMP 包的 ping 命令并将结果赋值给变量 $cmd
27    }
28
29    // 将 ping 命令的结果格式化输出到 HTML 页面上
30    echo "<pre>{$cmd}</pre>";
31}
32?>

渗透测试:

这里命令行注入也是一种注入,所以和sql 注入与xss 一样,这里的防护手段主要是过滤,黑名单机制。

可以看到这里把&& 和; 替换成了'',所以这里也可以用&| 、||

我们可以看到不管ping是否执行成功,第二条命令都顺利执行了。

High

In the high level, the developer goes back to the drawing board and puts in even more pattern to match. But even this isn't enough.

在高级别中,开发者回到起点并添加了更多匹配模式。但即使这样也还不够。

The developer has either made a slight typo with the filters and believes a certain PHP command will save them from this mistake.

开发者可能在过滤器中犯了一个轻微的拼写错误,并认为某个 PHP 命令将拯救他们免于这个错误。

代码审计:

相比 Medium 级别的代码,High 级别的代码进一步完善了过滤的黑名单。

<?php
2
3// 检测表单中"Submit"按钮是否被点击
4if (isset($_POST['Submit'])) {
5
6    // 获取用户输入的 IP 地址并去除首尾空白字符
7    $target = trim($_REQUEST['ip']);
8    // 从请求中获取名为 "ip" 的参数,并通过 trim 函数去除首尾空白字符后赋值给变量 $target,用于存储要 ping 的目标地址。
9
10    // 定义黑名单字符及替换规则
11    $substitutions = array(
12        '&'   => '',
13        ';'   => '',
14        '| '  => '',
15        '-'   => '',
16        '$'   => '',
17        '('   => '',
18        ')'   => '',
19        '`'   => '',
20        '||'  => '',        
21    );
22    // 创建一个数组,包含可能用于命令注入的特殊字符,并将它们替换为空字符串以增强安全性。
23
24    // 删除目标地址中的黑名单字符
25    $target = str_replace(array_keys($substitutions), $substitutions, $target);
26    // 使用 str_replace() 函数过滤掉目标地址中的黑名单字符,防止潜在的命令注入攻击。
27
28    // 根据操作系统类型执行不同的 ping 命令
29    if (stristr(php_uname('s'), 'Windows NT')) {
30        // 如果当前操作系统为 Windows
31        $cmd = shell_exec('ping ' . $target);
32        // 执行 Windows 系统下的 ping 命令并将结果赋值给变量 $cmd
33    } else {
34        // 如果当前操作系统为类 Unix(*nix)系统
35        $cmd = shell_exec('ping -c 4 ' . $target);
36        // 在 *nix 系统下执行发送 4 个 ICMP 包的 ping 命令并将结果赋值给变量 $cmd
37    }
38
39    // 将 ping 命令的结果格式化输出到 HTML 页面上
40    echo "<pre>{$cmd}</pre>";
41}
42?>

渗透测试:

与上一个级别相比,这个代码增加了一些黑名单字符,包括 |$()-&和 ||。并且在用户输入被处理之前使用了 trim() 函数去除首尾空白字符,以避免目标地址包含不必要的空格。

看上去,似乎敏感的字符都被过滤了,但是 | 明显后面有个空格,所以如果不使用空格的话依然可以绕过,尝试127.0.0.1 |ipconfig 成功。

Lmpossible

In the impossible level, the challenge has been re-written, only to allow a very stricted input. If this doesn't match and doesn't produce a certain result, it will not be allowed to execute. Rather than "black listing" filtering (allowing any input and removing unwanted), this uses "white listing" (only allow certain values).

在无法实现的级别,挑战已被重新编写,只允许非常严格的输入。如果输入不匹配且未产生特定结果,则将不允许执行。这种方法不是使用“黑名单”过滤(允许任何输入并删除不需要的输入),而是使用“白名单”(只允许特定值)。

代码审计:

Impossible 级别的代码对参数 ip 进行了严格的限制,只有“数字.数字.数字.数字”的输入才会被接收执行, 加入了 Anti-CSRF token 进行进一步保障,使得命令注入漏洞不存在。

<?php
2
3if (isset($_POST['Submit'])) {
4    // 检查是否有名为 "Submit" 的表单提交按钮被点击。
5
6    // Check Anti-CSRF token
7    checkToken($_REQUEST['user_token'], $_SESSION['session_token'], 'index.php');
8    // 检查反跨站请求伪造(CSRF)保护机制的令牌,确保请求是合法的。
9    // 传递给 checkToken() 函数的参数分别是用户提交的令牌、存储在服务器端的令牌和重定向页面。
10
11    // Get input
12    $target = $_REQUEST['ip'];
13    $target = stripslashes($target);
14    // 获取用户输入的目标地址,并使用 stripslashes() 函数删除反斜杠以防止 SQL 注入攻击。
15
16    // Split the IP into 4 octets
17    $octet = explode(".", $target);
18    // 使用 explode() 函数将目标地址按照 "." 分割成 4 个字节。
19
20    // Check IF each octet is an integer
21    if (
22        (is_numeric($octet[0])) &&
23        (is_numeric($octet[1])) &&
24        (is_numeric($octet[2])) &&
25        (is_numeric($octet[3])) &&
26        (sizeof($octet) == 4)
27    ) {
28        // 如果目标地址的每个字节都是数字,并且有 4 个字节,则继续执行下一步操作。
29
30        // If all 4 octets are int's put the IP back together.
31        $target = $octet[0] . '.' . $octet[1] . '.' . $octet[2] . '.' . $octet[3];
32        // 将 4 个字节重新组合成目标地址。
33
34        // Determine OS and execute the ping command.
35        if (stristr(php_uname('s'), 'Windows NT')) {
36            // Windows
37            $cmd = shell_exec('ping ' . $target);
38            // 如果操作系统是 Windows,则使用 shell_exec() 函数执行 ping 命令,并将结果赋值给变量 $cmd。
39        } else {
40            // *nix
41            $cmd = shell_exec('ping -c 4 ' . $target);
42            // 如果操作系统不是 Windows,则使用 shell_exec() 函数执行 ping 命令,并指定发送 4 个 ICMP 回显请求,并将结果赋值给变量 $cmd。
43        }
44
45        // Feedback for the end user
46        echo "<pre>{$cmd}</pre>";
47        // 输出 ping 命令的结果到 HTML 页面上。
48    } else {
49        // 如果目标地址的每个字节不是数字,或者字节的数量不是 4,则输出错误信息到 HTML 页面上。
50        echo '<pre>ERROR: You have entered an invalid IP.</pre>';
51    }
52}
53
54// Generate Anti-CSRF token
55generateSessionToken();
56// 为反跨站点请求伪造(CSRF)保护机制生成新的令牌,并将其存储在 $_SESSION 数组中,以便后续检查。
57
58?>

总结与防御

在一些 Web 程序中需要调用一些执行系统命令的函数,例如 PHP 的 system、exec、shell_exec 函数等。当攻击者能够直接操作命令执行的参数,并且没有代码对传入的参数进行过滤时,攻击者就能将用于搞破坏的系统命令夹带进来让系统执行。 在 Windows 系统和 Linux 系统中都有一些管道符,这些管道符可以被用来拼接攻击指令:

“&&”:前面的语句正确执行时,才执行后面的语句;

“&”:前面的语句执行出错时,执行后面的语句;

“|”:将前面的语句运行的结果,当做后面语句的输入,显示后面语句的执行结果;

“||”:前面的语句出错时,执行后面的语句。

总的来说,对于命令注入漏洞,建议采取以下防御措施:

避免使用系统命令执行函数: 尽量避免使用 shell_execexecsystem 等直接执行系统命令的函数,而是使用更安全的替代方案或者封装好的库。

输入验证和过滤: 对用户输入进行严格的验证和过滤,可以采用白名单验证或者黑名单过滤的方式,确保输入符合预期格式。

参数化查询: 如果需要执行外部命令,尽量使用参数化查询的方式,避免直接拼接用户输入到命令中。

最小权限原则: 在执行系统命令时,尽量以最小的权限执行,避免使用特权用户权限执行命令。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无线监测终端引领文物保护和管理新篇章

一、文物预防性保护系统大升级 随着科技的不断发展&#xff0c;越来越多的高科技产品进入人们的生活和工作中。在文物保护和管理行业&#xff0c;无线监测终端大放异彩。免布线、即插即用的特点在提供方便的同时&#xff0c;也为文物的长久保存和有效管理带来更好的保护环境。…

兼容树莓派扩展模块,专注工业产品开发的瑞米派强势来袭

近日&#xff0c;米尔电子和瑞萨电子共同定义和开发了瑞萨第一款MPU生态开发板——瑞米派&#xff08;Remi Pi&#xff09;正式上市了&#xff01;在各种Pi板卡琳琅满目的当下&#xff0c;Remi Pi是一款与众不同的开发板&#xff0c;他兼顾了严肃产品开发和爱好者创意实现两种需…

ffmpeg和opencv一些容易影响图片清晰度的操作

ffmpeg 转视频或者图片&#xff0c;不指定码率清晰度会下降 ffmpeg -i xxx.png xxx.mp4 码率也叫比特率&#xff08;Bit rate&#xff09;(也叫数据率)是一个确定整体视频/音频质量的参数&#xff0c;秒为单位处理的字节数&#xff0c;码率和视频质量成正比&#xff0c;在视频…

Linux CentOs7 安装Mysql(5.7和8.0版本)密码修改 超详细教程

CSDN 成就一亿技术人&#xff01; 今天出一期Centos下安装Mysql&#xff08;详细教程&#xff09;包括数据库密码跳过修改 CSDN 成就一亿技术人&#xff01; 目录 1.获取安装包 2.安装程序 安装下载的rpm包 查看安装包 修改5.7版本&#xff08;重要&#xff09; 安装M…

Java七大排序详解

排序 排序的概念 所谓排序 &#xff0c;就是让一串记录&#xff0c;按照其中某些或者某个关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;就比如在待排序的序列中&#xff0c;存在多个具有相同关键字的记录 &#xff0c;如果经过排序这些相同的关键…

通过FileZilla配置FTP

FileZilla服务端的安装 在虚拟机里安装FileZilla服务器 FileZilla的官网 下载一个客户端和一个服务端的FileZilla 如果已经有了一个客户端&#xff0c;可以不下用载。 FileZilla的配置 说明一下&#xff1a;通过FileZilla配置FTP有两种模式&#xff0c;我们先用被动模式 下载…

Javaweb之SpringBootWeb案例之阿里云OSS服务集成的详细解析

2.3.3 集成 阿里云oss对象存储服务的准备工作以及入门程序我们都已经完成了&#xff0c;接下来我们就需要在案例当中集成oss对象存储服务&#xff0c;来存储和管理案例中上传的图片。 在新增员工的时候&#xff0c;上传员工的图像&#xff0c;而之所以需要上传员工的图像&…

CDR绘图软件|安装教程来了(小白福利:有红包封面领取哦!)

前言 今天给小伙伴们讲讲&#xff1a;如何安装CDR软件。 如果未来的你想从事平面设计/广告行业&#xff0c;那应该就会接触到CDR这款软件。 CorelDRAW Graphics Suite是加拿大Corel公司的平面设计软件&#xff1b;该软件是Corel公司出品的矢量图形制作工具软件&#xff0c;这…

GPT应用程序的限制

尽管GPT&#xff08;Generative Pre-trained Transformer&#xff09;应用程序具有强大的自然语言生成能力&#xff0c;但也存在一些限制和挑战。以下是一些常见的GPT应用程序的限制&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公…

HCIA-HarmonyOS设备开发认证-2.设备开发入门

目录 HarmonyOS设备开发学习路径一、开发项目与工具介绍1.1、设备开发环境准备1.2、设备开发流程1.3、Huawei DevEco Device Tool 二、OpenHarmony介绍OpenHarmony目录结构详细介绍 待续... HarmonyOS设备开发学习路径 一、开发项目与工具介绍 1.1、设备开发环境准备 Window、…

Leetcode刷题笔记题解(C++):1971. 寻找图中是否存在路径

思路&#xff1a; 1.建立图集&#xff0c;二维数组&#xff0c;path[0]里面存放的就是与0相连的节点集合 2.用布尔数组来记录当前节点是否被访问过&#xff0c;深度优先会使用到 3.遍历从起点开始能直接到达的点&#xff08;即与起点相邻的点&#xff09;&#xff0c;判断那…

【Image captioning】论文阅读七—Efficient Image Captioning for Edge Devices_AAAI2023

中文标题:面向边缘设备的高效图像描述(Efficient Image Captioning for Edge Devices) 文章目录 1. 引言2. 相关工作3. 方法3.1 Model Architecture(模型结构)3.2 Model Training (模型训练)3.3 Knowledge Distillation (知识蒸馏)4. 实验4.1 数据集和评价指标4.2 实施细…

Element UI样式修改之NavMenu导航菜单箭头样式修改

UI设计稿给的菜单箭头样式可能与我们饿了么组件NavMenu的菜单箭头样式不一致,目前我们侧边导航菜单的上下翻转箭头如下所示: 希望得到如下的结果: 找到饿了么Icon里我们想要向下箭头,F12后复制content内容content: “\e790”; content: "\e790";然后将默认的c…

计算机网络-PPP与PPPoE协议

我们之前学习的大多是局域网LAN内常用的技术&#xff0c;但是我们总是需要访问Internet&#xff0c;需要访问百度、B站等等&#xff0c;那怎样让局域网访问外面的资源呢&#xff0c;其实我们已经学习过了NAT转换&#xff0c;但是那对于广域网的架构我们还是需要学习下的。 一、…

算法训练营Day60(单调栈)

84.柱状图的最大矩形 84. 柱状图中最大的矩形 - 力扣&#xff08;LeetCode&#xff09; 注意首尾加0的细节就可 class Solution {public int largestRectangleArea(int[] heights) {Deque<Integer> stack new LinkedList<>();int[] newHeight new int[heights.…

Pandas应用-股票分析实战

股票时间序列 时间序列&#xff1a; 金融领域最重要的数据类型之一 股价、汇率为常见的时间序列数据 趋势分析&#xff1a; 主要分析时间序列在某一方向上持续运动 在量化交易领域&#xff0c;我们通过统计手段对投资品的收益率进行时间序列建模&#xff0c;以此来预测未来的收…

【大根堆】【C++算法】871 最低加油次数

作者推荐 【动态规划】【map】【C算法】1289. 下降路径最小和 II 本文涉及知识点 大根堆 优先队列 LeetCode:871最低加油次数 汽车从起点出发驶向目的地&#xff0c;该目的地位于出发位置东面 target 英里处。 沿途有加油站&#xff0c;用数组 stations 表示。其中 statio…

Python教程48:海龟画图turtle画太极八卦阵

---------------turtle源码集合--------------- Python教程91&#xff1a;关于海龟画图&#xff0c;Turtle模块需要学习的知识点 Python源码45&#xff1a;海龟画图turtle画雪容融 Python源码44&#xff1a;海龟画图turtle&#xff0c;画2022卡塔尔世界杯吉祥物 Python教程…

【c++】什么是面向对象

面向过程和面向对象初步认识 面向过程&#xff08;C语言&#xff09; C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题 面向对象&#xff08;C&#xff09; C是基于面向对象的&#xff0c;关注的是对象&am…

短视频账号矩阵系统+无人直播系统源码技术开发

短视频账号矩阵系统无人直播系统源码技术开发涉及到多个领域&#xff0c;包括但不限于前端开发、后端开发、数据库设计、网络通信等。 以下是一些基本技术的步骤和注意事项&#xff1a; 1.技术需求分析设计&#xff1a;首先&#xff0c;需要明确开发短视频账号矩阵系统和无人直…