THM-Command Injection-命令注入(命令执行)

什么是命令注入?

命令注入是滥用应用程序的行为在操作系统上执行命令,使用与设备上的应用程序运行时相同的权限。例如,在作为名为joe的用户运行的web服务器上实现命令注入将在该joe用户下执行命令,从而获得joe拥有的任何权限。

命令注入漏洞也称为“远程代码执行”(RCE),因为攻击者可以诱使应用程序执行它们提供的一系列有效负载,而无需直接访问机器本身(即交互式 shell)。Web 服务器将处理此代码并在运行该应用程序的用户的权限和访问控制下执行它。

命令注入通常也称为“远程代码执行”(RCE),因为它能够在应用程序中远程执行代码。这些漏洞通常对攻击者来说是最有利可图的,因为这意味着攻击者可以直接与易受攻击的系统进行交互。例如,攻击者可能会读取系统或用户文件、数据以及类似的东西。

例如,能够滥用应用程序执行命令whoami以列出应用程序正在运行的用户帐户将是命令注入的一个例子。

发现命令注入

此漏洞的存在是因为应用程序经常使用 PHP、Python 和 NodeJS 等编程语言中的函数来向计算机操作系统传递数据并在其上进行系统调用。例如,从字段中获取输入并在文件中搜索条目。以下面的代码片段为例:

在此代码片段中,应用程序获取用户在名为$title在目录中搜索歌曲名称。让我们将其分解为几个简单的步骤。

  1. 应用程序将 MP3 文件存储在操作系统包含的目录中。
  2. 用户输入他们想要搜索的歌曲名称。应用程序将此输入存储到$title变量中。
  3. 此变量中的数据被传递给搜索名为 songtitle 的文本文件的$title命令。txt用于用户希望搜索的任何条目。grep
  4. 搜索歌曲标题的输出。txt将决定应用程序是否通知用户歌曲存在与否。

代码:

<?php

$songs = "/var/www/html/songs";

if(isset$(_GET["title"])){
	$title = $_GET["title"];

	$command = "grep $title /var/www/html/songtitle.txt";

	$search = exec($command);
	if ($search == ""){
		$return = "<p>The requested song</p> $title does </p><b>not</b><p> exist!</p>";
	} else {
		$return = "<p>The requested song</p> $title does </p><b>exist!</b>";
	}

	echo $return;
}

?>

现在,这类信息通常会存储在数据库中;然而,这只是应用程序从用户那里获取输入以与应用程序的操作系统交互的示例。

攻击者可以通过注入自己的命令让应用程序执行来滥用此应用程序。他们可以要求应用程序从更敏感的文件中读取数据,而不是使用grep在songtitle.txt中搜索条目

无论应用程序使用何种编程语言,都可能以这种方式滥用应用程序。只要应用程序处理并执行它,它就会导致命令注入。例如,下面的代码片段是一个用 Python 编写的应用程序。

请注意,您不需要了解这些应用程序背后的语法。但是,出于原因,我也概述了此 Python 应用程序的工作步骤。

  1. “flask”包用于设置网络服务器
  2. 使用“subprocess”包在设备上执行命令的函数
  3. 我们在网络服务器中使用一个路由来执行提供的任何内容。例如,要执行whoami,我们需要访问 http://flaskapp.thm/whoami

利用命令注入

您通常可以通过应用程序的行为来确定是否可能发生命令注入

使用用户输入通过数据填充系统命令的应用程序通常会出现意外行为。例如,shell operators;和将组合两个(或多个)系统命令并同时执行&它们&&

命令注入主要可以通过以下两种方式之一进行检测:

  1. 盲命令注入(Blind command injectionn)
  2. 详细命令注入 (Verbose command injection)

我在下表中定义了这两种方法,下面的两节将更详细地解释这些方法

方法 描述
Blind(盲) 这种类型的注入是在测试有效负载时应用程序没有直接输出的地方。您将必须调查应用程序的行为以确定您的负载是否成功。
Verbose(详细) 这种类型的注入是在您测试有效负载后从应用程序获得直接反馈的地方。例如,运行whoami命令以查看应用程序在哪个用户下运行。Web 应用程序将直接在页面上输出用户名。

检测盲命令注入

盲命令注入是在发生命令注入时;但是,没有可见的输出,因此不会立即引起注意。例如,执行了一条命令,但 Web 应用程序没有输出任何消息。

对于这种类型的命令注入,我们需要使用会导致一些时间延迟的有效载荷。例如,pingsleep命令是用于测试的重要有效负载。例如,根据您指定的ping次数ping,应用程序将挂起x秒

另一种检测盲命令注入的方法是强制输出。这可以通过使用重定向运算符来完成,例如>,例如,我们可以告诉 Web 应用程序执行诸如之类的命令whoami并将其重定向到文件。然后我们可以使用一个命令来cat读取这个新创建的文件的内容

以这种方式测试命令注入通常很复杂,需要大量实验,尤其是 Linux 和 Windows 之间的命令语法不同

该curl 命令是测试命令注入的好方法。这是因为您可以使用curl 有效负载中的应用程序来往来传输数据。以下面的代码片段为例,一个简单的 curl payload 到应用程序就可以进行命令注入。

curl http://vulnerable.app/process.php%3Fsearch%3DThe%20Beatles%3B%20whoami

检测详细命令注入

以这种方式检测命令注入可以说是这两种方法中最简单的方法。详细命令注入是指应用程序向您提供有关正在发生或正在执行的事情的反馈或输出

例如,或命令的输出ping直接whoami显示在 Web 应用程序上

命令执行常用命令

我已经为 Linux 和 Windows 编译了一些常用的有效载荷到下表中

Linux

payload 描述
whoami 查看当前运行账户
ls 列出当前目录的内容。您可能会找到配置文件、环境文件(令牌和应用程序密钥)等文件,以及更多有价值的东西
ping 此命令将调用应用程序挂起。这将有助于测试应用程序的盲命令注入
sleep 这是测试盲命令注入应用程序的另一个有用的有效载荷,如果没有安装ping
nc Netcat 可用于在易受攻击的应用程序上生成反向 shell。您可以使用此立足点在目标计算机周围导航以获取其他服务、文件或提升权限的潜在方法

Windows

payload 描述
whoami 查看当前运行账户
dir 列出当前目录的内容。您可能会找到配置文件、环境文件(令牌和应用程序密钥)等文件,以及更多有价值的东西
ping 此命令将调用应用程序挂起。这将有助于测试应用程序的盲命令注入
timeout 此命令还将调用应用程序挂起。ping如果未安装命令,它对于测试应用程序的盲命令注入也很有用

防止命令注入

可以通过多种方式防止命令注入。从尽可能少地使用编程语言中具有潜在危险的函数或库,到在不依赖用户输入的情况下过滤输入,应有尽有

下面的示例是 PHP 编程语言;然而,相同的原则可以扩展到许多其他语言

易受攻击的功能

在 PHP 中,许多函数与操作系统交互,通过 shell 执行命令;这些包括:

  • Exec
  • Passthru
  • System
  • shell_exec

以下面的代码片段为例。在这里,应用程序将只接受和处理输入到表单中的数字,whoami这意味着将不会处理任何命令

  1. 该应用程序将只接受特定的字符模式(数字 0-9)
  2. 然后应用程序将只继续执行这个全是数字的数据。

这些函数接受字符串或用户数据等输入,并将执行系统上提供的任何内容,任何未经适当检查而使用这些功能的应用程序都容易受到命令注入的攻击

** 输入消毒 **

清理应用程序使用的用户输入是防止命令注入的好方法。这是指定用户可以提交的数据格式或类型的过程。例如,一个仅接受数字数据或删除任何特殊字符(如>, &和 )的输入字段/

在下面的代码片段中,filter_input PHP 函数用于检查通过输入表单提交的任何数据是否为数字。如果不是数字,则一定是无效输入

** 绕过过滤器 **

应用程序将采用多种技术来过滤和清理从用户输入中获取的数据。这些过滤器将限制您使用特定的有效载荷;但是,我们可以滥用应用程序背后的逻辑来绕过这些过滤器。例如,一个应用程序可能去掉引号;我们可以改用它的十六进制值来获得相同的结果

执行时,虽然给出的数据格式与预期不同,但仍然可以解释并得到相同的结果

命令执行测试

使用刚刚讲到的姿势使用命令执行,如果忘记,可以使用命令执行备忘单

可以使用以下代码测试命令执行

<?php

echo @shell_exec("ping -n 4".$_GET['c']);

?>
posted @ 2023-03-10 11:24  Junglezt  阅读(357)  评论(0编辑  收藏  举报