什么是命令注入?
命令注入是对应用程序行为的滥用,以在操作系统上执行命令,使用设备上运行应用程序的相同特权。例如,在以用户joe
身份运行的Web服务器上实现命令注入将在此joe
用户下执行命令,从而获得joe
具有的任何权限。
命令注入通常也被称为“远程代码执行”(RCE),因为它具有在应用程序内远程执行代码的能力。这些漏洞通常对攻击者最具吸引力,因为这意味着攻击者可以直接与受攻击系统交互。例如,攻击者可能会读取系统或用户文件、数据等。
发现命令注入
这种漏洞存在的原因是应用程序通常使用编程语言(如PHP、Python和NodeJS)中的函数来传递数据并在设备的操作系统上进行系统调用。例如,从字段中获取输入并搜索文件中的条目。请看下面的代码片段:
在这个代码片段中,应用程序获取用户在名为$title
的输入字段中输入的数据,以搜索包含歌曲标题的目录。让我们将其简化为几个简单的步骤。
1. 应用程序将MP3文件存储在操作系统上的一个目录中。
2. 用户输入他们想要搜索的歌曲标题。应用程序将此输入存储到$title
变量中。
3. 此$title
变量中的数据被传递给grep
命令,以在名为songtitle.txt的文本文件中搜索用户想要搜索的内容。
4.对songtitle.txt的搜索输出将决定应用程序是否通知用户歌曲是否存在。
无论应用程序使用哪种编程语言,都有可能滥用应用程序以进行命令注入。例如,下面的代码片段是用Python编写的应用程序。
请注意,您不必理解这些应用程序背后的语法。然而,出于理解的目的,我已经概述了这个Python应用程序的工作步骤。
-
使用“flask”包设置Web服务器
-
使用“subprocess”包执行设备上的命令的函数
我们在Web服务器中使用一个路由来执行提供的任何内容。例如,要执行whoami
,我们需要访问http://flaskapp.thm/whoami
利用命令注入
通常,您可以通过应用程序的行为来确定是否可能发生命令注入。
使用用户输入来填充带有数据的系统命令的应用程序通常会导致意外的行为。例如,shell运算符;
,&
和&&
将组合两个(或多个)系统命令并同时执行它们。
命令注入通常可以通过以下两种方式之一检测:
- 盲注入
- 冗长注入
方法 | 描述 |
---|---|
盲注入 | 在测试有效载荷时,应用程序没有直接输出的注入类型。您必须调查应用程序的行为,以确定有效载荷是否成功。 |
冗长注入 | 在测试有效载荷后,应用程序直接提供反馈或输出的注入类型。例如,运行whoami 命令以查看应用程序正在运行的用户。Web应用程序将直接在页面上输出用户名。 |
检测盲注入
盲注入是指发生命令注入,但没有可见输出,因此不容易察觉。例如,执行命令,但Web应用程序未输出任何消息。
检测盲注入的另一种方法是强制进行一些输出。这可以通过使用>
等重定向运算符来实现。例如,我们可以告诉Web应用程序执行诸如whoami
之类的命令,并将其重定向到一个文件。然后,我们可以使用cat
等命令读取这个新创建的文件的内容。
通过这种方式测试命令注入通常很复杂,并且需要进行大量实验,特别是因为在Linux和Windows之间命令的语法差异较大。
curl
命令是测试命令注入的一种很好的方法。这是因为你可以使用curl
在有效载荷中将数据传递到应用程序并从中传递数据。请看下面的代码片段,这是一个对命令注入可能的简单curl有效载荷的例子。
curl http://vulnerable.app/process.php%3Fsearch%3DThe%20Beatles%3B%20whoami
检测冗长注入
通过这种方式检测命令注入可能是两种方法中最简单的一种。冗长注入是指应用程序提供有关正在发生或执行的事务的反馈或输出。
例如,诸如ping
或whoami
的命令的输出直接显示在Web应用程序上。
有用的有效载荷
Linux
有效载荷 | 描述 |
---|---|
whoami | 查看应用程序正在运行的用户。 |
ls | 列出当前目录的内容。您可能能够找到诸如配置文件、环境文件(令牌和应用程序密钥)等更有价值的文件。 |
ping | 此命令将调用应用程序挂起。这在测试应用程序进行盲命令注入时将很有用。 |
sleep | 在测试应用程序进行盲命令注入时,这是另一种有用的有效载荷,其中机器未安装ping 。 |
nc | Netcat可用于将反向Shell生成到易受攻击的应用程序上。您可以使用此立足点浏览目标机器以查找其他服务、文件或潜在的提权手段。 |
Windows
有效载荷 | 描述 |
---|---|
whoami | 查看应用程序正在运行的用户。 |
dir | 列出当前目录的内容。您可能能够找到诸如配置文件、环境文件(令牌和应用程序密钥)等更有价值的文件。 |
ping | 此命令将调用应用程序挂起。这在测试应用程序进行盲命令注入时将很有用。 |
timeout | 此命令还将调用应用程序挂起。如果未安装ping 命令,它还对测试应用程序进行盲命令注入很有用。 |