DVWA全系列-文件包含

文件包含漏洞属于代码注入漏洞,为了减少重复代码的编写,引入了文件包含函数,通过文件包含函数将文件包含进来,直接使用包含文件的代码;简单来说就是一个文件里面包含另外一个或多个文件。

几乎所有脚本语言都会提供文件包含的功能。

文件包含的原理

PHP中提供了四个文件包含的函数,分别是include()、include_once()、require()和require_once()。这四个函数都可以进行文件包含,但作用并不一样。

require:找不到被包含的文件时会产生致命错误,并停止脚本。

include:找不到被包含的文件时只会产生警告,脚本将继续执行。

include_once:和include()语句类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含。 require_once:和require()语句类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含。

LOW 

<?php

// The page we wish to display
$file = $_GET['page'];

?> 

用 GET 方法接收文件路径,什么防护都没有然后将其包含进来。服务器包含文件时,无论文件是否是 PHP 文件,都会尝试当做 PHP 文件来执行。如果文件内容确实是 PHP 文件,则会正常执行并返回结果,如果不是则会将文件内容回显到网页中,所以文件包含漏洞常常会导致任意文件读取与任意命令执行。

看到默认页面就有一个包含的参数page,这里默认包含了一个include.php文件,下面还有file1-3.php都是给我们包含的。

例如靶场提供了 3 个文件,单击这些文件就会显示其执行内容,同时 url 也会用 GET 方法传递参数。

通过访问file1.php、file2.php、file3.php发现一个规律:

攻击方式

需开启PHP文件中的allow_url_include=on和allow_url_fopen=on

本地包含

1、所包含文件内容符合PHP语法规范:任何扩展名都可以被PHP解析。
2、包含非PHP语法规范源文件,会暴露其源代码。

page 参数指的是文件路径,因此我们先传个不存在的文件名测试一下,看看有没有报错信息。传递 page 参数为 “1.php”,靶场报错并返回了文件所在的路径。

Warning: include(1.php): failed to open stream: No such file or directory in D:\DVWA-master\vulnerabilities\fi\index.php on line 36 Warning: include(): Failed opening '1.php' for inclusion (include_path='.;C:\php\pear;../../external/phpids/0.6/lib/') in D:\DVWA-master\vulnerabilities\fi\index.php on line 36

直接用相对路径,访问上两级文件夹下的 “fi.php'” 文件,构造出 payload。

?page=..\..\hackable\flags\fi.php

.\ 表示项目文件所在目录之下的目录。
..\ 表示项目文件所在目录向上一级目录下的目录。
..\..\表示项目文件所在目录向上二级目录之下的目录 

把include.php替换成/etc/passwd尝试包含一下这个文件,/etc/passwd这个文件存放着我们的用户名,每个用户都有读取的权限,所以经常拿这个文件来做尝试。 

​直接包含成功了。 

远程包含

在url 的page=后写http://

如果要使用远程包含功能,首先需要确定PHP是否已经开启远程包含功能选项(php默认关闭远程包含功能:allow_url_include=off),开启远程包含功能需要在php.ini配置文件中修改。

若file上出现红框“The PHP function allow_url_include is not enabled."

解决方法:phpstudy-设置-文件位置-php-php7.3.4nts-php.ini-allow_url_include=On-重启apache

我们知道dvwa根目录有一个phpinfo.php文件,可以显示服务端php配置信息,我们把之前的url参数中的php.ini换成phpinfo.php执行下。 

出现了php的配置信息,表明了文件包含不仅能读文件还能够执行文件.
远程文件执行本地构造的文件:
我们在本地网站创建一个phpinfo.txt文件写入php代码如图:

DEDIUM

<?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 函数对 page 参数进行了过滤。将 “http://”、“https://”替换为空阻止远程包含漏洞,将“../”、“..\” 替换为空阻止用相对路径访问文件。

攻击方式

虽然代码将相对路径的语法过滤了,但是绝对路径不受影响,可以利用网页的报错信息推导出其他文件的绝对路径。当然也可以使用双写绕过,也就是让 str_replace 函数替换后的 page 参数是文件路径即可。

?page=...\.\...\.\hackable\flags\fi.php

利用漏洞:双写绕过

在这里插入图片描述

HIGH

<?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 根据指定的模式来匹配文件名或字符串。该函数将检查 page 参数开头必须是否是 file,若是服务器才会去包含相应的文件。不为file开头的文件或者不为include.php就返回ERROR: File not found!,然后退出。

file协议:文件传输协议,访问本地计算机的文件

攻击方式

利用file伪协议读取到文件内容

?page=file:///D:\DVWA-master\hackable\flags\fi.php

IMPOSSIBLE

<?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;
}

?>

开发人员只对允许的页面进行硬编码,并提供精确的文件名,使用了白名单过滤的方法,这样做消除了所有的攻击途径。

  • 33
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值