File Upload(文件上传漏洞)

File Upload:

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

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' ] ); //上传目录加上'uploaded'表单参数所提交的文件名

    // Can we move the file to the upload folder?
    if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
        // No  移动文件,将上传的文件移动到/hackable/uploads/
        echo '<pre>Your image was not uploaded.</pre>';
    }
    else {
        // Yes!
        echo "<pre>{$target_path} succesfully uploaded!</pre>";
    }
}

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

  • basename(path,suffix)函数返回路径中的文件名

  • move_uploaded_file() 函数将上传的文件移动到新位置,move_uploaded_file(file,newloc)。

  • 文件上传漏洞需满足三个条件

    • (1) 能够成功上传文件
      (2) 文件能够被执行
      (3) 文件上传的路径必须知道
      

方法:本关满足三个条件,上传一句话木马,使用菜刀直接连接

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文件,大小不能超过100000B

方法一:可以使用burp抓包修改文件的类型,修改为image/jpeg,上传php一句话木马,然后使用菜刀连接

方法二:将木马文件后缀改为png进行上传,使用文件包含的方式尝试用菜刀连接,url为http://127.0.0.1/dvwa/vulnerabilities/fi/?page=hthttp://tp://127.0.0.1/dvwa/hackable/uploads/1.png

  • 中国菜刀的原理是向上传文件发送包含apple参数的post请求,通过控制apple参数来执行不同的命令,而这里服务器将木马文件解析成了图片文件,因此向其发送post请求时,服务器只会返回这个“图片”文件,并不会执行相应命令。

方法三:截断绕过规则,

  • 上传文件名为1.php%00.png,绕过文件类型检查

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?后缀名一定要是jpg或jpeg或png,并且大小不超过100k,并且通过文件信息判断图片
    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>';
    }
}

?> 

增加函数:

  • strrpos(string,find,start)
    函数返回字符串find在另一字符串string中最后一次出现的位置,如果没有找到字符串则返回false,可选参数start规定在何处开始搜索。
  • getimagesize(string filename)
    函数会通过读取文件头,返回图片的长、宽等信息,如果没有相关的图片文件头,函数会报错。
    可以看到,High级别的代码读取文件名中最后一个”.”后的字符串,期望通过文件名来限制文件类型,因此要求上传文件名形式必须是”.jpg”、”.jpeg” 、”*.png”之一。同时,getimagesize函数更是限制了上传文件的文件头必须为图像类型。

方法:使用copy语句将图片与php文件合并,使得一句话木马藏在图片文件最后,然后进行上传,使用文件包含形式进行连接菜刀,得到webshell

  • 图解

  • copy语句将图片与php文件合并
    在这里插入图片描述

  • http://127.0.0.1/dvwa/vulnerabilities/fi/?page=hthttp://tp://127.0.0.1/dvwa/hackable/uploads/hack.png
    
下面是一个常见的解决方案,用于修复Java中的文件上传漏洞: 1. 验证文件类型:在接收文件上传时,不仅要验证文件扩展名,还应该检查文件的MIME类型。可以使用Java的MimeTypeMap类或Apache的Tika库进行验证。 ```java import org.apache.tika.Tika; String mimeType = new Tika().detect(file); if (!mimeType.startsWith("image/")) { // 非图片类型,拒绝上传 } ``` 2. 限制文件大小:在服务器端设置最大文件大小限制,以防止上传过大的文件。可以在应用程序的配置文件中配置最大文件大小,并在上传前检查文件大小。 ```java // 假设maxFileSize是允许的最大文件大小,单位为字节 if (file.getSize() > maxFileSize) { // 文件过大,拒绝上传 } ``` 3. 隔离上传目录:确保上传的文件存储在与应用程序代码和其他敏感数据隔离的目录中。最好使用一个独立的目录来存储上传的文件,并确保该目录不可通过Web访问。 ```java String uploadDirectory = "/path/to/upload/directory"; File saveFile = new File(uploadDirectory, fileName); // 保存上传文件到指定目录 ``` 4. 文件名处理:对上传的文件名进行处理,以防止路径遍历攻击和其他安全问题。可以使用正则表达式或字符串替换方法来删除或转义文件名中的特殊字符,并使用随机生成的文件名来保存上传的文件。 ```java String safeFileName = fileName.replaceAll("[^a-zA-Z0-9.-]", "_"); File saveFile = new File(uploadDirectory, safeFileName); // 保存上传文件到指定目录,使用安全的文件名 ``` 5. 安全权限设置:确保存储上传文件的目录具有适当的权限设置。限制对该目录的写入权限,并仅允许应用程序访问所需的文件。 ```bash chmod 700 /path/to/upload/directory ``` 6. 定期清理:定期检查上传目录并删除不再需要的文件。可以编写一个定时任务或脚本来清理过期或不再使用的上传文件。 这些解决方案可以帮助您修复Java中的文件上传漏洞。请记住,安全性是一个持续的过程,您可能还需要考虑其他安全措施,如防火墙、安全审计等。最重要的是,及时更新和修补您的应用程序以解决已知的安全漏洞
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值