• 5、DVWA——文件上传


    一、文件上传原理

      文件上传漏洞一般指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。文件上传本身是web中最为常见的一种功能需求,关键是文件上传之后服务器端的处理、解释文件的过程是否安全。一般的情况有:

    • 上传文件WEB脚本语言,服务器的WEB容器解释并执行了用户上传的脚本,导致代码执行
    • 上传文件FLASH策略文件crossdomain.xml,以此来控制Flash在该域下的行为;
    • 上传文件是病毒、木马文件,攻击者用以诱骗用户或管理员下载执行;
    • 上传文件是钓鱼图片或为包含了脚本的图片,某些浏览器会作为脚本执行,实施钓鱼或欺诈。

      以下是upload-labs靶场关于文件上传漏洞的总结:
    在这里插入图片描述

    二、low

    2.1 源码分析

    
    
    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 '
    Your image was not uploaded.
    '
    ; } else { // Yes! echo "
    {$target_path} succesfully uploaded!
    "
    ; } } ?>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

      分析:
      basename(path,suffix) 函数返回路径中的文件名部分,如果可选参数 suffix 为空,则返回的文件名包含后缀名,反之不包含后缀名。move_uploaded_file() 函数将上传的文件移动到新位置。若成功则返回 true,否则返回 false。由此可见源码对上传文件直接移动,而文件的类型、内容没有做任何的检查、过滤。

    2.2 通关步骤

      既然没有过滤,直接用phpinfo探针:
    在这里插入图片描述
    在这里插入图片描述

    三、medium

    3.1 源码分析

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

      分析:
      FILES 是一个已经弃用的 HTTP 文件上传变量,它是一个通过 HTTP POST 方式上传到当前脚本的项目的数组。由此可见源码会获取文件的文件名、文件类型和文件大小,它要求文件类型必须是 jpeg 或者 png,同时限制文件大小不能超过 100000B(约为97.6KB)。

    3.2 通关思路

      源码中只限定文件类型和文件大小,我们的文件大小满足要求,至于文件类型,修改数据包中的文件类型即可。
    在这里插入图片描述
    在这里插入图片描述

    四、high

    4.1 源码分析

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

      分析:

    • strrpos(string,find,start) 函数返回字符串 find 在另一字符串 string 中最后一次出现的位置,如果没有找到字符串则返回 false,可选参数 start 规定在何处开始搜索。
    • getimagesize(string filename) 函数会通过读取文件头,返回图片的长、宽等信息,如果没有相关的图片文件头则报错。
    • 源码通过字符串匹配来确定文件后缀名,并且查看文件头,提高了过滤的强度。

    4.2 通关思路

    在这里插入图片描述

      这样做,会将文件上传到相应位置,但是需要将图片当作php文件来执行,才会获得webshell。因此,要想利用该漏洞,需要结合文件包含漏洞。

  • 相关阅读:
    feign统一加入token,同时定时任务中feign 调用没有token(定时任务的token校验是放开的)冲突
    Linux之history历史指令查看
    java毕业设计晨曦文学社在线投稿系统的设计与实现mybatis+源码+调试部署+系统+数据库+lw
    加密货币,可能是你唯一能实现“财富自由”的领域 2021-05-24
    被火车撞了都不能忘记的两个题(考验你的递归能力)
    集合——List接口:关于ArrayList、LinkedList和Vector的区别
    CSS实现空心的“尖角”
    BOT模块论文阅读
    Innodb如何实现表--上篇
    海事无人机解决方案
  • 原文地址:https://blog.csdn.net/qq_55202378/article/details/132800190