pikachu--File Inclusion(文件包含漏洞)

执行PHP文件时,可以通过文件包含函数加载另一个文件,当服务器开启allow_url_include选项时,就可以通过php的某些特性函数,利用url去动态包含文件并解析执行,这会为开发者节省大量的时间。这意味着你可以创建供所有网页引用的标准页眉或菜单文件。当页眉需要更新时,您只更新一个包含文件就可以了,或者当您向网站添加一张新页面时,仅仅需要修改一下菜单文件(而不是更新所有网页中的链接)。大多数情况下,文件包含函数中包含的代码文件是固定的,因此也不会出现安全问题。 但是,有些时候,文件包含的代码文件被写成了一个变量,且这个变量可以由前端用户传进来,这种情况下,如果没有做足够的安全考虑,则可能会引发文件包含漏洞。 攻击着会指定一个“意想不到”的文件让包含函数去执行,从而造成恶意操作。 根据不同的配置环境,文件包含漏洞分为如下两种情况:
1.本地文件包含漏洞:仅能够对服务器本地的文件进行包含,由于服务器上的文件并不是攻击者所能够控制的,因此该情况下,攻击着更多的会包含一些固定的系统配置文件,从而读取系统敏感信息。很多时候本地文件包含漏洞会结合一些特殊的文件上传漏洞,从而形成更大的威力。
2.远程文件包含漏洞:能够通过url地址对远程的文件进行包含,这意味着攻击者可以传入任意的代码。
因此,在web应用系统的功能设计上尽量不要让前端用户直接传变量给包含函数,如果非要这么做,也一定要做严格的白名单策略进行过滤。

文件包含相关的函数有:include()、require()、include_once()、require_once()
include (或 require)语句会获取指定文件中存在的所有文本/代码/标记,并复制到使用 include 语句的文件中。
include和require区别主要是,include在包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行。
include_once()和require_once()这两个函数,与前两个的不同之处在于这两个函数只包含一次,适用于在脚本执行期间同一个文件有可能被包括超过一次的情况下,这样确保了它只被包括一次以避免函数重定义,变量重新赋值等问题。

接下来我们看一下pikachu中的示例:

一、File Inclusion(local)

我们在界面中随便选择一个点击提交查询,可以看到这样一个结果:

从URL中可以看出是传入了一个参数filename和值file1.php,即传入一个文件名到服务器,服务器会根据这个指定的文件名去执行,从fi_local.php源代码也可以看到这一点:

那么这里我们改为file2.php,同样会执行,因为服务器中有这个文件

但如果服务器上没有就不会执行,例如改为file100.php,就会报错:

二、File Inclusion(remote)
这里我们看到了前面我们讲到的提示:php中要把allow_url_include打开,我们的php环境是打开的,没有需要修改配置打开一下。

因为这个是远程文件包含,那么我们可以在www的目录下面创建一个1.txt文件,内容写abc,然后提交的URL改为:

这里我们到1.txt被调用执行了,那么这里我们可以构造一个上传文件的代码,将木马上传进去。
但默认情况下,php高版本的allow_url_include都是关闭的。

我们看一下fi_remote.php中的源代码

posted @ 2020-04-11 15:47  tangjf10  阅读(691)  评论(0编辑  收藏  举报