schoolcms--upload getshell
字数 1567 2025-08-09 13:33:44
SchoolCMS 文件上传漏洞分析与利用教学文档
1. 漏洞概述
SchoolCMS 是一个已停止维护的建站系统,存在两处文件上传漏洞,可导致攻击者获取服务器权限。这两处漏洞分别位于:
- 主题管理模块的压缩包上传功能
- 站点设置模块的Logo上传功能
2. 环境搭建
2.1 所需环境
- Windows 10
- PHPStudy
- SchoolCMS建站源码
2.2 搭建步骤
- 将源码放置到WWW目录下
- 修改PHP配置文件,去掉
mysqli扩展前的注释符 - 访问站点,出现登录页面即搭建成功
3. 漏洞分析
3.1 主题管理模块文件上传漏洞
漏洞位置
Application/Admin/Controller/ThemeController.class.php#184
漏洞分析
-
上传流程:
- 首先通过
FileUploadError方法进行表单验证 - 检查上传文件类型是否为zip或rar(白名单)
- 对压缩包进行解压缩
- 检查解压后的文件/目录名是否包含
_Html或_Static - 将文件写入到指定目录
- 首先通过
-
关键代码逻辑:
$this->html_path = 'Application' .DS. 'Home' .DS. 'View' .DS; $this->static_path = 'Public' .DS. 'Home' .DS; -
漏洞利用点:
- 虽然限制了上传文件类型为zip/rar,但未对解压后的文件内容进行过滤
- 通过构造特定名称的目录(包含
_Html或_Static)可绕过路径检查
利用方法
- 创建一个包含PHP文件的压缩包
- 将目录名命名为
xx_Html或xx_Static - 上传压缩包
- 访问shell路径:
Application/Home/View/[上传的文件名]
3.2 站点设置模块Logo上传漏洞
漏洞位置
Application/Admin/Controller/SiteController.class.php#72
漏洞分析
-
上传流程:
- 通过
FileUploadError方法进行表单验证 - 使用
explode方法处理Content-Type,以/为分隔符 - 根据
Content-Type的后缀部分重命名文件 - 使用
move_uploaded_file移动文件
- 通过
-
关键代码逻辑:
$typeArr = explode('/', $_FILES['file']['type']); $type = $typeArr[0]; $suffix = $typeArr[1]; $filename = 'home_logo.'.$suffix; -
漏洞利用点:
- 文件名后缀直接从
Content-Type中提取 - 可通过修改
Content-Type为image/php等方式上传PHP文件
- 文件名后缀直接从
利用方法
- 准备一个包含恶意代码的图片文件
- 上传时修改
Content-Type为image/php - 文件将被重命名为
home_logo.php - 访问shell路径:
Public/Home/logo/home_logo.php
4. 漏洞复现
4.1 主题管理模块利用步骤
- 创建包含以下内容的目录结构:
malicious_Html/ ├── shell.php └── normal.jpg - 将目录压缩为zip文件
- 登录后台,进入"网站管理->主题管理"
- 上传zip文件
- 访问shell:
http://target/Application/Home/View/malicious_Html/shell.php
4.2 站点设置模块利用步骤
- 准备一个包含PHP代码的图片文件
- 使用Burp Suite拦截上传请求
- 修改
Content-Type为image/php - 放行请求完成上传
- 访问shell:
http://target/Public/Home/logo/home_logo.php
5. 防御建议
- 对所有上传文件进行严格的内容检查,而不仅是扩展名检查
- 对解压缩操作进行更严格的安全控制
- 不要直接从用户可控的输入(如Content-Type)中获取文件扩展名
- 对上传文件进行随机重命名
- 限制上传文件的执行权限
6. 总结
SchoolCMS由于停止维护,存在两处高危文件上传漏洞。攻击者可通过精心构造的压缩包或修改HTTP请求头的方式上传恶意PHP文件,从而获取服务器控制权限。建议仍在使用该系统的用户立即升级或更换其他CMS系统。