原理 在通过PHP的相应函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入。 文件包含漏洞的形成,需要满足两个条件:1、用户能够控制这个动态变量 2、include()等函数通过动态变量的方式引入需要包含的文件 涉及包含文件的危险函数include():包含并运行指定的文件,包含文件发生错误时,程序警告,但会继续执行。 require():包含并运行指定的文件,包含文件发生错误时,程序直接终止执行。 include_once():和include类似,不同处在于include_once会检查这个文件是否已经被导入,如果已导入,下文便不会再导入,直面once理解就是只导入一次。 require_once():和require类似,不同处在于require_once只导入一次。 文件包含漏洞又分为本地文件包含和远程文件包含本地文件包含(LFI)能够读取或执行包含本地文件的漏洞,称为本地文件包含漏洞 下面将用一道CTF题作为例子讲解 题目来源:南京邮电大学网络攻防训练平台 writeup打开题目地址看到题目 这道题非常简单。根据提示是文件包含,而且是本地文件包含,所以直接在URL后添加?file=php://filter/read=convert.base64-encode/resource=index.php,读取到base64加密的index.php文件 base64解码,查看到flag 远程文件包含(RFI)如果php.ini的配置选项allow_url_fopen,allow_url_include都为ON的话,文件包含函数是可以加载远程文件的,这种漏洞就被称为远程文件包含。利用这个漏洞,可以直接执行任意命令。 allow_url_fopen是否允许打开URL文件 allow_url_include是否允许引用URL文件 文件包含的各种写法include$_GET[] include$_GET[].”.inc” include“./“.$_GET[] include“./include”.$_GET[] include“./include”.$_GET[].”.inc” PHP伪协议在文件包含漏洞中,可以使用PHP伪协议来构造语句进行漏洞测试 file协议当存在某个用户可控制、并得以访问执行的输入点时,可以尝试输入file://去获取本地磁盘文件 使用方法: |