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加密密钥硬编码在代码中

代码审计要点

  1. 检查pom.xml确认Shiro版本
  2. 查看Shiro配置文件确认密钥是否硬编码

漏洞复现

  1. 使用工具:https://github.com/j1anFen/shiro_attack
  2. 步骤:
    • 爆破密钥
    • 识别利用链
    • 执行命令

2. Shiro权限绕过漏洞

漏洞分析

  • CVE-2020-11989:Shiro与Spring路径解析差异导致
  • 影响版本:Shiro <1.5.3

路径解析差异

  1. Shiro处理流程

    • org.apache.shiro.web.filter.mgt.PathMatchingFilterChainResolver#getChain()
    • 通过getPathWithinApplication(request)获取URI
    • decodeAndCleanUriString方法处理:
      • 截取第一个分号之前的部分
      • 示例:/;/cms/admin//
  2. Spring处理流程

    • org.springframework.web.util.UrlPathHelper#getPathWithinServletMapping
    • decodeAndCleanUriString方法处理:
      • 过滤;
      • 过滤重复/
      • 示例:/;/cms/admin//cms/admin/

漏洞复现

  • 正常访问/cms/admin会跳转登录
  • 使用/;/cms/admin绕过认证

3. SSRF结合Fastjson漏洞

漏洞背景

  • 管理员权限配置错误导致"批量推送"功能暴露

SSRF漏洞

  1. 漏洞位置

    • 文章列表→批量推送功能
    • 可修改百度推送地址为任意HTTP URL
  2. 复现步骤

    • 修改网站管理→基础信息中的百度推送地址
    • 使用文章列表的批量推送功能
    • 触发DNS查询验证

Fastjson漏洞

  • 版本:1.2.66
  • 默认autotypesupport为false,需手动开启
  • 修改点:
    1. ArticleController#pushBatch
      ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
      Object baiduPushResVo = JSON.parseObject(PushArticleUtil.postBaidu(url, urls));
      
    2. PushArticleUtil#postBaidu:删除部分写入逻辑避免报错

组合利用

  1. 搭建LDAP服务
  2. 准备恶意JSON payload
  3. 修改推送地址为攻击者控制的URL
  4. 触发反序列化执行命令

4. Thymeleaf模板注入漏洞

漏洞原理

  1. 视图名称用户可控:
    @GetMapping("/path")
    public String path(@RequestParam String lang) {
        return lang; // 用户输入直接作为模板路径
    }
    
  2. 无返回值方法以路由作为视图名称:
    @GetMapping("/doc/{document}")
    public void getDocument(@PathVariable String document) {
        log.info("Retrieving " + document);
    }
    

漏洞复现

  1. 在主题管理→新增主题
  2. 主题名称填入payload:
    __${T(Runtime).getRuntime().exec("calc")}__::.x
    
  3. 启用该主题
  4. 访问首页触发:http://localhost:8080/cms/

代码审计要点

  • 检查bizThemeService.selectCurrent().getName()获取的主题名称是否用户可控

5. 文件上传漏洞(附加)

漏洞详情

  • 未过滤文件后缀
  • 存在目录遍历
  • 但作者对上传文件进行了处理:
    • 以最后一个点分割
    • 中间拼接时间戳
    • 示例:as.exeas_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 严格校验用户输入的模板名称
文件上传 中高危 上传功能 严格过滤文件名,禁用路径遍历

通用防御措施

  1. 依赖管理

    • 定期更新所有第三方依赖
    • 使用漏洞扫描工具检查依赖安全性
  2. 输入验证

    • 对所有用户输入进行严格过滤
    • 使用白名单而非黑名单机制
  3. 安全配置

    • 禁用不必要的功能和协议
    • 最小权限原则配置服务账户
  4. 安全开发

    • 避免硬编码敏感信息
    • 关键操作添加二次验证
    • 实施安全的默认配置
  5. 监控与日志

    • 记录所有敏感操作
    • 设置异常行为告警

0x05 参考资源

  1. Shiro反序列化漏洞分析:https://issues.apache.org/jira/browse/SHIRO-721
  2. Shiro权限绕过CVE:https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-11989
  3. Fastjson安全公告:https://github.com/alibaba/fastjson/wiki/security_update_2020
  4. Thymeleaf模板注入:https://www.acunetix.com/blog/web-security-zone/exploiting-ssti-in-thymeleaf/
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#getPathWithinServletMapping decodeAndCleanUriString 方法处理: 过滤 ; 过滤重复 / 示例: /;/cms/admin/ → /cms/admin/ 漏洞复现 : 正常访问 /cms/admin 会跳转登录 使用 /;/cms/admin 绕过认证 3. SSRF结合Fastjson漏洞 漏洞背景 : 管理员权限配置错误导致"批量推送"功能暴露 SSRF漏洞 : 漏洞位置 : 文章列表→批量推送功能 可修改百度推送地址为任意HTTP URL 复现步骤 : 修改网站管理→基础信息中的百度推送地址 使用文章列表的批量推送功能 触发DNS查询验证 Fastjson漏洞 : 版本:1.2.66 默认 autotypesupport 为false,需手动开启 修改点: ArticleController#pushBatch : PushArticleUtil#postBaidu :删除部分写入逻辑避免报错 组合利用 : 搭建LDAP服务 准备恶意JSON payload 修改推送地址为攻击者控制的URL 触发反序列化执行命令 4. Thymeleaf模板注入漏洞 漏洞原理 : 视图名称用户可控: 无返回值方法以路由作为视图名称: 漏洞复现 : 在主题管理→新增主题 主题名称填入payload: 启用该主题 访问首页触发: 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/