Pikachu靶场-Unsafe Fileupload
字数 1106 2025-08-24 20:49:22

不安全的文件上传漏洞教学文档

1. 不安全的文件上传漏洞概述

文件上传功能在Web应用系统中非常常见,例如头像上传、附件上传等。当用户上传文件时,后台通常会对文件进行以下判断:

  • 文件类型
  • 文件后缀名
  • 文件大小
  • 然后按照设计的格式进行重命名并存储在指定目录

漏洞风险:如果后台对上传文件没有进行足够严格的安全判断,攻击者可能上传恶意文件(如一句话木马),导致服务器被植入Webshell。

安全设计建议

  • 验证文件类型、后缀名、大小
  • 验证文件的上传方式
  • 对文件进行复杂重命名
  • 不要暴露文件上传后的路径

2. 客户端检查绕过 (Client Check)

漏洞分析

前端JavaScript代码检查文件扩展名:

function checkFileExt(filename) {
    var flag = false;
    var arr = ["jpg","png","gif"]; // 允许的扩展名
    var index = filename.lastIndexOf(".");
    var ext = filename.substr(index+1);
    
    for(var i=0;i<arr.length;i++) {
        if(ext == arr[i]) {
            flag = true;
            break;
        }
    }
    
    if(!flag) {
        alert("上传的文件不符合要求,请重新选择!");
        location.reload(true);
    }
}

绕过方法

  1. 禁用JavaScript

    • 在火狐或Chrome浏览器中禁用JavaScript
    • 上传PHP文件时,前端验证将被绕过
  2. 直接构造请求

    • 使用Burp Suite等工具直接发送上传请求,绕过前端验证

利用结果

上传成功后访问路径:

http://x.x.x.x/vul/unsafeupload/uploads/phpinfo.php

3. MIME类型检查绕过

漏洞分析

服务器检查上传文件的MIME类型:

  • 常见图片MIME类型:
    • GIF图形: image/gif
    • JPEG图形: image/jpeg
    • PNG图形: image/png

绕过方法

  1. 上传PHP文件时,抓包修改Content-Type为图片类型:

    Content-Type: image/jpeg
    
  2. 上传步骤:

    • 选择PHP文件上传
    • 拦截请求
    • 修改Content-Type头
    • 放行请求

4. getimagesize检查绕过

漏洞分析

PHP的getimagesize()函数检查文件头是否为有效的图像格式。

绕过方法

方法一:添加图片文件头

  1. 在PHP文件开头添加图片标识:

    • 对于GIF: GIF89
    • 对于JPEG: ÿØÿà
    • 对于PNG: ‰PNG
  2. 示例:

    GIF89
    <?php phpinfo(); ?>
    
  3. 保存为.jpg扩展名后上传

方法二:图片后附加PHP代码

  1. 使用命令行合并图片和PHP代码:

    copy 1.png/b + phpinfo.php/a 2.png
    
    • /b表示二进制文件
    • /a表示ASCII文件
  2. 上传合并后的文件

利用方法

由于服务器将文件识别为图片,需要配合文件包含漏洞执行PHP代码:

http://x.x.x.x/vul/fileinclude/fi_local.php?filename=../../unsafeupload/uploads/2020/10/20/5936185f8e5245666f2586884965.jpg&submit=提交查询

5. 防御措施

有效的防御策略

  1. 服务器端验证

    • 文件扩展名白名单
    • 文件内容验证
    • MIME类型验证
  2. 文件处理

    • 重命名上传文件(避免使用用户提供的文件名)
    • 设置适当的文件权限
    • 存储在非Web可访问目录
  3. 其他措施

    • 限制上传文件大小
    • 使用病毒扫描
    • 禁用上传文件的执行权限

PHP示例代码

$allowed = ['jpg', 'png', 'gif'];
$ext = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);

if (!in_array($ext, $allowed)) {
    die('不允许的文件类型');
}

if (!getimagesize($_FILES['file']['tmp_name'])) {
    die('文件不是有效的图片');
}

$new_name = md5(uniqid()) . '.' . $ext;
move_uploaded_file($_FILES['file']['tmp_name'], '/safe/directory/' . $new_name);

总结

不安全的文件上传漏洞危害严重,防御需要多层验证:

  1. 前端验证(用户体验,不可靠)
  2. 服务器端扩展名验证
  3. 文件内容验证
  4. 安全的文件存储和处理

通过全面防御措施,可以有效防止恶意文件上传攻击。

不安全的文件上传漏洞教学文档 1. 不安全的文件上传漏洞概述 文件上传功能在Web应用系统中非常常见,例如头像上传、附件上传等。当用户上传文件时,后台通常会对文件进行以下判断: 文件类型 文件后缀名 文件大小 然后按照设计的格式进行重命名并存储在指定目录 漏洞风险 :如果后台对上传文件没有进行足够严格的安全判断,攻击者可能上传恶意文件(如一句话木马),导致服务器被植入Webshell。 安全设计建议 : 验证文件类型、后缀名、大小 验证文件的上传方式 对文件进行复杂重命名 不要暴露文件上传后的路径 2. 客户端检查绕过 (Client Check) 漏洞分析 前端JavaScript代码检查文件扩展名: 绕过方法 禁用JavaScript : 在火狐或Chrome浏览器中禁用JavaScript 上传PHP文件时,前端验证将被绕过 直接构造请求 : 使用Burp Suite等工具直接发送上传请求,绕过前端验证 利用结果 上传成功后访问路径: 3. MIME类型检查绕过 漏洞分析 服务器检查上传文件的MIME类型: 常见图片MIME类型: GIF图形: image/gif JPEG图形: image/jpeg PNG图形: image/png 绕过方法 上传PHP文件时,抓包修改Content-Type为图片类型: 上传步骤: 选择PHP文件上传 拦截请求 修改Content-Type头 放行请求 4. getimagesize检查绕过 漏洞分析 PHP的getimagesize()函数检查文件头是否为有效的图像格式。 绕过方法 方法一:添加图片文件头 在PHP文件开头添加图片标识: 对于GIF: GIF89 对于JPEG: ÿØÿà 对于PNG: ‰PNG 示例: 保存为.jpg扩展名后上传 方法二:图片后附加PHP代码 使用命令行合并图片和PHP代码: /b 表示二进制文件 /a 表示ASCII文件 上传合并后的文件 利用方法 由于服务器将文件识别为图片,需要配合文件包含漏洞执行PHP代码: 5. 防御措施 有效的防御策略 服务器端验证 : 文件扩展名白名单 文件内容验证 MIME类型验证 文件处理 : 重命名上传文件(避免使用用户提供的文件名) 设置适当的文件权限 存储在非Web可访问目录 其他措施 : 限制上传文件大小 使用病毒扫描 禁用上传文件的执行权限 PHP示例代码 总结 不安全的文件上传漏洞危害严重,防御需要多层验证: 前端验证(用户体验,不可靠) 服务器端扩展名验证 文件内容验证 安全的文件存储和处理 通过全面防御措施,可以有效防止恶意文件上传攻击。