CVE-2022-30887漏洞复现
字数 1144 2025-08-10 19:49:11
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文件:
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);
}
?>
漏洞点分析
-
缺乏文件类型验证:
- 代码直接使用
$_FILES['productImage']['name']获取文件名,没有检查文件扩展名 - 允许上传任意类型文件,包括.php等可执行文件
- 代码直接使用
-
缺乏内容检查:
- 没有对上传文件内容进行安全检查
- 可以直接上传webshell等恶意文件
-
路径处理问题:
- 使用
basename()防止路径遍历,但未限制文件类型 - 上传的文件会被保存到可访问的目录
../assets/myimages/
- 使用
-
SQL注入风险:
$productId直接从$_GET['id']获取,存在SQL注入风险$image变量直接拼接到SQL语句中
修复建议
-
文件类型验证:
$allowedExtensions = ['jpg', 'jpeg', 'png', 'gif']; $fileExtension = strtolower(pathinfo($image, PATHINFO_EXTENSION)); if (!in_array($fileExtension, $allowedExtensions)) { die("Invalid file type"); } -
文件内容检查:
- 使用
getimagesize()验证图片文件真实性 - 检查文件内容是否包含可疑代码
- 使用
-
文件名处理:
- 生成随机文件名,避免使用用户提供的文件名
- 确保文件扩展名是允许的类型
-
SQL注入防护:
$stmt = $connect->prepare("UPDATE product SET product_image = ? WHERE product_id = ?"); $stmt->bind_param("si", $image, $productId); $stmt->execute(); -
权限限制:
- 设置上传目录不可执行
- 限制上传文件的大小
自动化审计工具验证
使用ChatGPT等AI工具进行代码审计时,可以快速识别出以下问题:
- 未经验证的文件上传
- 缺乏文件类型检查
- 直接使用用户输入构建SQL查询
- 不安全的文件移动操作
总结
CVE-2022-30887漏洞利用了一个简单的文件上传功能缺乏足够的安全检查,导致攻击者可以上传任意文件。通过结合弱口令或信息泄露漏洞,攻击者可以完全控制受影响系统。开发人员应始终验证用户上传的文件,并实施多层防御策略来防止此类漏洞。