文章目录
什么是文件包含
简单一句话,为了更好地使用代码的重用性,引入了文件包含函数,可以通过文件包含函数将文件包含进来,直接使用包含文件的代码。
文件包含漏洞成因
在包含文件时候,为了灵活包含文件,将被包含文件设置为变量,通过动态变量来引入需要包含的文件时,用户可以对变量的值可控而服务器端未对变量值进行合理地校验或者校验被绕过,这样就导致了文件包含漏洞。通常文件包含漏洞出现在
PHP
语言中。
PHP文件包含的函数
- include( )
当使用该函数包含文件时,只有代码执行到 include()函数时才将文件包含
进来,发生错误时之给出一个警告,继续向下执行。 - include_once( )
功能与 Include()相同,区别在于当重复调用同一文件时,程序只调用一次 - require( )
require()与 include()的区别在于 require()执行如果发生错误,函数会输出
错误信息,并终止脚本的运行。 - require_once( )
功能与 require()相同,区别在于当重复调用同一文件时,程序只调用一次。
文件包含漏洞分类
本地文件包含漏洞
当包含的文件在服务器本地时,就形成了本地文件包含。
下面简单做个测试:
<?php
$file = $_GET['file'];
include($file);
// ......
先说一下文件包含的一个要点:文件包含可以包含任意文件,即便被包含的文件并不是与当前编程语言相关,甚至为图片,只要文件被包含,其内容会被包含文件包含,并以当前服务器脚本语言执行。
可以看到,以上代码中可以控制可控参数file
来控制包含的$file
的值。
- 因此可以建立随意后缀文件进行包含,比如新建文件
file.txt
,文件内容如下:
<?php
phpinfo();
?>
然后包含file.txt
文件:
image.png
如果包含的文件内容不符合php语言语法的,会直接将文件内容输出,比如:
image.png
- 接下来再看一种情况,开发者限制了包含文件的后缀,代码如下:
<?php
$file = $_GET['file'] . '.php';
echo $file;
include($file);
这样就找不到要包含的文件了,如下:
image.png
此时,可以使用%00
截断,不过需要有前提条件:
1). PHP版本 < 5.3 (不包括5.3) ;
2). PHPmagic_quotes_gpc = off
;
3).PHP对所接收的参数,如以上代码的$_GET['file']
未使用addslashes
函数。
因为PHP大于等于5.3的版本已经修复了这个问题,如果开启了gpc
或者使用了addslashes
函数的话则会对其进行转义
首先看php版本小于5.3
,并且magic_quotes_gpc = Off
,1.php
内容如下