假设我们有一个脚本.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) 的攻击。
记住这一点也很好:
-
include
或require
将在 php 中加载和执行任何好的代码,无论它是否在 php 文件中。 看看这里的例子 jpg 图像携带 php 代码(这个文件甚至被 mimetype 识别为 image/jpg! -
include
或require
也会打开纯文本文件,例如您的etc/hosts
,如果您正在使用默认的 Apache/PHP 设置,则不会出现错误。
使用 像您这样的GET变体,在Windows中,最终用户只需使用带有"..''"路径。因此,可以松散地检查所有目录。
在这里,您可以检查如何包含远程文件。根据那里的答案,您可以轻松地重新配置服务器/php堆栈并测试漏洞。
编辑:
至于第 3 点,您知道如何跳转到另一个驱动器的任何示例吗?
在您的示例中,对于具有 PHP5 默认配置的 Apache2 或 Nginx,我无法找到跳转到另一个驱动器的方法。放置退格键 (x08)、转义代码等不会删除以前添加的磁盘号。
因此,对于include 'D:''mydir''' . $_GET['load'] . '.php';
,您必须保持在同一驱动器中。当然,对于include $_GET['load'] . '.php';
您将能够选择您喜欢的任何网址/驱动器。
我不知道您可以将任何内容附加到已经具有驱动器标识符根的Windows路径名以更改为另一个驱动器。
但这肯定不是你应该依赖的东西。除了晦涩难懂的Windows路径技巧外,在驱动器上包含其他项目PHP文件可能存在特定于应用程序的漏洞,并且如果用户可以通过任何其他方式将文件写入D:驱动器,则可以升级。
例如,如果站点具有在 D:-drive 上存储数据的图像上传功能,则攻击者可以上传包含字符串<?php
的图像,然后将其包含在内以执行任意代码。或者,如果将任何内容记录到驱动器上的文件中,攻击者可能会发出请求,导致将<?php
写入日志文件,然后包含日志文件。