DVWA:全等级文件包含

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

  文件包含漏洞分为本地文件包含漏洞与远程文件包含漏洞,远程文件包含漏洞是因为开启了php配置中的allow_url_fopen选项(选项开启之后,服务器允许包含一个远程的文件)。我们的目的,就是获取到网站的路径,从而可以访问文件。

Low

  我们调整难度至Low,然后打开File Inclusion关卡:

   我们查看源码得知(具体路径见下图),服务器对page参数没有任何的过滤和检查。服务器希望用户点击图中的三个链接,服务器会包含相应文件,并将结果返回。需要说明的是。不管文件后缀是否是php,都会当做php文件执行,如果文件内容确认为php,则正常执行并返回结果,如果不是,则返回打印文件内容,所以文件包含漏洞常常会导致任意文件读取与任意命令执行:

 

   我们试一下点击当中的File:

   事实上恶意的攻击者是不会乖乖点击这些链接的,因此page参数是不可控的。我们用什么方法来进行呢?可以使用url构造路径。

构造绝对路径的url:

  我们这里使用Harkbar来构造,这里我们直接通过将include.php改为../../../../../etc/passwd(../实现向上一级目录跳转,多个时就会返回到根目录,其数量应多一点。),然后发现报错了,而且把路径暴露得一清二楚:

   通过绝对路径也可以直接访问得到:

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

  通过文件系统访问方式file://也可以实现访问,注意一点的是后面必须是绝对路径:

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

   获取到绝对路径之后。我们可以通过进入每一个文件夹得到你要的内容,这里我们在这个路径下访问这个服务器任意一个文件,这里我创建了一个文本文档,里面随便输入了一点内容:

   然后访问:

  http://192.168.1.1/DVWA-master/vulnerabilities/fi/?page=C:phpStudyWWW111.txt

  

   在超级不显眼的地方,文件里面的东西已经输出出来了,我们访问成功,说明这个路径可用。

Medium

  照旧调整为中等难度,然后我们打开代码进行分析(事实上很少,一眼就了解了):

   然后看到比起上一个难度,它新增加了两条语句,用str_replace函数,对page参数进行了一定的处理,将”http:// ”、”https://”、 ” ../”、”..”替换为空字符,即删除。

  这样的替换我前面的Sqli-labs里已经提到过,显而易见我们可以通过双写绕过WAF。同时,因为替换的只是“../”、“..”,所以对采用绝对路径的方式包含文件是不会受到任何限制的,采用绝对路径的办法不受影响。所以我们的语句也与上面基本相同,只是在被替换的地方双写一下即可(红色部分会被替换为空字符,最后前后的http会被保留下来):

  http://192.168.1.1/DVWA-master/vulnerabilities/fi/?page=hthttp://tp://192.168.1.1

High

  打开DVWA页面,我们调节为High等级,然后打开File Inclusion关卡,发现页面发生了错误:

  查看了很多资料,后来女朋友在下列网址发现了解决办法,发现原来是缺少了一部分代码:

  https://blog.csdn.net/weixin_44603091/article/details/104373079

  我们查看代码来看看这一关进行了什么样的防御:

  可以看到,High级别的代码使用了fnmatch函数检查page参数,要求page参数的开头必须是file,服务器才会去包含相应的文件。

  

  因为报错,所以按照错误提示,打开C:phpStudyBWWWvulnerabilitiesfisourcehigh.php,添加下列语句

   if(!function_exists('fnmatch')) {

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

  添加的语句的代码如下图

   然后刷新,发现正常显示:

  我们可以利用file协议绕过防护策略。file协议其实我们并不陌生,当我们用浏览器打开一个本地文件时,用的就是file协议。

file协议绕过防护策略

  我们来构造一个url的语句,访问我新建的111.txt文件,访问php本地配置文件由于file协议只支持本地文件读取,不支持远程文件执行,就没办法执行远程文件(当然可以利用文件上传漏洞配合执行文件包含) 下次博客会更新文件上传漏洞.结合进去文件包含执行。

  http://192.168.1.1/DVWA-master/vulnerabilities/fi/?page=file:///C:phpStudyWWW111.txt

   输出成功。

原文地址:https://www.cnblogs.com/FHBBS/p/12456354.html