文件包含漏洞
概念:
函数包含php文件的时候,由于没有对包含的文件名进行过滤处理或者处理不是太严谨,webb脚本可能允许客户端用户输入调用包含在服务器的文件,会导致恶意代码的执行以及敏感信息的泄露。
包含作用:问了更好的使用代码的复用性,引入了文件包含函数,可以通过文件包含函数文件包含进来,直接使用包含文件的代码。
漏洞产生原因:包含文件的时候,为了灵活包含文件,将被包含文件设置为变量,通过动态变量来引入需要包含的文件时,用户可以对变量的值可控二服务器端未对变量值进行合理的校验或者校验不严谨,这样就导致了文件包含漏洞。
php包含函数:
include():当使用该函数包含文件时,只有代码执行到include()函数时才将文件包含进来,发生错误时给出一个警告,继续向下执行。
include_once():功能大致相同,区别在于重复调用同一文件。程序只调用一次
require():require与include区别在于require执行如果发生错误,函数会输出错误信息,并终止脚本的运行。
require_once():功能大致相同,区别在于重复调用同一文件时,程序只调用一次。
包含漏洞分类:
1、本地文件包含漏洞
当包含的文件在服务器本地时,就形成了本地文件包含。
例一:我们新建一个1.php文件,内容如下:
<?php
$file = $_GET['file'];
include($file);
?>
新建一个test.txt文件,里面添加一些内容,测试结果:如果包含文件内容不符合php语言语法,会直接将文件内容输出。
例二:当开发者限制了包含文件的后缀时
<?php
$file = $_GET['file'].'.php';
include($file);
?>
此时,可以使用%00截断,不过需要有前提条件。
(1)php版本<5.3
(2)phpmagic_quotes_gpc = off
(3)php对所接收的参数,如以上代码的$_GET['file']未使用addslashes函数
2、远程文件包含漏洞
远程文件包含的注意点:
(1)需要php.ini中allow_url_include=on以及allow_url_fopen=on
(2)所包含远程服务器的文件后缀不能与目标服务器语言相同。
例:我们远程访问之前新建的文件