今天审计了一个后台客户管理系统。由于这是一个学习性质的项目,因此项目中存在较多安全问题,主要集中在认证与授权部分。
项目没有使用 Shiro 等成熟的安全框架进行统一的认证与授权,而是通过自定义 Cookie 机制实现身份验证。该机制存在身份伪造漏洞;同时,部分路由缺少权限控制,导致未授权用户可以直接访问相关功能。
环境配置:
项目地址:https://github.com/ChangeWeDer/crm,jdk 8
先让 ai 总结一下项目的依赖配置等信息
| 类别 | 组件 | 版本 | 备注 |
|------|------|------|------|
| 框架 | Spring Boot | 2.3.3.RELEASE | |
| 框架 | Spring MVC | (starter-web) | |
| ORM | MyBatis-Plus | 3.0.5 | |
| 模板引擎 | FreeMarker | 2.3.30 | ⚠️ 注意:不是Thymeleaf |
| JSON | fastjson | 1.2.68 | ⚠️ 存在历史反序列化漏洞 |
| 数据库 | MySQL Connector | (Spring Boot管理) | |
| 连接池 | Druid | 1.1.22 | |
| 分页 | PageHelper | 1.2.3 | |
| API文档 | Swagger | 2.9.2 | |
| Java | JDK | 1.8 | |
并没有发现模板注入、fastjson 反序列化等漏洞,下面直接分析本次发现的认证与授权问题。
> 10 GENERATOR
先看一下项目的文件结构,比较典型的 springboot mvc 架构,项目分层也很简单

首先查看 interceptor 模块,分析项目是如何对请求进行拦截和身份校验的。
查看 preHandle 方法后可以发现,认证逻辑非常简单:程序直接从 Cookie 中获取 id,然后查询数据库判断该用户是否存在。如果用户存在,则直接放行请求。典中典,ctf中遇到的第一个越权漏洞就是改 id 进行水平、垂直越权,不过这里并不是将 id 直接明文展示,还是进行了一定的混淆,虽然说没什么用

找到 utils 模块,这个模块用来存放工具类,很可能有关于 cookie 加密的方法,先查看 LoginUserUtil,这个类定义了从 cookie 获取 userid 的方法,可以看到使用了一个 UserIDBase64 类来进行解密

跟进 UserIDBase4 类,从 decoderUserID 方法中可以看到混淆的逻辑,对字符串进行反转,将#替换为=,然后取==之后 6 位的数字为用户 id,操作完全可逆,攻击者可伪造任意用户 id 进行登陆
对应复现操作:https://github.com/ChangeWeDer/crm/issues/2
系统的认证机制被完全绕过,那么授权或许也存在很大的问题,尤其是作者使用自己实现的权限注解,并且有时某个路径记得鉴权但是没有做系统性的鉴权,导致部分路径存在绕过

查看路由模块,这里先看 UserController,可以看到路径都没有权限注解,方法内部也没鉴权,导致所有方法都可以任意调用,这里使用 suer/save 方法可以添加任意用户,可以进行权限提升
复现可看:https://github.com/ChangeWeDer/crm/issues/3
到这结束😁