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”之一,彻底杜绝了文件包含漏洞。

posted @ 2021-12-22 15:38  常青园  阅读(1585)  评论(0编辑  收藏  举报