PHP 任意文件包含


PHP Arbitrary File Inclusion

假设我们有一个脚本.php它根据Windows上的GET参数(比如加载)加载文件。

脚本.php:

<?php include 'D:''mydir''' . $_GET['load'] . '.php'; ?>

该脚本不检查有效输入,因此攻击者可以轻松地将参数更改为任何文件:http://address/script.php?load=mymaliciousinput.ext%00

还假设 Windows 安装在驱动器 C 上,而我们的网络服务器安装在驱动器 D 上。可能存在哪些漏洞?是否可以包含来自其他服务器/网站的恶意文件?

是否可以包含来自其他服务器/网站的恶意文件?

长话短说:是的。这可能是可能的,但这也取决于您的 PHP 版本和服务器配置。

可能存在哪些漏洞?

下面描述的情况是典型的文件注入漏洞,在这种情况下,如果不过滤请求数据,则容易受到本地文件注入 (LFI) 和远程文件注入 (RFI) 的攻击。

记住这一点也很好:

  1. includerequire将在 php 中加载和执行任何好的代码,无论它是否在 php 文件中。 看看这里的例子 jpg 图像携带 php 代码(这个文件甚至被 mimetype 识别为 image/jpg!

  2. includerequire也会打开纯文本文件,例如您的etc/hosts,如果您正在使用默认的 Apache/PHP 设置,则不会出现错误。

  3. 使用
  4. 像您这样的GET变体,在Windows中,最终用户只需使用带有"..''"路径。因此,可以松散地检查所有目录。

  5. 在这里,您可以检查如何包含远程文件。根据那里的答案,您可以轻松地重新配置服务器/php堆栈并测试漏洞。

编辑:

至于第 3 点,您知道如何跳转到另一个驱动器的任何示例吗?

在您的示例中,对于具有 PHP5 默认配置的 Apache2 或 Nginx,我无法找到跳转到另一个驱动器的方法。放置退格键 (x08)、转义代码等不会删除以前添加的磁盘号。

因此,对于include 'D:''mydir''' . $_GET['load'] . '.php';,您必须保持在同一驱动器中。当然,对于include $_GET['load'] . '.php';您将能够选择您喜欢的任何网址/驱动器。

我不知道您可以将任何内容附加到已经具有驱动器标识符根的Windows路径名以更改为另一个驱动器。

但这肯定不是你应该依赖的东西。除了晦涩难懂的Windows路径技巧外,在驱动器上包含其他项目PHP文件可能存在特定于应用程序的漏洞,并且如果用户可以通过任何其他方式将文件写入D:驱动器,则可以升级。

例如,如果站点具有在 D:-drive 上存储数据的图像上传功能,则攻击者可以上传包含字符串<?php的图像,然后将其包含在内以执行任意代码。或者,如果将任何内容记录到驱动器上的文件中,攻击者可能会发出请求,导致将<?php写入日志文件,然后包含日志文件。