当前位置 : 主页 > 网页制作 > HTTP/TCP >

文件包含漏洞(File Inclusion)

来源:互联网 收集:自由互联 发布时间:2021-06-16
简介 执行PHP文件时,可以通过文件包含函数加载另一个文件,当服务器开启allow_url_include选项时,就可以通过php的某些特性函数,利用url去动态包含文件并解析执行,这会为开发者节省

简介

执行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。或者对文件包含的对象启用白名单。

网友评论