文件包含定义:
服务器执行PHP文件时,可以通过文件包含函数加载另一个文件中的PHP代码,并且当PHP来执行,这会为开发者节省大量的时间。这意味着您可以创建供所有网页引用的标准页眉或菜单文件。当页眉需要更新时,只更新一个包含文件就可以了,或者当向网站添加一张新页面时,仅仅需要修改一下菜单文件(而不是更新所有网页中的链接)。造成方便的同时,也留下了隐患。

如果我们没有对文件的来源进行严格的审查,也就是程序员在编写代码的时候触犯的逻辑性的错误就可能会导致文件读取漏洞和其它类型的漏洞,php中常用的文件包含函数有(include、require、include_once、require_once)


一.本地文件包含漏洞:

进行查询后发现前端在URL上以文件名的形式读取本地的file1.php文件

按教程走 发现失败了(因为电脑为windows系统)
windows系统肯定有的文件是C:\Windows\win.ini,用这个来尝试有没有文件包含漏洞

成功 确实有文件包含漏洞


二.远程文件包含漏洞:

在URL处写入目标URL:http://127.0.0.1/pikachu/vul/fileinclude/fi_remote.php?filename=http://127.0.0.1/pikachu/test/yijuhua.txt&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2

被系统拦截了( ̄▽ ̄)"

此处要记住文件所在目录,即fileinclude处,要修改URL就修改fileinclude后的内容,输入http://127.0.0.1/pikachu/vul/fileinclude/yijuhua.php?x=ipconfig

成功调用


三.文件包含漏洞防范措施:
1.检查服务器配置文件
在php中有个php.ini的配置文件,里面大概是对php语言所有功能配置文件集合,其中里面有两项是allow_url_foprn、allow_url_include两个选项,其中allow_url_fopen默认是开启的,allow_url_include默认是关闭的,如果我们开启这个配置文件,我们就可以使用伪协议读取我们的敏感信息和其它操作,虽然开启allow_url_fopen也可以读取我们的文件,但是我们可以通过过滤一些字符或者限制用户的输入从而达到攻击不能读取我们信息的操作。

2.过滤特殊符号:在进行文件包含的时候我们可能经常会用到几个固定的字符,或者我们在用伪协议的时候我们也会使用特定的字符,例如:\,//,input,output,filter等我们可以将这些铭感字符都给过滤掉。

3.指定包含的文件(白名单):在包含文件的时候就可以添加一条规则,让我们只能包含指定的文件,如果我们包含了非指定的文件,程序就会报错退出。

4.php的配置文件中有open_basedir选项可以设置用户需要执行的文件目录,如果设置文件目录的话,我们编写的脚本只会在该目录中搜索文件,这样我们就可以把我们需要包含的文件放到这个目录就可以了,从而也避免了敏感文件的泄露。


利用:
?file=php://filter/read=convert.base64-encode/resource=flag.php

1是格式
2是可选参数,有read和write,字面意思就是读和写
3是过滤器。主要有四种:字符串过滤器,转换过滤器,压缩过滤器,加密过滤器。filter里可以用一或多个过滤器(中间用|隔开),这也为解题提供了多种方法,灵活运用过滤器是解题的关键。这里的过滤器是把文件flag.php里的代码转换(convert)为base64编码(encode)
4是必选参数,后面写你要处理的文件名
[ACTF2020 新生赛]Include 1