DVWA靶场通关----(4) File Inclusion教程
File Inclusion(文件包含)
File Inclusion(文件包含),是指当服务器开启了allow_url_include选项时,通过一些PHP的特性函数(比如:include(),require(),include_once()和require_once())利用URL去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。
文件包含分类
本地文件包含:当被包含的文件在本地服务器时,就叫做本地文件包含
例:../../../../../etc/passwd
远程文件包含:当被包含的文件在第三方服务器时,就叫做远程文件包含
例:http://www.baidu.com 可以直接打开百度
特性函数区别
include() 当使用该函数包含文件时,只有代码执行到include()函数时才将文件包含进来,发生错误时只给出一个警告,继续向下执行
include_once() 功能和include()相同,区别在于当重复调用同一文件时,程序只调用一次
require() require()与include()的区别在于require()执行如果发生错误,函数会输出错误信息,并终止脚本的运行 。使用require()函数包含文件时,只要程序一执行,立即调用文件,而include()只有程序执行到函数时才调用 .require()在php程序执行前执行,会先读入 require 所指定引入的文件,使它变成 PHP 程序网页的一部份。
require_once() 它的功能与require()相同,区别在于当重复调用同一文件时,程序只调用一次
File Inclusion主题:
Low
源码解析
<?php // The page we wish to display //直接获取page参数,未做任何过滤 $file = $_GET[ 'page' ]; ?>
漏洞复现
(1)先点击下面的链接,进行尝试,可以看到有结果直接返回了
(2)这个地方因为我知道他的phpinfo.php文件在他的前两级目录文件中,所以我在这里就直接进行尝试了(本地包含)
(3)尝试一下包含百度页面,发现直接成功了(远程包含)
Medium
源码解析
<?php // The page we wish to display $file = $_GET[ 'page' ]; // Input validation //将参数中的http:// https:// ../ ..\都替换成空 $file = str_replace( array( "http://", "https://" ), "", $file ); $file = str_replace( array( "../", "..\"" ), "", $file ); ?>
这个地方加了一些过滤,将“http://”,“https://”,“../”,“..\”全部替换成了空,这个地方其实可以考虑双写绕过。
漏洞复现
构造一个新的
hthttp://tp://www.baidu.com
过滤后
http://www.baidu.com
过滤前
…/./
过滤后
../
High
源码解析
<?php // The page we wish to display $file = $_GET[ 'page' ]; // Input validation //文件名必须以file开始,或只能为include.php if( !fnmatch( "file*", $file ) && $file != "include.php" ) { // This isn't the page we want! echo "ERROR: File not found!"; exit; } ?>
匹配"file*",以'file'开头的文件,或者匹配include.php,如果不是以'file'开头的文件,或者不是include.php,就输出"ERROR: File not found!"。
漏洞复现
使用伪协议:file:// (访问本地文件系统)(伪协议文章参考:https://blog.csdn.net/Wu000999/article/details/101925271)
Impossible
源码解析
<?php // The page we wish to display $file = $_GET[ 'page' ]; // Only alLow include.php or file{1..3}.php //file变量只能为include.php、file1、file2、file3其中一个 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; } ?>
漏洞复现
Impossible难度的代码使用了白名单机制进行防护,简单粗暴,page参数必须为“include.php”、“file1.php”、“file2.php”、“file3.php”之一,彻底杜绝了文件包含漏洞。