PHP任意文件包含

时间:2015-01-14 11:45:52

标签: php security

假设我们有一个script.php,它在Windows上根据GET参数(Say load )加载文件。

的script.php:

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

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

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

2 个答案:

答案 0 :(得分:1)

  

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

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

  

可能存在哪些漏洞?

下面描述的情况是典型的file injection vulnerability,在这种情况下,如果没有过滤请求数据,您很容易受到本地文件注入(LFI)远程文件注入(RFI)的攻击)。

记住这一点也很好:

  1. includerequire将加载并执行php中的任何好代码,不管它是否在php文件中。看看here例如jpg图像携带php代码(这个文件甚至被mimetype认为是图像/ jpg!)。

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

  4. 使用像你这样的GET varialbe,在Windows中,最终用户可以只使用带有“.. \”路径的变量。因此可以松散地检查所有目录。

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

  6. 编辑:

      

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

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

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

答案 1 :(得分:1)

我不知道您可以附加到已经根据驱动器标识符更改为其他驱动器的Windows路径名的任何内容。

但它肯定不是你应该依赖的东西。除了模糊的Windows路径技巧之外,可能存在特定于应用程序的漏洞,包括驱动器上的其他项目PHP文件,如果有任何其他方式,用户可以将文件写入D:驱动器,它们可以升级。

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