例如:
{
"name": "ice",
"phone": 123456789,
"address": "ice.home"
}
编码得到:
eyJuYW1lIjoiaWNlIiwicGhvbmUiOjEyMzQ1Njc4OSwiYWRkcmVzcyI6ImljZS5ob21lIn0
该字符串成为了Payload部分
3、签名(Signature):签名用于验证token的真实性和完整性。签名是由头部、载荷以及密钥结合特定的加密算法生成的。
加密算法例如:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
ice
)
本例中,对Header.Payload进行HS256加密(密钥为ice)后,再进行base64url加密,从而得到签名。
GJd4DLWt-IWWhE4ELHUXiLJjJG5C_HcvTY87c2s74Z0
最后将三段字符串通过.拼接起来就生成了JWT的token:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiaWNlIiwicGhvbmUiOjEyMzQ1Njc4OSwiYWRkcmVzcyI6ImljZS5ob21lIn0.GJd4DLWt-IWWhE4ELHUXiLJjJG5C_HcvTY87c2s74Z0
https://jwt.io/
可用于编码、解码和验证JSON Web Tokens(JWT):
JWT攻击方式
1、修改加密算法伪造token
JWT中最常用的两种算法为HMAC和RSA。
HMAC是一种对称加密算法,使用相同的密钥对传输信息进行加解密。
RSA是一种非对称加密算法,使用私钥加密明文,公钥解密密文。
若存在一场景:某应用程序在JWT传输过程中使用RSA算法,同时使用密钥ice对JWT token进行签名,公钥abc对签名进行验证。
{
"alg" : "RS256",
"typ" : "jwt"
}
RSASHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
ice
)
通常情况下密钥ice是无法获取到的,但是公钥abc却可以通过某些途径得到,此时将JWT的加密算法修改为HMAC,同时使用获取到的公钥abc作为算法的密钥,对token进行签名,发送到服务器端:
{
"alg" : "HS256",
"typ" : "jwt"
}
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
abc
)
服务器端会将RSA的公钥(abc)视为当前算法(HMAC)的密钥,而HMAC是对称加密算法,故服务器使用密钥abc对接收到的签名进行验证,从而造成token伪造问题。
2、None算法攻击绕过验证
在Header中指定alg为None,同时不添加signature,服务器在验证JWT时会认为这个JWT是不需要签名的,从而跳过了对签名的验证,直接信任JWT中的信息,实现伪造身份绕过服务器验证。
HEADER:
{
"alg" : "None",
"typ" : "jwt"
}
Payload:
{
"username" : "Admin"
}
生成的完整token为
ew0KCSJhbGciIDogIk5vbmUiLA0KCSJ0eXAiIDogImp3dCINCn0.ew0KCSJ1c2VyIiA6ICJBZG1pbiINCn0
3、KID参数
“kid” 是 JWT 头部中的一个可选参数,全称为 “Key ID”,它用于指定加密算法所使用的密钥。
例如:
{
"alg": "HS256",
"typ": "JWT",
"kid": "signing\_key"
}
或
{
"alg": "HS256",
"typ": "JWT",
"kid": "/home/jwt/.ssh/pem"
}
由于该参数可控,将导致以下漏洞。
3.1任意文件读取
系统并不会验证kid参数路径指向的文件是否是有效的密钥文件。因此,在没有对参数进行过滤或验证的情况下,可造成任意文件读取。
例如:
{
"alg" : "HS256",
"typ" : "jwt",
"kid" : "../../etc/passwd"
}
3.2SQL注入
"kid"参数也可能从数据库中提取数据,故存在SQL注入攻击的风险。
例如:
{
"alg" : "HS256",
"typ" : "jwt",
"kid" : "ice' || union select 'users' -- "
}
3.3命令注入
若服务器后端使用的是Ruby,在读取密钥文件时使用了open函数,通过构造参数可能实现命令注入。
例如:
{
"alg" : "HS256",
"typ" : "jwt",
"kid" : "/path/to/key\_file|whoami"
}
其它语言可进行思路延申。
4、信息泄露
JWT确保的是数据传输过程中的完整性和真实性,而不是机密性。由于payload是使用Base64url编码的,相当于明文传输。因此,如果在payload中携带了敏感信息(例如存放密钥对的文件路径),那么仅对payload部分进行Base64url解码就可以读取其中携带的信息。
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
95yFJz-1715572413078)]
[外链图片转存中…(img-0irc8UMx-1715572413078)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!