在Web应用开发过程中,程序开发者经常会把具有某一功能的部分代码封装起来形成独立的文件,在后续想实现该功能时,就不需要重复编写,直接调用文件,大大提高编程效率。这种调用文件的过程一般被称为文件包含。开发人员为了使代码更灵活,会将被包含的文件设置为变量,用来进行动态调用。如果该变量的值被攻击者控制,就可能发生文件包含攻击。
什么是文件包含攻击?
文件包含攻击,是指攻击者利用文件包含函数的参数引入文件,而Web应用又没有对该参数进行严格的过滤,导致引入文件中的恶意脚本或代码被解析、执行,攻击者获取服务器信息,甚至获取服务器权限。在PHP开发的Web应用中,脚本、图片、文本文档等被文件包含后,都会作为PHP脚本来解析
PHP语言的4个文件包含函数
PHP编程语言中有4个用于文件包含的函数,这些函数包含一个文件时,不管文件是什么类型、扩展名是什么,文件中的PHP代码都会被执行。include()函数,包含并运行指定的文件,在发生错误时仅产生警告,代码继续向下运行;include_once()函数,与include()函数类似,但是使用该函数时,会先检查文件是否已经被包含,如果已经被包含,则不会再次包含;require()函数,包含并运行指定的文件,在发生错误时报错,代码运行终止;require_once()函数,与require()函数类似,但是不会重复包含。
// if( count( $_GET ) )
if( isset( $file ) )
include( $file );
else {
header( 'Location:?page=include.php' );
exit;
}
文件包含功能可以使开发人员在一个代码文件中直接包含(引入)另外一个代码文件,从而让代码更加高效。但是,如果被包含的文件是一个变量,且这个变量可以由前端用户传进来,那么可能会引发文件包含漏洞。攻击者会指定一个“意想不到”的文件让包含函数去执行,从而造成恶意操作。
本地文件包含
本地文件包含,是指攻击者利用文件包含漏洞读取本地服务器中的文件,以获取本地服务器的相关信息,或者在一定的条件下执行文件中的脚本。在Windows操作系统中,文件boot.ini可以获取系统的版本;文件php.ini可以获取PHP配置信息;文件my.ini可以获取MySQL配置信息;文件httpd.conf可以获取Apache服务器的配置信息。
在Linux操作系统中,文件/etc/password可以获取用户信息;文件/etc/my.conf可以获取MySQL配置信息;文件/etc/httpd/conf/httpd.conf可以获取Apache服务器的配置信息。
本地文件包含攻击,必须满足2个条件:(1)文件包含函数通过动态变量的方式引入需要包含的本地文件;(2)用户能够控制动态变量的输入
远程文件包含
远程文件包含,是指攻击者在文件包含函数中引入远程服务器中的文件,以执行远程文件中的恶意代码。攻击者可以自定义远程文件的内容,通过远程文件包含漏洞直接执行文件中的脚本,如一句话木马,获取服务器的权限。一般,远程文件包含漏洞造成的危害要远大于本地文件包含漏洞。
远程文件包含攻击,必须满足3个条件:
(1)文件包含函数通过动态变量的方式引入需要包含的远程文件。
(2)用户能够控制动态变量的输入。
(3)PHP配置文件php.ini中allow_url_fopen=on、allow_url_include=on。其中,allow_url_fopen参数定义了是否允许打开URL文件(远程文件);allow_url_include参数定义了是否允许包含URL文件。由于远程文件包含的危害极大,在PHP 5.2版本之后,默认只能包含本地文件,关闭远程文件包含,即allow_url_include=off。
文件包含漏洞分析
进行文件包含攻击时,首先根据页面回显的信息、URL、报错信息等判断是否存在文件包含漏洞。如果可能存在,则构建包含本地或远程文件的路径,获取服务器的敏感信息,甚至服务器的权限。通过本地文件包含漏洞,服务器的关键信息被泄露,致使攻击者利用收集到的信息进行进一步的攻击。通过远程文件包含漏洞,攻击者可以篡改网页、安装后门、控制服务器等,后果非常严重
DVWA
级别low
- 点击file1.php,文件名直接显示在了地址栏 (这种情况会出现文件包含)
- 直接修改url中的文件,发