PB-CMS v1.0.0 代码审计
字数 2593 2025-08-23 18:31:18
PB-CMS v1.0.0 代码审计教学文档
0x01 系统概述
PB-CMS(瀑布内容管理系统)v1.0.0版本是一个基于以下技术栈构建的内容管理系统:
- SpringBoot
- Apache Shiro 1.4.1(安全框架)
- Mybatis Plus(ORM框架)
- Thymeleaf(模板引擎)
0x02 环境搭建
项目地址:https://gitee.com/LinZhaoguan/pb-cms/tree/v1.0.0/
0x03 漏洞分析
1. Shiro反序列化漏洞
漏洞分析:
- Shiro版本为1.4.1,存在反序列化漏洞
- 虽然Shiro550利用版本要求<1.2.4,但Shiro720仍可利用
- 关键问题:默认AES加密密钥硬编码在代码中
代码审计要点:
- 检查
pom.xml确认Shiro版本 - 查看Shiro配置文件确认密钥是否硬编码
漏洞复现:
- 使用工具:https://github.com/j1anFen/shiro_attack
- 步骤:
- 爆破密钥
- 识别利用链
- 执行命令
2. Shiro权限绕过漏洞
漏洞分析:
- CVE-2020-11989:Shiro与Spring路径解析差异导致
- 影响版本:Shiro <1.5.3
路径解析差异:
-
Shiro处理流程:
org.apache.shiro.web.filter.mgt.PathMatchingFilterChainResolver#getChain()- 通过
getPathWithinApplication(request)获取URI decodeAndCleanUriString方法处理:- 截取第一个分号之前的部分
- 示例:
/;/cms/admin/→/
-
Spring处理流程:
org.springframework.web.util.UrlPathHelper#getPathWithinServletMappingdecodeAndCleanUriString方法处理:- 过滤
; - 过滤重复
/ - 示例:
/;/cms/admin/→/cms/admin/
- 过滤
漏洞复现:
- 正常访问
/cms/admin会跳转登录 - 使用
/;/cms/admin绕过认证
3. SSRF结合Fastjson漏洞
漏洞背景:
- 管理员权限配置错误导致"批量推送"功能暴露
SSRF漏洞:
-
漏洞位置:
- 文章列表→批量推送功能
- 可修改百度推送地址为任意HTTP URL
-
复现步骤:
- 修改网站管理→基础信息中的百度推送地址
- 使用文章列表的批量推送功能
- 触发DNS查询验证
Fastjson漏洞:
- 版本:1.2.66
- 默认
autotypesupport为false,需手动开启 - 修改点:
ArticleController#pushBatch:ParserConfig.getGlobalInstance().setAutoTypeSupport(true); Object baiduPushResVo = JSON.parseObject(PushArticleUtil.postBaidu(url, urls));PushArticleUtil#postBaidu:删除部分写入逻辑避免报错
组合利用:
- 搭建LDAP服务
- 准备恶意JSON payload
- 修改推送地址为攻击者控制的URL
- 触发反序列化执行命令
4. Thymeleaf模板注入漏洞
漏洞原理:
- 视图名称用户可控:
@GetMapping("/path") public String path(@RequestParam String lang) { return lang; // 用户输入直接作为模板路径 } - 无返回值方法以路由作为视图名称:
@GetMapping("/doc/{document}") public void getDocument(@PathVariable String document) { log.info("Retrieving " + document); }
漏洞复现:
- 在主题管理→新增主题
- 主题名称填入payload:
__${T(Runtime).getRuntime().exec("calc")}__::.x - 启用该主题
- 访问首页触发:
http://localhost:8080/cms/
代码审计要点:
- 检查
bizThemeService.selectCurrent().getName()获取的主题名称是否用户可控
5. 文件上传漏洞(附加)
漏洞详情:
- 未过滤文件后缀
- 存在目录遍历
- 但作者对上传文件进行了处理:
- 以最后一个点分割
- 中间拼接时间戳
- 示例:
as.exe→as_1708639915916.exe
绕过尝试:
- 尝试覆盖计划任务(
/var/spool/cron/root) - 最终路径变为:
\上传路径\20240223\../._1708639915916../../var/spool/cron/root - 导致无法成功覆盖
0x04 总结与防御建议
漏洞总结表
| 漏洞类型 | 风险等级 | 影响组件 | 修复建议 |
|---|---|---|---|
| Shiro反序列化 | 高危 | Shiro 1.4.1 | 升级Shiro版本,更换加密密钥 |
| Shiro权限绕过 | 高危 | Shiro+Spring | 升级Shiro版本,统一路径解析逻辑 |
| SSRF | 中危 | 推送功能 | 限制URL协议和域名,添加白名单 |
| Fastjson反序列化 | 高危 | Fastjson 1.2.66 | 升级Fastjson,保持autotypesupport为false |
| Thymeleaf注入 | 高危 | Thymeleaf | 严格校验用户输入的模板名称 |
| 文件上传 | 中高危 | 上传功能 | 严格过滤文件名,禁用路径遍历 |
通用防御措施
-
依赖管理:
- 定期更新所有第三方依赖
- 使用漏洞扫描工具检查依赖安全性
-
输入验证:
- 对所有用户输入进行严格过滤
- 使用白名单而非黑名单机制
-
安全配置:
- 禁用不必要的功能和协议
- 最小权限原则配置服务账户
-
安全开发:
- 避免硬编码敏感信息
- 关键操作添加二次验证
- 实施安全的默认配置
-
监控与日志:
- 记录所有敏感操作
- 设置异常行为告警
0x05 参考资源
- Shiro反序列化漏洞分析:https://issues.apache.org/jira/browse/SHIRO-721
- Shiro权限绕过CVE:https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-11989
- Fastjson安全公告:https://github.com/alibaba/fastjson/wiki/security_update_2020
- Thymeleaf模板注入:https://www.acunetix.com/blog/web-security-zone/exploiting-ssti-in-thymeleaf/