简介
执行PHP文件时,可以通过文件包含函数加载另一个文件,当服务器开启allow_url_include选项时,就可以通过php的某些特性函数,利用url去动态包含文件并解析执行,这会为开发者节省大量的时间。这意味着您可以创建供所有网页引用的标准页眉或菜单文件。当页眉需要更新时,您只更新一个包含文件就可以了,或者当您向网站添加一张新页面时,仅仅需要修改一下菜单文件(而不是更新所有网页中的链接)。但是,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。文件包含漏洞分为本地文件包含漏洞与远程文件包含漏洞,远程文件包含漏洞是因为开启了php配置中的allow_url_fopen选项(选项开启之后,服务器允许包含一个远程的文件)。
文件包含相关函数
include()
require()
include_once()
require_once()
include和require区别主要是,include在包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行;而require函数出现错误的时候,会直接报错并退出程序的执行。
而include_once(),require_once()这两个函数,与前两个的不同之处在于这两个函数只包含一次,适用于在脚本执行期间同一个文件有可能被包括超过一次的情况下,你想确保它只被包括一次以避免函数重定义,变量重新赋值等问题。
实验
实验环境:phpstudy 2016(Windows+Apache+MySql+PHP5.45) + DVWA
实验过程:
此漏洞涉及到一个重要配置allow_url_include为on,协议包含(即可加入链接)需要配置allow_url_include为on,allow_url_include在phpstudy中是默认关闭的,需要修改配置文件php.ini
靶机界面 http://169.254.16.216/DVWA/vulnerabilities/fi/?page=include.php
Low级别页面源码
由源码可知此页面对调用文件未作任何过滤
通过将page=后的参数替换即可触发文件包含漏洞
常见的敏感信息路径有:
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 配置文件
访问http://169.254.16.216/DVWA/vulnerabilities/fi/?page=etc/passwd
发现页面返回错误
进而可知此靶机位windows系统
构造url http://169.254.16.216/DVWA/vulnerabilities/fi/?page=C:\phpstudy\WWW\1.txt 可获取1.txt文本信息(被当作php解析)
也可构造相对路径url http://169.254.16.216/DVWA/vulnerabilities/fi/?page=../../../1.txt
Medium级别页面源码
此等级中用到了str_replace函数将”http:// ”、”https://”、 ” ../”、”..\”替换为了空字符,也就是删除,对此我们可以用双写来绕过
构造url http://169.254.16.216/DVWA/vulnerabilities/fi/?page=..././..././..././1.txt 成功绕过
绝对路径不受影响
HIGH级别源码
此级别中代码使用了fnmatch函数来检查page参数是否正确,只有page参数开头为file的才能被包含,因此我们可以利用file://伪协议来绕过
构造url http://169.254.16.216/DVWA/vulnerabilities/fi/?page=file:///C:\phpstudy\WWW\DVWA\1.txt
此外,我们还可以利用多个伪协议来实现文件包含
例如,利用php://来读取文件
构造url http://169.254.16.216/DVWA/vulnerabilities/fi/?page=php://filter/read=convert.base64-encode/resource=C:\phpstudy\WWW\DVWA\1.txt
Base64 解码得
防护
如无必要,关闭文件包含功能,及将allow_url_include参数设置为off。或者对文件包含的对象启用白名单。