假设我们有一个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上。 有哪些可能的漏洞?是否可以包含来自其他服务器/网站的恶意文件?
答案 0 :(得分:1)
是否可以包含来自其他服务器/网站的恶意文件?
长话短说:是的。它可能是可能的,但它也取决于您的PHP版本和服务器配置。
可能存在哪些漏洞?
下面描述的情况是典型的file injection vulnerability,在这种情况下,如果没有过滤请求数据,您很容易受到本地文件注入(LFI)和远程文件注入(RFI)的攻击)。强>
记住这一点也很好:
include
或require
将加载并执行php中的任何好代码,不管它是否在php文件中。看看here例如jpg图像携带php代码(这个文件甚至被mimetype认为是图像/ jpg!)。
include
或require
也会打开纯文本文件,例如您的etc/hosts
没有错误。
使用像你这样的GET varialbe,在Windows中,最终用户可以只使用带有“.. \”路径的变量。因此可以松散地检查所有目录。
Here您可以查看如何包含远程文件。根据那里的答案,您可以轻松地重新配置您的服务器/ PHP堆栈并测试漏洞。
至于第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
写入日志文件的请求,然后包含日志文件。