文件包含漏洞与PHP语言特性
一、文件包含
1、简介
在程序员开发过程中,通常会把可重复使用的函数写到单个文件中,在使用某些函数时,直接调用此文件,无需在此编写,这种调用文件的过程一般被称为文件包含。
随着网站业务的需求,程序开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用,但是正是这种灵活性通过动态变量的方式引入需要包含的文件时,用户对这个变量可控而且服务端又没有做合理的校检或者校检被绕过就造成了文件包含漏洞。
2、常见文件包含漏洞
1、include()
当使用该函数包含文件时,只有代码执行到include()函数时才将文件包含进来,发生错误时之给出一个警告,然后继续向下执行。
2、include_once()
功能和include()相同,区别在于当重复调用同一文件时,程序只调用一次
3、require()
Require()与include()的区别在于require()执行如果发生错误,函数会输出错误信息,并终止脚本的运行。
4、require_once()
功能与require()相同,区别在于当重复调用同一文件时,程序只调用一次。
5、highlight_file()、show_source()
函数对文件进行语法高亮显示,通常能看到源代码
6、readfile()、file_get_contents()、
函数读取一个文件,并写入到输出缓冲
7、fopen()
打开一个文件或者url
3、文件包含漏洞分类
3.1、本地文件包含
当被包含的文件在服务器本地时,就形成的本地文件包含漏洞。
3.2、远程文件包含漏洞
本地文件包含和远程文件包含造成漏洞的原因是一样的,
当php.ini 中的配 置选项allow_url_fopen和allow_url_include为ON的话,则包含的文件可以 是第三方服务器中的文件,这样就形成了远程文件包含漏洞。
所以远程文件包含条件:需要满足两个条件在php.ini中。当php.ini 中的配置选项
- allow_url_fopen:on
- allow_url_include:on
4、搭建平台
- 在phpstudy软件 WWW目录下创建一个flag.txt文件。
- 在** www/test**目录下创建一个test_include.php,代码如下:
<?php highlight_file(__FILE__); if(isset($_GET['file'])) { $str = $_GET['file']; include $_GET[