CVE-2022-30887漏洞复现
字数 1144 2025-08-10 19:49:11

CVE-2022-30887漏洞分析与复现教程

漏洞概述

CVE-2022-30887是一个文件上传漏洞,存在于某个PHP应用中。该漏洞允许攻击者通过未经验证的文件上传功能上传恶意文件(如webshell),从而获取服务器控制权限。

漏洞环境

  • 测试环境: 春秋云镜(com)
  • 漏洞类型: 文件上传漏洞
  • 危害等级: 高危

漏洞复现步骤

1. 目标发现与初步探测

  1. 发现目标系统需要登录
  2. 尝试弱口令攻击未果
  3. 通过网页内容分析账号密码格式
  4. 通过信息收集发现已有公开的凭证:
    • 用户名: mayuri.infospace@gmail.com
    • 密码: mayurik

2. 登录系统

使用发现的凭证成功登录系统。

3. 寻找上传点

  1. 在系统中寻找文件上传功能
  2. 服务器查杀较弱,上传的恶意文件几乎不会被拦截

4. 上传Webshell

  1. 使用Burp Suite拦截上传请求
  2. 构造恶意文件上传请求包

5. 获取服务器权限

  1. 使用蚁剑等webshell管理工具连接上传的恶意文件
  2. 在虚拟终端中执行命令

6. 查找flag

在终端中执行以下命令查找flag文件:

find -name 'flag*'  # 查找flag开头的文件
cat [找到的flag文件路径]  # 查看flag内容

代码审计分析

漏洞存在于以下PHP代码中:

<?php 
require_once 'core.php';
$productId = $_GET['id'];

if($_POST) { 
    $image = $_FILES['productImage']['name'];
    $target = "../assets/myimages/".basename($image);
    
    if (move_uploaded_file($_FILES['productImage']['tmp_name'], $target)) {
        unlink("uploadImage/Profile/".$_POST['old_image']); 
        $msg = "Image uploaded successfully"; 
        echo $msg;
    } else { 
        $msg = "Failed to upload image"; 
        echo $msg;
        exit; 
    } 
    
    $sql = "UPDATE product SET product_image = '$image' WHERE product_id = $productId";
    
    if($connect->query($sql) === TRUE) { 
        $valid['success'] = true; 
        $valid['messages'] = "Successfully Updated"; 
        header('location:../product.php'); 
    } else { 
        $valid['success'] = false; 
        $valid['messages'] = "Error while updating product image";
    }
    $connect->close(); 
    echo json_encode($valid);
}
?>

漏洞点分析

  1. 缺乏文件类型验证:

    • 代码直接使用$_FILES['productImage']['name']获取文件名,没有检查文件扩展名
    • 允许上传任意类型文件,包括.php等可执行文件
  2. 缺乏内容检查:

    • 没有对上传文件内容进行安全检查
    • 可以直接上传webshell等恶意文件
  3. 路径处理问题:

    • 使用basename()防止路径遍历,但未限制文件类型
    • 上传的文件会被保存到可访问的目录../assets/myimages/
  4. SQL注入风险:

    • $productId直接从$_GET['id']获取,存在SQL注入风险
    • $image变量直接拼接到SQL语句中

修复建议

  1. 文件类型验证:

    $allowedExtensions = ['jpg', 'jpeg', 'png', 'gif'];
    $fileExtension = strtolower(pathinfo($image, PATHINFO_EXTENSION));
    
    if (!in_array($fileExtension, $allowedExtensions)) {
        die("Invalid file type");
    }
    
  2. 文件内容检查:

    • 使用getimagesize()验证图片文件真实性
    • 检查文件内容是否包含可疑代码
  3. 文件名处理:

    • 生成随机文件名,避免使用用户提供的文件名
    • 确保文件扩展名是允许的类型
  4. SQL注入防护:

    $stmt = $connect->prepare("UPDATE product SET product_image = ? WHERE product_id = ?");
    $stmt->bind_param("si", $image, $productId);
    $stmt->execute();
    
  5. 权限限制:

    • 设置上传目录不可执行
    • 限制上传文件的大小

自动化审计工具验证

使用ChatGPT等AI工具进行代码审计时,可以快速识别出以下问题:

  1. 未经验证的文件上传
  2. 缺乏文件类型检查
  3. 直接使用用户输入构建SQL查询
  4. 不安全的文件移动操作

总结

CVE-2022-30887漏洞利用了一个简单的文件上传功能缺乏足够的安全检查,导致攻击者可以上传任意文件。通过结合弱口令或信息泄露漏洞,攻击者可以完全控制受影响系统。开发人员应始终验证用户上传的文件,并实施多层防御策略来防止此类漏洞。

CVE-2022-30887漏洞分析与复现教程 漏洞概述 CVE-2022-30887是一个文件上传漏洞,存在于某个PHP应用中。该漏洞允许攻击者通过未经验证的文件上传功能上传恶意文件(如webshell),从而获取服务器控制权限。 漏洞环境 测试环境 : 春秋云镜(com) 漏洞类型 : 文件上传漏洞 危害等级 : 高危 漏洞复现步骤 1. 目标发现与初步探测 发现目标系统需要登录 尝试弱口令攻击未果 通过网页内容分析账号密码格式 通过信息收集发现已有公开的凭证: 用户名: mayuri.infospace@gmail.com 密码: mayurik 2. 登录系统 使用发现的凭证成功登录系统。 3. 寻找上传点 在系统中寻找文件上传功能 服务器查杀较弱,上传的恶意文件几乎不会被拦截 4. 上传Webshell 使用Burp Suite拦截上传请求 构造恶意文件上传请求包 5. 获取服务器权限 使用蚁剑等webshell管理工具连接上传的恶意文件 在虚拟终端中执行命令 6. 查找flag 在终端中执行以下命令查找flag文件: 代码审计分析 漏洞存在于以下PHP代码中: 漏洞点分析 缺乏文件类型验证 : 代码直接使用 $_FILES['productImage']['name'] 获取文件名,没有检查文件扩展名 允许上传任意类型文件,包括.php等可执行文件 缺乏内容检查 : 没有对上传文件内容进行安全检查 可以直接上传webshell等恶意文件 路径处理问题 : 使用 basename() 防止路径遍历,但未限制文件类型 上传的文件会被保存到可访问的目录 ../assets/myimages/ SQL注入风险 : $productId 直接从 $_GET['id'] 获取,存在SQL注入风险 $image 变量直接拼接到SQL语句中 修复建议 文件类型验证 : 文件内容检查 : 使用 getimagesize() 验证图片文件真实性 检查文件内容是否包含可疑代码 文件名处理 : 生成随机文件名,避免使用用户提供的文件名 确保文件扩展名是允许的类型 SQL注入防护 : 权限限制 : 设置上传目录不可执行 限制上传文件的大小 自动化审计工具验证 使用ChatGPT等AI工具进行代码审计时,可以快速识别出以下问题: 未经验证的文件上传 缺乏文件类型检查 直接使用用户输入构建SQL查询 不安全的文件移动操作 总结 CVE-2022-30887漏洞利用了一个简单的文件上传功能缺乏足够的安全检查,导致攻击者可以上传任意文件。通过结合弱口令或信息泄露漏洞,攻击者可以完全控制受影响系统。开发人员应始终验证用户上传的文件,并实施多层防御策略来防止此类漏洞。