之所以存在此漏洞,是因为应用程序通常使用 PHP、Python 和 NodeJS 等编程语言中的函数将数据传递到计算机的操作系统并在计算机上进行系统调用。例如,从字段中获取输入并搜索文件中的条目。以下面的代码片段为例:
在此代码片段中,应用程序获取用户在名为“以在目录中搜索歌曲标题”的输入字段中输入的数据。让我们将其分解为几个简单的步骤。
1. 应用程序将 MP3 文件存储在操作系统包含的目录中。
2.用户输入他们想要搜索的歌曲名称。应用程序将此输入存储到 变量中。$title
3. 此变量中的数据 将传递给命令以 搜索名为 songtitle 的文本文件。txt 用于输入用户希望搜索的任何内容。$title
grep
4.此搜索歌曲标题的输出。txt 将确定应用程序是否通知用户歌曲存在。
现在,这类信息通常存储在数据库中;但是,这只是应用程序从用户那里获取输入以与应用程序的操作系统进行交互的示例。
攻击者可以通过注入自己的命令来执行此应用程序,从而滥用此应用程序。他们可以要求应用程序从更敏感的文件中读取数据,而不是用于搜索条目。
无论应用程序使用哪种编程语言,都可能以这种方式滥用应用程序。只要应用程序处理并执行它,就可能导致命令注入。例如,下面的代码片段是用 Python 编写的应用程序。
利用命令注入
您通常可以通过应用程序的行为来确定是否可能发生命令注入,正如您将在本会议室的实践会议中看到的那样。
使用用户输入用数据填充系统命令的应用程序通常可以以意外行为组合在一起。例如,shell 运算符 ,并将组合两个(或多个)系统命令并同时执行它们;
&
&&
.如果您不熟悉这个概念,值得查看 Linux 基础模块以了解更多信息。
命令注入主要可以通过以下两种方式之一进行检测:
- 盲命令注入
- 详细命令注入
我在下表中定义了这两种方法,下面的两个部分将更详细地解释这些方法。
检测盲目命令注入
盲目命令注入是指发生命令注入; 但是,没有可见的输出,因此不会立即引起注意。为 例如,执行了命令,但 Web 应用程序不输出任何消息。
对于这种类型的命令注入,我们需要使用有效负载 这将导致一些时间延迟。例如, 和 命令很重要 要测试的有效负载。举 个例子,应用程序将挂起 与指定的 ping 数相关的 x 秒。ping
sleep
ping
检测盲目命令注入的另一种方法是强制 一些输出。这可以通过使用重定向运算符(如 )来完成。如果 你对此不熟悉,我建议查看 Linux 基础模块。例如,我们可以告诉 Web 应用程序执行诸如 之类的命令 ,并将其重定向到文件。然后,我们可以使用诸如读取 此新创建文件的内容的命令。>
whoami
cat
以这种方式测试命令注入通常很复杂,并且 需要相当多的实验,尤其是 命令在 Linux 和 Windows 之间有所不同。
该命令是测试命令注入的好方法。这是因为您可以使用有效负载中的应用程序来传送数据。以下面的代码片段为例,可以将简单的 curl 有效负载发送到应用程序以进行命令注入。curl
curl
curl http://vulnerable.app/process.php%3Fsearch%3DThe%20Beatles%3B%20whoami
检测详细命令注入
以这种方式检测命令注入可以说是最简单的 两者的方法。详细命令注入是指应用程序向您提供反馈 或输出正在发生或正在执行的内容。
例如,命令(如 or)的输出直接显示在 Web 应用程序上。ping
whoami
有用的payload
以下是Linux 和 Windows两种操作系统中的一些有价值的有效载荷(payload)。
Linux
whoami 查看应用程序在哪个用户下运行。
ls 列出当前目录下的内容,你可能会找到配置文件、环境文件(令牌和应用程序密钥)等文件。
ping 此命令将调用web应用程序并挂起,这将有助于测试web应用程序是否存在盲注类型的命令注入漏洞。
sleep 这是测试web应用程序是否存在盲注类型的命令注入漏洞的另一个有用的payload。
nc Netcat可用于在易受攻击的web应用程序上生成反向shell,你可以使用此立足点围绕目标机进行导航以获取其他服务、文件或潜在的提权方法。
Windows
whoami 查看应用程序在哪个用户下运行。
dir 列出当前目录下的内容,你可能会找到配置文件、环境文件(令牌和应用程序密钥)等文件。
ping 此命令将调用web应用程序并挂起,这将有助于测试web应用程序是否存在盲注类型的命令注入漏洞。
timeout 此命令也能调用web应用程序并挂起,如果未安装 ping 命令,它对于测试 web应用程序 是否存在盲注类型的命令注入漏洞也很有用。
修复命令注入
可以通过多种方式防止命令注入。从在编程语言中尽量减少使用潜在危险的函数或库,到在不依赖用户输入的情况下过滤输入,应有尽有。我在下面进一步详细介绍了这些内容。下面的示例是 PHP 编程语言;但是,相同的原则可以扩展到许多其他语言。
- Exec--执行一个外部程序
- Passthru--执行外部程序并且显示原始输出
- System--执行外部程序并且显示输出
以下面的代码片段为例,在此处,web应用程序将只接受和处理输入到表单中的数字,这意味着不会处理任何输入的命令,例如 whoami。
- 该web应用程序将只接受特定的字符格式(数字 0-9)
- 然后该web应用程序将继续执行这个全是数字的数据。
在默认情况下,类似的函数会接受字符串内容或者用户的数据输入,并将执行 在目标系统上被提供的任何内容,因此任何未经适当检查而使用这些函数的web应用程序都容易受到命令注入攻击的影响。
对输入数据进行净化(sanitisation)
清理web应用程序所使用的用户输入是防止命令注入的好方法。 这是指定用户可以提交的数据格式或类型的过程。 例如,可以指定仅接受数字数据或删除任何特殊字符(如 >、& 和 /)的输入字段。
在下面的代码片段中,PHP 函数filter_input用于检查通过输入表单提交的任何数据是否为数字,如果不是数字,则视为无效输入。
绕过过滤器
web应用程序可以采用多种技术来过滤和清理从用户输入中获取的数据,这些过滤器将限制你使用特定的有效载荷; 但是,我们可以滥用web应用程序背后的逻辑来绕过这些过滤器。
例如,web应用程序可能会去掉我们所使用的payload中的引号,我们此时可以尝试改用引号的十六进制值来替代payload中的引号;虽然最终使用的payload数据格式与预期的不同,但仍然可以得到该payload成功执行的对应结果