01 JWT简介
JWT全称为JSON Web Token,将json工具作为载体来传输信息,,,,,,一样平常被用在身份提供者和服务提供者间转达被认证的用户身份信息,,,,,,以便于从资源服务器获取资源,,,,,,也可以增添一些特另外营业逻辑所必需声明信息,,,,,,该token可被直接用于认证,,,,,,也可用作加密。。。。。。。。

JSON Web令牌(JWT)是一种标准化的名堂,,,,,,用于在系统之间发送经由加密署名的JSON数据。。。。。。。。理论上JWT可以包括任何类型的数据,,,,,,但最常用于举行身份认证、会话处置惩罚和会见控制。。。。。。。。与古板的会话令牌差别,,,,,,服务器需要的所有数据都存储在JWT自己的客户端。。。。。。。。这使得JWT成为高度漫衍式网站的热门选择,,,,,,在这些网站中,,,,,,用户需要与多个后端服务器举行无缝交互。。。。。。。。
1.1 JWT名堂
JWT由3部分组成:头部、载荷和署名。。。。。。。。这些部分之间用点号离隔,,,,,,如下所示:
eyJraWQiOiI5MTM2ZGRiMy1jYjBhLTRhMTktYTA3ZS1lYWRmNWE0NGM4YjUiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJwb3J0c3dpZ2dlciIsImV4cCI6MTY0ODAzNzE2NCwibmFtZSI6IkNhcmxvcyBNb250b3lhIiwic3ViIjoiY2FybG9zIiwicm9sZSI6ImJsb2dfYXV0aG9yIiwiZW1haWwiOiJjYXJsb3NAY2FybG9zLW1vbnRveWEubmV0IiwiaWF0IjoxNTE2MjM5MDIyfQ.SYZBPIBg2CRjXAJ8vCER0LA_ENjII1JakvNQoP-Hw6GG1zfl4JyngsZReIfqRvIAEi5L4HV0q7_9qGhQZvy9ZdxEJbwTxRs_6Lb-fZTDpW6lKYNdMyjw45_alSCZ1fypsMWz_2mTpQzil0lOtps5Ei_z7mM7M8gCwe_AGpI53JxduQOaB5HkT5gVrv9cKu9CsW5MS6ZbqYXpGyOG5ehoxqm8DL5tFYaW3lB50ELxi0KsuTKEbD0t5BCl0aCR2MBJWAbN-xeLwEenaqBiwPVvKixYleeDQiBEIylFdNNIMviKRgXiYuAvMziVPbwSgkZVHeEdF5MQP1Oe2Spac-6IfA
JWT的头部和载荷部分着实就是用base64url编码的JSON工具。。。。。。。。其中头部包括关于令牌自己的元数据,,,,,,而载荷包括关于用户的现实“声明”。。。。。。。???????梢远陨鲜隽钆频脑睾删傩薪饴耄,,,,效果如下:
{
"iss": "portswigger",
"exp": 1648037164,
"name": "Carlos Montoya",
"sub": "carlos",
"role": "blog_author",
"email": "carlos@carlos-montoya.net",
"iat": 1516239022
}
大大都情形下,,,,,,任何有权会见令牌的人都可以轻松地读取或修改这些数据。。。。。。。。因此任何基于JWT机制的清静性都严重依赖于密码署名。。。。。。。。
1.2 JWT署名
揭晓令牌的服务器通常通过对头部和载荷盘算哈希值来天生署名。。。。。。。。有时会对爆发的哈希值举行加密处置惩罚。。。。。。。。可是无论哪种方法,,,,,,这个历程都涉及一个神隐秘钥。。。。。。。。若是密钥未知,,,,,,就无法为给定的头部和载荷天生有用的署名。。。。。。。。这现实上就为服务器提供了一种验证令牌揭晓以来数据是否被改动的机制,,,,,,由于任何对头部或载荷部分的修改都会使署名不再匹配。。。。。。。。
02 JWT、JWS与JWE
JWT规范的约束现实上是很是有限的。。。。。。。。由于它只界说了将信息(“声明”)体现为可以在双方之间传输的JSON工具的名堂。。。。。。。。在现实使用中,,,,,,JWT并没有真正作为一个自力的实体使用。。。。。。。。JWT规范由JSON Web署名(JWS)和JSON Web加密(JWE)规范组成,,,,,,配合界说了现实实现JWT的详细要领。。。。。。。。

也就是说,,,,,,JWT通常是指JWS或JWE令牌,,,,,,JWE同理,,,,,,只是令牌的现实内容是经由加密的。。。。。。。。
2.1 JWT攻击
JWT攻击是指用户向服务器发送修悔改的JWT,,,,,,执行恶意操作。。。。。。。。通常情形下,,,,,,较量常见的是冒充已经通过身份认证的用户,,,,,,绕过认证和会见控制。。。。。。。。若是攻击者能够用恣意值建设自己的有用令牌,,,,,,他们就能够提升自己的权限或冒充其他用户,,,,,,从而完全接受这些用户的账户。。。。。。。。
2.2 攻击原理
JWT误差通常是由于应用程序自己对JWT的处置惩罚有缺陷而爆发的。。。。。。。。与JWT有关的种种规范在设计上相对无邪,,,,,,例如允许网站开发职员自行决议许多实现细节。。。。。。。。但这也可能会引发一些清静问题。。。。。。。。这些实现缺陷通常意味着JWT的署名没有被准确验证。。。。。。。。纵然严酷检查署名,,,,,,攻击者也可以通过令牌的载荷改动转达给应用程序的值。。。。。。。。署名是否可以信任在很洪流平上也取决于服务器的秘钥是否仍然是清静的。。。。。。。。若是这个密钥被泄露或者破解,,,,,,那么攻击者就可以为恣意令牌天生有用的署名,,,,,,从而攻陷整个机制。。。。。。。。
2.3 JWT署名验证
凭证设计,,,,,,一样平常情形下服务器不存储任何关于揭晓的JWT的信息。。。。。。。。因此每个令牌都是一个完全自力的实体。。。。。。。。虽然这样做有许多优点,,,,,,但也导致了一个隐患,,,,,,即服务器现实上不知道关于令牌的原始内容,,,,,,甚至不知道原始署名是什么。。。。。。。。正因云云,,,,,,若是服务器没有准确效验署名,,,,,,也就无法阻止攻击者对令牌的其他部分恣意改动。。。。。。。。
例如,,,,,,一个包括以下声明的JWT如下:
{
"username": "carlos",
"isAdmin": false
}
若是服务器是凭证username来识别会话,,,,,,那么攻击者就能够通过修改用户名来冒充其他已登录的用户。。。。。。。。同样,,,,,,若是isAdmin值被用于会见控制,,,,,,攻击者也可以提通过改动这个值来实现提权。。。。。。。。
03 JWT相关误差类型
3.1 接受恣意署名
JWT库通;;;;;崽峁┮桓鲅橹ち钆频囊欤,,,,同时提供对其解码的要领。。。。。。。。例如,,,,,,关于Node.js库jsonwebtoken来说,,,,,,这两个要领划分是verify()和decode()。。。。。。。。
但有时开发职员会混淆这两个要领,,,,,,只把传入的令牌传给decode()要领。。。。。。。。这现实上意味着应用程序基础就没有对署名举行验证。。。。。。。。
3.2 接受未署名的令牌
JWT头部还包括一个alg参数。。。。。。。。该参数的作用就是告诉服务器对令牌举行署名时使用的是哪种算法,,,,,,换句话说就是在验证署名时需要使用哪种算法。。。。。。。。
{
"alg": "HS256",
"typ": "JWT"
}
但实质上这种要领保存清静隐患,,,,,,由于服务器只能隐式地信任提供令牌的用户的输入(注重,,,,,,这些输入受控于该用户),,,,,,而该令牌基础没有被验证过。。。。。。。;;;;;痪浠八倒セ髡呖梢灾苯佑跋旆务器检查令牌是否值得信任的方法。。。。。。。。
JWT既可以使用一系列差别的算法举行署名,,,,,,也可以不署名。。。。。。。。在这种情形下,,,,,,alg参数被设置为None,,,,,,体现所谓的 "不清静的JWT"。。。。。。。。由于这种情形显着保存清静问题,,,,,,因此服务器通;;;;;峋芫挥惺鹈牧钆啤。。。。。。。但由于这种过滤依赖于字符串剖析,,,,,,以是攻击者可以使用混淆手艺绕过这些过滤器,,,,,,如混淆大写和非预期的编码等。。。。。。。。(需要注重的是,,,,,,纵然令牌是未署名的,,,,,,载荷部分也必需以点号最后。。。。。。。。)
3.3 暴力破解密钥
某些署名算法,,,,,,例如HS256(HMAC + SHA-256),,,,,,会像密码一样使用一个恣意的、自力的字符串作为神隐秘钥。。。。。。。。需要包管这个秘钥不被容易猜到或暴力破解,,,,,,不然攻击者能以恣意的头部和载荷值来建设JWT,,,,,,然后用密钥重新给令牌署名。。。。。。。。
在实现JWT应用时,,,,,,开发职员有时会遗忘改变默认或占位的密码,,,,,,甚至可能复制和粘贴在网上找到的代码片断,,,,,,然后遗忘改变作为示例提供的硬编码的密码。。。。。。。。在这种情形下,,,,,,攻击者使用盛行的密码本,,,,,,可以轻松对服务器的上岸凭证举行暴力破解。。。。。。。。
3.4 JWT头部参数注入
凭证JWS规范,,,,,,只有头部参数alg是必需的。。。。。。。。然而现实中JWT头部(也称为JOSE头部)通常包括其他几个参数。。。。。。。。以下是攻击者特殊感兴趣的参数:
jwk(JSON Web Key):提供一个体现密钥的嵌入式JSON工具。。。。。。。。
jku(JSON Web Key Set URL):提供一个URL,,,,,,服务器可以从中获取一组包括准确密钥的密钥。。。。。。。。
kid(Key ID):提供一个ID,,,,,,在有多个密钥可供选择的情形下,,,,,,服务器可以使用该ID来识别准确的密钥。。。。。。。。凭证密钥的名堂可能尚有一个匹配的kid参数。。。。。。。。
如上,,,,,,这些用户可控制的参数用于告诉吸收方服务器在验证署名时使用哪些密钥。。。。。。。。
3.5 jwk参数注入
JSON Web署名(JWS)规范形貌了一个可选的jwk头部参数,,,,,,服务器可以用它将其公钥直接嵌入JWK名堂的令牌自己。。。。。。。。JWK(JSON Web密钥)是一种标准化的名堂,,,,,,用于将密钥体现为JSON工具。。。。。。。。
JWT头部示例如下:
{
"kid": "ed2Nf8sb-sD6ng0-scs5390g-fFD8sfxG",
"typ": "JWT",
"alg": "RS256",
"jwk": {
"kty": "RSA",
"e": "AQAB",
"kid": "ed2Nf8sb-sD6ng0-scs5390g-fFD8sfxG",
"n": "yy1wpYmffgXBxhAUJzHHocCuJolwDqql75ZWuCQ_cb33K2vh9m"
}
}
理想情形下,,,,,,服务器应该只使用有限的公钥白名单来验证JWT署名。。。。。。。。然而设置过失的服务器有时会使用jwk参数中嵌入的任何密钥来验证署名。。。。。。。。
因此攻击者可以使用这种行为,,,,,,用自己的RSA私钥对修悔改的JWT举行署名,,,,,,然后在jwk头部中嵌入对应的公钥。。。。。。。。
虽然也可以在Burp中手动添加或修改jwk参数,,,,,,但JWT编辑器扩展提供了一个很是利便的功效,,,,,,用于资助研究职员测试这个误差:
在加载该扩展后,,,,,,在Burp的主选项卡栏中,,,,,,转到JWT Editor Keys选项卡。。。。。。。。
建设一个新的RSA密钥。。。。。。。。
向Burp Repeater发送一个包括JWT的请求。。。。。。。。
在新闻编辑器中,,,,,,切换到扩展天生的JSON Web Token选项卡,,,,,,并以你喜欢的方法修改令牌的载荷。。。。。。。。
点击Attack按钮,,,,,,然后选择Embedded JWK。。。。。。。。当收到提醒时,,,,,,选择新天生的RSA密钥。。。。。。。。
发送请求,,,,,,测试服务器的响应情形。。。。。。。。
有些服务器并不会直接使用jwk头部参数来嵌入公钥,,,,,,而是使用jku(JWK Set URL)头部参数来引用一个包括密钥的JWK Set。。。。。。。。当验证署名时,,,,,,服务器会从这个URL中获取相关的密钥。。。。。。。。
现实上所谓JWK Set就是一个JSON工具,,,,,,其中包括一组体现密钥的JWK,,,,,,例如:
{
"keys": [
{
"kty": "RSA",
"e": "AQAB",
"kid": "75d0ef47-af89-47a9-9061-7c02a610d5ab",
"n": "o-yy1wpYmffgXBxhAUJzHHocCuJolwDqql75ZWuCQ_cb33K2vh9mk6GPM9gNN4Y_qTVX67WhsN3JvaFYw-fhvsWQ"
},
{
"kty": "RSA",
"e": "AQAB",
"kid": "d8fDFo-fS9-faS14a9-ASf99sa-7c1Ad5abA",
"n": "fc3f-yy1wpYmffgXBxhAUJzHql79gNNQ_cb33HocCuJolwDqmk6GPM4Y_qTVX67WhsN3JvaFYw-dfg6DH-asAScw"
}
]
}
像这样的JWK集有时会通过一个标准的端点对外果真,,,,,,如/.known/jwks.json,,,,,,攻击者有时可以使用URL剖析的差别来绕过这种过滤机制。。。。。。。。
3.7 kid参数注入
服务器可能会使用多个加密密钥来为差别类型的数据举行署名。。。。。。。。出于这个缘故原由,,,,,,JWT的头部可能包括一个kid(密钥ID)参数,,,,,,用来资助服务器识别在验证署名时要使用的密钥。。。。。。。。
验证密钥通常被存储为JWK Set。。。。。。。。在这种情形下,,,,,,服务器可以直接寻找与令牌具有相同kid参数的JWK。。。。。。。。然而JWS规范并没有为这个ID界说详细的结构,,,,,,它只是开发职员恣意选择的一个字符串。。。。。。。。例如可以使用kid参数来指向数据库中的一个特定条目,,,,,,甚至文件名称。。。。。。。。
若是该参数受到目录遍历的影响,,,,,,攻击者就有可能迫使服务器使用其文件系统中的恣意文件作为验证密钥。。。。。。。。
{
"kid": "../../path/to/file",
"typ": "JWT",
"alg": "HS256",
"k": "asGsADas3421-dfh9DGN-AFDFDbasfd8-anfjkvc"
}
若是服务器也支持使用对称算法为JWT署名,,,,,,攻击者可以将kid参数指向一个可展望的静态文件,,,,,,然后用一个与该文件内容相匹配的神秘来给JWT署名,,,,,,简朴的要领之一是使用/dev/null。。。。。。。。该文件是一个空文件,,,,,,读取时将返回null,,,,,,可以用一个Base64编码的null字节来给令牌署名将获得一个有用的署名。。。。。。。。
若是服务器将其验证密钥存储在数据库中,,,,,,kid头部参数也是一个潜在的SQL注入攻击的载体。。。。。。。。
3.8其他JWT头部参数
cty(内容类型):用来声明JWT载荷中内容的媒体类型。。。。。。。。通常情形下会省略该参数,,,,,,但底层剖析库可能照旧支持它。。。。。。。。若是攻击者已经找到了绕过署名验证的要领,,,,,,可能会实验注入cty参数,,,,,,将内容类型改为text/xml或application/x-java-serialized-object,,,,,,这有可能为XXE和反序列化攻击提供新的向量。。。。。。。。
x5c(X.509证书链):用于转达用于对JWT举行数字署名的X.509公钥证书或证书链。。。。。。。。这个头部参数可用于注入自签证书,,,,,,类似于上面讨论的jwk头部注入攻击。。。。。。。。由于X.509名堂及其扩展的重大性,,,,,,剖析这些证书也很可能会引入误差。。。。。。。。
3.9 JWT算法混淆
纵然服务器使用了攻击者无法破解的强密码,,,,,,对方仍然可以使用开发职员没有预推测的算法署名令牌来伪造有用的JWT,,,,,,这就是所谓的算法混淆攻击。。。。。。。。
04 防御JWT攻击
使用最新的库来处置惩罚JWT,,,,,,并确???????⒅霸倍韵喙厍寰参侍庾愎幌嗍丁。。。。。。。现代代码库的使用降低了在代码实现中引入清静误差的可能性,,,,,,但由于相关规范固有的无邪性,,,,,,也并非万无一失。。。。。。。。
确保对收到的任何JWT举行严酷的署名验证,,,,,,并思量边沿情形,,,,,,如使用非预期的算法署名的JWT。。。。。。。。
为jku头部提供允许主机白名单,,,,,,并严酷执行。。。。。。。。
确保不会受到kid头部参数路径穿越或SQL注入的影响。。。。。。。。
05 参考链接
https://portswigger.net/web-security/jwt
https://blog.csdn.net/cdyunaq/article/details/122561096
- 要害词标签:
- 检测与防护能力 JWT攻击类型

京公网安备 11010802026257号