1. 文件包含(File Inclusion)漏洞简介
(1)文件包含
开发人员将相同的函数写入单独的文件中,需要使用某个函数时直接调用此文件,无需再次编写,这种文件调用的过程称文件包含;
(2)文件包含漏洞
开发人员为了使代码更灵活,会将被包含的文件设置为变量,用来进行动态调用,从而导致客户端可以恶意调用一个恶意文件,造成文件包含漏洞;在PHP中经常出现文件包含漏洞;
(3)php中引发文件包含漏洞的通常是以下四个函数
include():找不到被包含文件,报错,但会继续运行脚本;
include_once():与include()类似,区别在于,当重复调用同一文件时,程序只调用一次;
require():找不到被包含文件,报错,并且停止运行脚本;
require_once():与require类似,区别在于,当重复调用同一文件时,程序只调用一次;
(4)文件包含的特征
?page=
?file=
?home=
(5)目录遍历与文件包含的区别
目录遍历是可以读取web目录以外的其他目录,根源在于对路径访问权限设置不严格,针对于本系统;
文件包含是利用函数来包含web目录以外的文件,分为本地包含和远程包含;
(6)文件包含的分类
本地文件包含:可以包含本地文件,在条件允许时甚至能执行代码
- 读敏感文件,读PHP文件;
- 上传一句话木马或图片木马,然后进行包含,从而GetShell;
- 包含/proc/self/envion文件GetShell
- 若有phpinfo则可以包含临时文件
远程文件包含:可以直接执行任意代码
- 要保证php.ini中allow_url_fopen和allow_url_include要为On
(7)文件包含漏洞的危害
- 执行任意代码
- 读取文件源码或敏感信息
- 包含恶意文件控制网站,甚至控制服务器
2. 文件包含(File Inclusion)
实验环境
(1)Windows服务器:Windows Server 2003,IP地址:192.168.37.136;
(2) Linux服务器:192.168.37.135
(3) 测试机:Windows7物理机(开启代理,代理服务器为burpsuite)
实验过程——Windows
安全级别:Low
(1)前期准备,开启本地包含
点击文件包含,显示如下界面;不能进行文件包含
修改配置文件,开启本地包含,并重新启动phpstudy;
(2)设置安全级别
(3)查看源码
(4)源码分析
可以看到,服务器端对page参数没有做任何的过滤跟检查;
服务器期望用户的操作是点击下面的三个链接,服务器会包含相应的文件,并将结果返回;
注:服务器包含文件时,不管文件后缀是否是php,都会尝试当做php文件执行,如果文件内容为php,则会正常执行并返回结果,如果不是,则会原封不动地打印文件内容,所以文件包含漏洞常常会导致任意文件读取与任意命令执行;
(5)实验过程
在实验的过程中,可以读取如下的敏感文件
Windows:
c:\boot.ini #查看系统版本
c:\windows\repair\sam #查看SAM文件
查看PHPinfo.php
Linux:
/etc/passwd
/etc/shadow
/etc/resolv.conf
/root/.ssh/known_hosts
/etc/network/interfaces
本地文件包含
5.1> 构造url,通过显示结果查看操作系统的类型,以及DVWA的目录;
修改链接
http://192.168.37.136/DVWA/vulnerabilities/fi/?page=/etc/passwd
推断目标操作系统类型,使用page=/etc/passwd做测试,如果目标系统为Linux系统,则会将/etc/passwd下的内容显示出来,所以,目标系统为Windows系统;
暴露了服务器的绝对路径 C:\phpStudy\PHPTutorial\WWW\DVWA\vulnerabilities\fi\index.php
5.2> 查看系统版本(c:\boot.ini)
http://192.168.37.136/DVWA/vulnerabilities/fi/?page=c:\boot.ini
该系统的版本为Windows server 2003
5.3> 查看SAM文件
http://192.168.37.136/DVWA/vulnerabilities/fi/?page=c:\windows\repair\sam
5.4> 构造url,查看PHP的配置文件
http://192.168.37.136/DVWA/vulnerabilities/fi/?page=C:\phpStudy\PHPTutorial\WWW\DVWA\php.ini
5.5> 构造url,查看PHPinfo.php
5.6> 查看1.txt(在目标服务器上写个1.txt文件,查看是执行还是打印内容)
当服务器包含文件时,不论文件是否是PHP文件,都会尝试当做PHP文件执行,如文件内容是PHP的代码,则直接执行PHP代码并返回结果,若不是,则直接打印文件内容。
远程文件包含
http://192.168.37.136/DVWA/vulnerabilities/fi/?page=http://192.168.37.136/phpinfo.php
当输入目标主机IP地址时,直接进入目标主机的WWW目录下;
安全级别:Medium
(1)设置安全级别;
(2)查看源码;
(3)源码分析
查看源码可知:Medium级别使用了str_replace函数将“http://”,“https://”, “../”,“..\”替换为空;
可以使用“hthttp://tp://”, “..././”,”file:///”方式绕过;
(4)实验过程
4.1> 使用“hthttp://tp://”嵌套方式绕过;
http://192.168.37.136/DVWA/vulnerabilities/fi/?page=hthttp://tp://192.168.37.136/phpinfo.php
4.2> 使用file:///方式绕过
http://192 .168.37.136/DVWA/vulnerabilities/fi/?page=file:///c:\boot.ini
安全级别:High
(1)设置安全级别
(2)查看源码
(3)源码分析
使用fnmatch函数检查page参数,要求page参数必须以file开头,且不等于include.php
可以使用file:///方式绕过;
(4)实验过程
http://192.168.37.136/DVWA/vulnerabilities/fi/?page=file:///c:\boot.ini
安全级别:Impossible
(1)设置安全级别
(2)查看源码
Impossible级别中,page参数只能是如上四种,include.php,file1.php,file2.php,file3.php;杜绝了文件包含漏洞;
实验过程——Linux
安全级别:Low
(1)设置安全级别
(2)查看源码
(3)源码分析
page参数没有进行任何过滤
可以直接在浏览器中输入想查询或执行的内容;
(4)实验操作
本地文件包含
4.1> 查看目标操作系统类型
http://192.168.37.135/dvwa/vulnerabilities/fi/?page=/etc/passwd
可以查看到信息,说明操作系统为Linux;
4.2> 查看DNS配置文件的内容
http://192.168.37.135/dvwa/vulnerabilities/fi/?page=/etc/resolv.conf
4.3> 查看网卡配置文件
http://192.168.37.135/dvwa/vulnerabilities/fi/?page=/etc/network/interfaces
安全级别:Medium
(1)设置安全级别;
(2)查看源码;
(3)源码分析
将“http://”, “https://” 替换为空;
可以使用hthttp://tp://嵌套的方式,file:///的方式绕过;
(4)实验过程
http://192.168.37.135/dvwa/vulnerabilities/fi/?page=file:///etc/passwd
安全级别:High
(1)设置安全级别
(2)查看源码
(3)源码分析
page参数只能是include.php,杜绝了文件包含漏洞;