• dvwa 文件上传漏洞通关攻略


    dvwa 文件上传漏洞通关攻略


    练习文件上传漏洞的攻击与防御

    low等级

    在这里插入图片描述
    点击文件上传进行测试上传个一句话木马

    ')  ?>
    
    • 1

    在这里插入图片描述
    利用文件包含漏洞执行图片里的php语句
    在这里插入图片描述
    可以看到图片以二进制的方式读出来,那么他就会在当前目录下生成一个yjh.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 ) ) {  //检测图片信息但是getimagesize只检测头部
    
            // Can we move the file to the upload folder?
            if( !move_uploaded_file( $uploaded_tmp, $target_path ) ) {
                // No
                echo '
    Your image was not uploaded.
    '
    ; } else { // Yes! echo "
    {$target_path} succesfully uploaded!
    "
    ; } } else { // Invalid file echo '
    Your image was not uploaded. We can only accept JPEG or PNG images.
    '
    ; } } ?>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    对文件的后缀名和文件头部的内容进行过滤

    impossible

    代码审计

    
    
    if( isset( $_POST[ 'Upload' ] ) ) {
        // Check Anti-CSRF token
        checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );  //检测token值防止重放
    
    
        // 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 "
    ${target_file} succesfully uploaded!
    "
    ; } else { // No echo '
    Your image was not uploaded.
    '
    ; } // Delete any temp files if( file_exists( $temp_file ) ) unlink( $temp_file ); } else { // Invalid file echo '
    Your image was not uploaded. We can only accept JPEG or PNG images.
    '
    ; } } // Generate Anti-CSRF token generateSessionToken(); ?>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62

    完全防御对token进行了判断对后缀名文件类型进行了检测又检测了头部信息对文件进行了二次渲染,又一次对文件进行重命名,最后过unlink是删除缓冲区的文件 unlink是有竞争条件漏洞的 只要在没来的及删除的情况一直发送包,文件就会被保存下来 但是在本次是无法突破的
    想让绕过二次渲染需要将木马插入到头部
    但是 getimagesize又是用来检测头部信息的,所以说做到了防御
    但是这个防御也不是不能被绕过在检测头部和二次渲染之间有一段空白的区域是可以插入一句话木马的

  • 相关阅读:
    国科大移动互联网考试资料(2023+2020+2018真题+答案)
    【QEMU中文文档】1.3 弃用功能
    【go-zero】go-zero 脚手架 simple-admin 第一章:通过goctls生成rpc整个项目 | go-zero整合 ENT数据库orm框架
    SpringBoot入门知识
    Oracle官方文档对nfs挂载参数的说明
    python+大数据校园卡数据分析 计算机竞赛
    Bert-as-service 实战
    【Linux】第十七站:进程创建与进程终止
    JVM(5)
    我的世界村民为什么会消失?
  • 原文地址:https://blog.csdn.net/weixin_70137901/article/details/134448436