1、文件包含漏洞简介
1、1什么是文件包含
程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某些函数
时,直接调用此文件,无需再次编写,这种调用文件的过程一般被称为文件包含。
1、2 文件包含漏洞的成因
随着网站业务的需求,程序开发人员一般希望代码更灵活,所以将被包
含的文件设置为变量,用来进行动态调用,但是正是这种灵活性通过动态变
量的方式引入需要包含的文件时,用户对这个变量可控而且服务端又没有做
合理的校验或者校验被绕过就造成了文件包含漏洞。
1、3 PHP中常见包含文件的函数
Ø include( )
当使用该函数包含文件时,只有代码执行到 include()函数时才将文件包含
进来,发生错误时之给出一个警告,继续向下执行。
Ø include_once( )
功能与Include()相同,区别在于当重复调用同一文件时,程序只调用一次
Ø require( )
require()与include()的区别在于require()执行如果发生错误,函数会输出
错误信息,并终止脚本的运行。
Ø require_once( )
功能与require()相同,区别在于当重复调用同一文件时,程序只调用一次。
几乎所有的脚本语言中都提供文件包含的功能,但文件包含漏洞在 PHP 中
居多,而在JSP、ASP、ASP.NET程序中非常少,甚至没有包含漏洞的存在。这
与程序开发人员的水平无关,而问题在于语言设计的弊端。
1、4 文件包含漏洞的分类
本地文件包含漏洞:
当被包含的文件在服务器本地时,就形成的本地文件包含漏洞。
远程文件包含漏洞:
本地文件包含和远程文件包含造成漏洞的原因是一样的,当php.ini 中的配
置选项allow_url_fopen和allow_url_include为ON的话,则包含的文件可以
是第三方服务器中的文件,这样就形成了远程文件包含漏洞。
2、文件包含漏洞的利用
常见漏洞的环境
一、
二、
三、
3. 读取文件
3.1 读取敏感文件
如果目标主机存在本地文件包含漏洞,可以通过漏洞读取服务器上一些重要的文
件,我们知道在使用文件包含时,相当与被包含的文件内容存在于包含文件处,
因此被包含的文件是 PHP 文件则会被解析执行,其他格式的文件会显示文件内
容。
示例代码一种:通过读取本地文件来检测漏洞是否存在
成功读取本地写有php指针代码的文件
示例代码二:由于在包含文件时对包含的文件有一个指定的目录 action,因此
在检测漏洞时需要使用’../’这些来跳出指定的目录。
读取PHP源码文件
在PHP中有很多内置URL风格的封装协议,使用内置的封装协议可以读取PHP
文件。例:
http://localhost/file_inclusion/inclusion_1.php/?page=php://filter/read=
convert.base64-encode/resource=inclusion_1.php
访问以上URL之后可以得到Base64编码字符串:
Base64编码之后的PHP源代码,经过解码就可以得到源代码。
如,读出本地1.php文件
解码的1.php里面的内容
截断绕过
示例代码三可以看到,不仅对包含的文件指定了目录,还指定了文件的后缀。
如果我们上传文件的名字是 1.jpg,那么 PHP 程序在包含时变成了 1.jpg.php。
显然此文件是不存在的。但是此处可以使用截断来突破这段代码。
但是这种方法有一个前提是PHP版本小于5.3.4,并且magic_quotes_gpc=off,
如果为On,%00(NULL)会被转义,从无法进行截断。