代码审计-Echo2.3
字数 2355 2025-08-29 22:41:10

Echo2.3 开源社区系统代码审计报告

1. 项目概述

Echo 是一个基于 SpringBoot 的开源社区系统,主要技术栈包括:

  • SpringBoot + MyBatis
  • MySQL + Redis
  • Kafka + Elasticsearch
  • Spring Security

主要功能模块:

  • 帖子、评论、私信
  • 系统通知、点赞、关注
  • 搜索功能
  • 用户设置
  • 数据统计

2. 环境搭建

2.1 基础组件安装

  1. Redis:安装简单,使用默认配置即可
  2. Zookeeper + Kafka
    • Kafka 内置了适配的 Zookeeper,无需单独安装
    • 参考安装教程:Kafka安装指南
  3. Elasticsearch

2.2 项目配置

  1. 修改 src/main/resources/application-develop.properties 文件
  2. 创建数据库并导入提供的 SQL 文件
  3. 启动 SpringBoot 应用

3. 安全审计发现

3.1 SQL 注入防护

审计结论:项目不存在 SQL 注入漏洞

  • 所有 SQL 查询都使用预编译处理
  • 使用 #{} 进行参数绑定

3.2 文件上传漏洞

3.2.1 任意文件上传

位置DiscussPostController.java 中的 uploadMdPic 方法

漏洞详情

  • 未对上传文件的内容和后缀名进行校验
  • 允许上传任意类型文件
  • 理论上需要登录权限,但可配合鉴权绕过实现未授权上传

利用方法

<!-- 示例上传表单 -->
<form action="http://target.com/uploadMdPic" method="post" enctype="multipart/form-data">
    <input type="file" name="file">
    <input type="submit" value="Upload">
</form>

限制

  • 上传后访问返回 404 错误
  • 文件实际已存储到配置的目录中(通过 application-develop.properties 配置)

3.2.2 图片加载 XSS 尝试

位置UserController.java 中的头像加载功能

尝试结果

  • 虽然可以上传 HTML 文件
  • 但通过 `` 标签加载时,浏览器会将 HTML 当作破损图片处理
  • 无法成功触发 XSS

3.3 鉴权绕过漏洞

位置LoginTicketInterceptor.java 中的 preHandle 方法

漏洞详情

  • 实现了 HandlerInterceptor 接口
  • preHandle 方法在每次请求时执行
  • 仅对 ticket 有值时进行鉴权
  • ticket 为 null 时直接返回 true,导致鉴权绕过

拦截范围

  • WebMvcConfig.java 中配置
  • 拦截除静态资源外的所有路径

3.4 未授权信息泄露

3.4.1 用户资料遍历

位置UserController.java 中的 getProfilePage 方法

漏洞详情

  • 路由:@GetMapping("/profile/{userId}")
  • 通过 userId 参数获取用户资料
  • 配合鉴权绕过可遍历用户信息

利用示例

GET /profile/1
GET /profile/2
...

3.4.2 用户帖子遍历

位置UserController.java 中的 getMyDiscussPosts 方法

漏洞详情

  • 通过 userId 获取用户发布的帖子
  • 可遍历所有用户帖子

3.4.3 用户评论遍历

位置UserController.java 中的 getMyComments 方法

漏洞详情

  • 通过 userId 获取用户评论/回复
  • 可遍历所有用户评论

3.5 权限控制问题

位置DiscussPostController.java 中的 setDelete 方法

问题详情

  • 删除帖子功能要求 admin 权限
  • 权限定义在 SecurityConfig.javaconfigure 方法中
  • 普通用户无权限访问

权限确定方式

  • UserService.javagetAuthorities 方法中定义
  • 由于鉴权绕过,攻击者连普通用户权限都没有

4. 审计方法论

4.1 审计重点

  1. Controller 目录

    • 包含所有业务逻辑入口
    • 重点关注用户输入处理和权限检查
  2. Interceptor 目录

    • 处理请求拦截和鉴权
    • 常见鉴权绕过漏洞位置
  3. Security 配置

    • 检查 SecurityConfig.java
    • 验证权限分配是否合理

4.2 审计技巧

  1. 全局搜索关键词:

    • adminrolepermission 等权限相关词
    • uploadfile 等文件操作相关词
    • sqlquery 等数据库操作相关词
  2. 关注注解:

    • @GetMapping@PostMapping 等路由定义
    • @PreAuthorize 等权限注解
  3. 检查输入处理:

    • 参数是否经过校验
    • 是否使用预编译 SQL

5. 修复建议

  1. 文件上传漏洞

    • 添加文件类型白名单校验
    • 检查文件内容有效性
    • 设置文件存储隔离
  2. 鉴权绕过

    • 修改 preHandle 方法,对无 ticket 请求进行拒绝
    • 添加默认权限检查
  3. 信息泄露

    • 添加权限检查,确保用户只能访问自己的数据
    • 对敏感信息进行脱敏处理
  4. 权限控制

    • 完善权限体系
    • 确保前端与后端权限检查一致

6. 总结

本次审计发现了 Echo2.3 系统中的多个安全问题,主要包括:

  1. 未授权文件上传
  2. 鉴权绕过漏洞
  3. 信息泄露漏洞
  4. 权限控制不严

建议开发团队按照修复建议进行改进,特别是在文件上传和权限控制方面需要重点加强。对于 Java 项目审计,重点关注 Controller 和 Interceptor 是关键切入点。

Echo2.3 开源社区系统代码审计报告 1. 项目概述 Echo 是一个基于 SpringBoot 的开源社区系统,主要技术栈包括: SpringBoot + MyBatis MySQL + Redis Kafka + Elasticsearch Spring Security 主要功能模块: 帖子、评论、私信 系统通知、点赞、关注 搜索功能 用户设置 数据统计 2. 环境搭建 2.1 基础组件安装 Redis :安装简单,使用默认配置即可 Zookeeper + Kafka : Kafka 内置了适配的 Zookeeper,无需单独安装 参考安装教程: Kafka安装指南 Elasticsearch : 参考安装教程: Elasticsearch安装指南 额外配置:在 elasticsearch.yml 中关闭机器学习功能 2.2 项目配置 修改 src/main/resources/application-develop.properties 文件 创建数据库并导入提供的 SQL 文件 启动 SpringBoot 应用 3. 安全审计发现 3.1 SQL 注入防护 审计结论:项目不存在 SQL 注入漏洞 所有 SQL 查询都使用预编译处理 使用 #{} 进行参数绑定 3.2 文件上传漏洞 3.2.1 任意文件上传 位置 : DiscussPostController.java 中的 uploadMdPic 方法 漏洞详情 : 未对上传文件的内容和后缀名进行校验 允许上传任意类型文件 理论上需要登录权限,但可配合鉴权绕过实现未授权上传 利用方法 : 限制 : 上传后访问返回 404 错误 文件实际已存储到配置的目录中(通过 application-develop.properties 配置) 3.2.2 图片加载 XSS 尝试 位置 : UserController.java 中的头像加载功能 尝试结果 : 虽然可以上传 HTML 文件 但通过 `` 标签加载时,浏览器会将 HTML 当作破损图片处理 无法成功触发 XSS 3.3 鉴权绕过漏洞 位置 : LoginTicketInterceptor.java 中的 preHandle 方法 漏洞详情 : 实现了 HandlerInterceptor 接口 preHandle 方法在每次请求时执行 仅对 ticket 有值时进行鉴权 当 ticket 为 null 时直接返回 true,导致鉴权绕过 拦截范围 : 在 WebMvcConfig.java 中配置 拦截除静态资源外的所有路径 3.4 未授权信息泄露 3.4.1 用户资料遍历 位置 : UserController.java 中的 getProfilePage 方法 漏洞详情 : 路由: @GetMapping("/profile/{userId}") 通过 userId 参数获取用户资料 配合鉴权绕过可遍历用户信息 利用示例 : 3.4.2 用户帖子遍历 位置 : UserController.java 中的 getMyDiscussPosts 方法 漏洞详情 : 通过 userId 获取用户发布的帖子 可遍历所有用户帖子 3.4.3 用户评论遍历 位置 : UserController.java 中的 getMyComments 方法 漏洞详情 : 通过 userId 获取用户评论/回复 可遍历所有用户评论 3.5 权限控制问题 位置 : DiscussPostController.java 中的 setDelete 方法 问题详情 : 删除帖子功能要求 admin 权限 权限定义在 SecurityConfig.java 的 configure 方法中 普通用户无权限访问 权限确定方式 : 在 UserService.java 的 getAuthorities 方法中定义 由于鉴权绕过,攻击者连普通用户权限都没有 4. 审计方法论 4.1 审计重点 Controller 目录 : 包含所有业务逻辑入口 重点关注用户输入处理和权限检查 Interceptor 目录 : 处理请求拦截和鉴权 常见鉴权绕过漏洞位置 Security 配置 : 检查 SecurityConfig.java 验证权限分配是否合理 4.2 审计技巧 全局搜索关键词: admin 、 role 、 permission 等权限相关词 upload 、 file 等文件操作相关词 sql 、 query 等数据库操作相关词 关注注解: @GetMapping 、 @PostMapping 等路由定义 @PreAuthorize 等权限注解 检查输入处理: 参数是否经过校验 是否使用预编译 SQL 5. 修复建议 文件上传漏洞 : 添加文件类型白名单校验 检查文件内容有效性 设置文件存储隔离 鉴权绕过 : 修改 preHandle 方法,对无 ticket 请求进行拒绝 添加默认权限检查 信息泄露 : 添加权限检查,确保用户只能访问自己的数据 对敏感信息进行脱敏处理 权限控制 : 完善权限体系 确保前端与后端权限检查一致 6. 总结 本次审计发现了 Echo2.3 系统中的多个安全问题,主要包括: 未授权文件上传 鉴权绕过漏洞 信息泄露漏洞 权限控制不严 建议开发团队按照修复建议进行改进,特别是在文件上传和权限控制方面需要重点加强。对于 Java 项目审计,重点关注 Controller 和 Interceptor 是关键切入点。