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

来源:互联网 发布:查端口8080是否被占用 编辑:程序博客网 时间:2024/05/16 00:48
漏洞产生原因的本质是:用给定的可控的输入,输入了不可控的参数或代码,产生了不可控的结果。文件包含漏洞我在前面已经进行过讲述,今天就漏洞测试和漏洞利用讨论下,漏洞测试环境是Dvwa。

漏洞产生原因:

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

漏洞测试:

Low

首先查看源码:

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

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

这里写图片描述

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

这里写图片描述

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

这里写图片描述

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

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编码绕过,如图:
这里写图片描述
这个漏洞的测试成功也更加证明了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协议访问文件。测试代码如下:

这里写图片描述

不要惊奇上面的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的参数进行了严格的控制,这个就无解了。彻底杜绝了文件包含漏洞。