文件包含漏洞知识梳理
1、文件包含定义
程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,而无需再次编写,这种文件调用的过程一般被称为文件包含。
2、文件包含漏洞定义
程序开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,通过动态变量来引入需要包含的文件时,用户可以对变量的值可控而服务器端未对变量值进行合理地校验或者校验被绕过,这样就导致了文件包含漏洞。
3、文件包含漏洞原理
引入的文件名称可以被用户控制,且未对用户输入的文件名称进行严格的过滤,导致部分敏感文件(数据库配置文件、服务器etc/passwd文件等)可以被用户引入,从而泄露被引入文件内容,造成敏感信息泄露,漏洞产生。
4、文件包含漏洞分类
本地文件包含(Local File Include):
被包含的文件在服务器本地时,就形成本地文件包含(读取打开本地文件)
本地文件包含漏洞不需要在php.ini中修改配置
远程文件包含漏洞(Remote File Inclusion):
被包含的文件在第三方服务器时,叫做远程文件包含。(可通过网络协议,如http、ftp、PHP伪协议等,远程加载文件)
远程文件包含需满足php.ini文件中:
(1) allow_url_include = on和allow_url_fopen= on
(2) 所需的远程文件后缀不能与目标服务器的语言相同,如目标服务器解析PHP代码,则远程文件后缀不能为.php。
5、文件包含漏洞相关函数
PHP中:include()、include_once()、require()、require_once()、fopen()、readfile()、highlight_file()、show_source()、file_get_contents()、file()
Jsp/servlet:java.io.File()、java.io.FileReader()
asp: include file, include virtual
6、PHP文件包含漏洞四种函数的区别
include():当使用该函数包含文件时,只有代码执行到include()函数时才将文件包含进来,发生错误时只给出一个警告,继续向下执行
include_once():功能和include()相同,区别在于当重复调用同一文件时,程序只调用一次
require():require()与include()的区别在于require()执行如果发生错误,函数会输出错误信息,并终止脚本的运行 。使用require()函数包含文件时,只要程序一执行,立即调用文件,而include()只有程序执行到函数时才调用 .require()在php程序执行前执行,会先读入 require 所指定引入的文件,使它变成 PHP 程序网页的一部份。
require_once():它的功能与require()相同,区别在于当重复调用同一文件时,程序只调用一次
7、Linux和Windows系统中可读取的敏感文件
Windows:
C:\Windows\System32\drivers\etc\hosts //查看hosts文件
C:\boot.ini //查看系统版本
C:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件
C:\windows\repair\sam //存储Windows系统初次安装的密码
C:\ProgramFiles\mysql\my.ini //MySQL配置
C:\ProgramFiles\mysql\data\mysql\user.MYD //MySQL root密码
C:\windows\php.ini //php 配置信息
Linux:
/etc/passwd //账户信息
/etc/shadow //账户密码文件
/usr/local/app/apache2/conf/httpd.conf //Apache2默认配置文件
/usr/local/app/apache2/conf/extra/httpd-vhost.conf //虚拟网站配置
/usr/local/app/php5/lib/php.ini //PHP相关配置
/etc/httpd/conf/httpd.conf //Apache配置文件
/etc/my.conf //mysql 配置文件
8、文件包含漏洞的修复方式
(1)在php中关闭allow_url_fopen 和 allow_url_include
(2)设置白名单过滤,只能包含我们指定的文件
(3)将敏感字符过滤(‘,“,/,\等)
(4)将大小写,双写,点,空格,%00等过滤
(5)将伪协议进行过滤(file://,php://filter,php://input,zip://,compress.bzip2://,zlib//,data://)
(6)PHP 中使用 open_basedir 配置限制访问在指定的区域