欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Dvwa漏洞测试之文件包含笔记

程序员文章站 2022-05-26 08:38:43
...
漏洞产生原因的本质是:用给定的可控的输入,输入了不可控的参数或代码,产生了不可控的结果。
文件包含漏洞我在前面已经进行过讲述,今天就漏洞测试和漏洞利用讨论下,漏洞测试环境是Dvwa。

漏洞产生原因:

被包含的页面可以被攻击者控制,也就是说攻击者可以随心所欲地去包含某个页面。
由于本次测试远程包含测试出现问题,暂不测试,本阶段暂时只测试本地包含。

漏洞测试:

Low

首先查看源码:

<?php 

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

      ?>

经过分析我们发现,服务器并未对传入的参数进行过滤,这里page参数的传入是不可控的,下面我们构造url。

Dvwa漏洞测试之文件包含笔记

发现虽然并成功,但却发现了服务器的绝对路径,继续构造url。

Dvwa漏洞测试之文件包含笔记

几种测试url均测试成功。可见没有的防御能力。

Dvwa漏洞测试之文件包含笔记

通过测试我们读取服务器任何文件,只要位置明确,而事实上,在如今的信息时代,系统的机密文件的位置已经不是秘密。

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级别是一样的。而远程包含的绕过可以通过双写绕过,比如hthttp://tp://,而../的过滤可以通过对其进行url编码绕过,如图:
Dvwa漏洞测试之文件包含笔记
这个漏洞的测试成功也更加证明了str_replace的不安全性。

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参数,要求page参数必须是file。服务器才去包含相应的文件。这个看似无懈可击,但却忘了一个php内置协议file协议,我们可以通过file协议访问文件。测试代码如下:

Dvwa漏洞测试之文件包含笔记

不要惊奇上面的url编码,其实是我懒得改,今天有点累,用绝对路径什么的都没影响,前面的payload都可以,关键是使用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的参数进行了严格的控制,这个就无解了。彻底杜绝了文件包含漏洞。