1、概念:在php代码中,总会有一些代码我们会经常用到,这时引入了文件包含函数,可以通过文件包含函数把这些代码文件包含进来,直接使用文件中的代码,这样提高了我们的工作效率。
2、文件包含函数:
include():如果发生错误,会产生一个警告然后继续执行脚本
include_once():与include()相同,如果文件之前被包含过则不再包含
require():会停止执行代码
require_once():如果文件之前被包含过则不再包含
3、类型:本地文件包含、远程文件包含(url的形式进行)
配置文件参数:allow_url_fopen:为ON时,能读取远程文件,
Allow_url_include:为ON时,就可以使用include和require等方式包含远程文件
4、利用方式——伪协议
# file:// 协议用户访问本地文件系统,使用方法:?file:// [文件的绝对路径和文件名]
# php://input 可以访问请求的原始数据的只读流,将post请求的数据当作php代码执行
# php://filter 元封装器,读取源代码并以base64编码方式输出
# zip://, bzip2://, zlib:// 属于压缩流,可以访问压缩文件中的子文件,使用方法:zip:// [压缩文件绝对路径]#[压缩文件内的子文件名]
# data:// 类似于php://input,可以让用户来控制输入流
其他利用方法:(绕过方式)
#00截断:windows在读文件名的时候遇到00就会停止
#长度截断(win:256,linux:4096)
#包含日志文件:传入的参数值如果会保存到日志文件中,我们可以把木马传入到日志文件中,知道日志的路径就可以进行下一步操作
#包含session
5、防御
#php中使用open_basedir配置限制访问在指定的区域
#过滤 . (点) / (反斜杠) \(反斜杠)
#禁止服务器远程文件包含
#尽量不要使用动态包含,可以在需要包含的页面固定写上
二、利用LFI环境复现文件包含漏洞
这是我在github上边下载的,有很多题目要做一些改动才可以实现,所以懂了原理就可以了,用PHP study本地搭建起来就可以复现,
因为我的路径和原本代码的路径不同,所以每复现一个之前都要把文件包含函数里面的路径修改一下,例如:
# LFI-1 简单的文件包含
观察源代码,这是一个简单的文件包含
我现在网站根目录下传入一个phpinfo的文件,
根据源码,框中传入的参数是page,我们可以构造payload,得到根目录下的文件内容
根据实验,不管文件的后缀名是jpg、txt,都会以php代码执行,所以可知文件包含时与传入文件的类型无关
# LFI-2 00截断绕过
观察源码,
这个参数传入之后构成的路径是:includes/文件.php,我们可以用%00把.php截断,然后利用相对路径进行绕过
这个题可能是有很多限制,我把includes删除然后把php版本调到5.2.17然后把gpc设置为off才能实现。
如果我们传入一个一句话,这时就可以用菜刀连接
# LFI-3 点、斜杠绕过
观察源码,源码当中取后四位即后缀名与.php比较,如果相同则输出不被允许查看源码的警告,若不同则读取文件内容。
我们可以在url的末尾加.(点),因为,在文件命名时,后缀后面加点是会自动去掉的
我们也可以加/. 因为在命名时,/(斜杠)是不允许出现的
# 4 去后缀名绕过观察源码,