Loading

DVWA 之 File Inclusion-文件包含

四、File Inclusion-文件包含

原理

文件包含:开发人员将相同的函数写入单独的文件中,需要使用某个函数时直接调用此文件,无需再次编写,这种文件调用的过程称文件包含。

文件包含漏洞:开发人员为了使代码更灵活,会将被包含的文件设置为变量,用来进行动态调用,从而导致客户端可以恶意调用一个恶意文件,造成文件包含漏洞。如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行,文件包含漏洞分为本地文件包含漏洞与远程文件包含漏洞,远程文件包含漏洞是因为开启了 php 配置中的 allow_url_fopen 选项(选项开启后,服务器允许包含一个远程的文件)。

文件包含用到的函数

require:找不到被包含的文件,报错,并且停止运行脚本

include:找不到被包含的文件,报错,但会继续运行脚本

require_once:与require类似,区别在于当重复调用同一文件时,程序只调用一次

include_once:与include类似,区别在于当重复调用同一文件时,程序只调用一次

文件包含特征

?page=a.php
?home=b.html
?file=content

检测方法

?file=../../../../etc/passwd
?page=file:///etc/passwd
?home=main.cgi
?page=http://www.a.com/1.php
http://1.1.1.1/../../../../dir/file.txt

1. Low

在 URL 界面中输入 ?page=/ect/shadow,结果如下

可以看到其暴露出了服务器文件的绝对路径,根据绝对路径构造WWW/DVWA-master/phpinfo.php,可以读取服务器的配置文件

同理,通过构造绝对或者相对URL路径可以读取任意文件内容。

查看源代码,发现其对包含的文件没有进行任何的过滤。

<?php

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

?>

2. Medium

查看源代码

<?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 函数的替换规则。

例如page=hthttp://tp://127.0.0.1/phpinfo.txtstr_replace函数会将http://删除,于是页面网址变成page=http://127.0.0.1/phpinfo.txt,可以成功执行远程命令。

同时,因为替换的只是../..\,所以采用绝对路径的方式包含文件是不会受到任何限制的。

构造绝对路径page=D:\省略\省略\WWW\DVWA-master\phpinfo.php,执行成功。

3. High

构造绝对路径访问,显示ERROR: File not found!

查看源代码

<?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()函数根据指定的模式来匹配文件名或字符串,可以看到,High级别的代码对包含的文件名进行了限制,必须为file*或者include.php,否则会提示Error。

漏洞利用

利用file协议绕过防护策略,通过浏览器打开一个本地文件,用到的就是file协议。

构造url

http://127.0.0.1/DVWA-master/vulnerabilities/fi/?page=file:///D:\WebSecurity\phpstudy_pro\WWW\DVWA-master\phpinfo.php

成功包含phpinfo.php文件

若要执行任意命令,需要配合文件上传漏洞利用。首先上传一个内容为php的文件,然后再利用file协议去包含上传文件,从而实现任意命令执行。

防护方法

  • 文件包含参数写死
  • 文件包含参数不可由用户修改
  • 禁止目录跳转字符"../"
  • 使用文件验证白名单
posted @ 2023-03-04 22:24  紫曜花  阅读(264)  评论(0编辑  收藏  举报