JSON Web 令牌漏洞和利用

渗透技巧 1年前 (2023) admin
508 0 0

什么是JWT ?

  • JSON Web Token (JWT) 是一种紧凑的 URL 安全方式,用于表示要在两方之间传输的声明。JWT 中的声明被编码为 JSON 对象,用作 JSON Web 签名 (JWS) 结构的有效负载或用作 JSON Web 加密 (JWE) 结构的明文,从而使声明能够进行数字签名或完整性保护使用消息验证码 (MAC) 和/或加密。

  • JSON Web 令牌 (JWT) 是一种标准化格式,用于在系统之间发送加密签名的 JSON 数据。它们理论上可以包含任何类型的数据,但最常用于发送有关用户的信息(“声明”),作为身份验证、会话处理和访问控制机制的一部分。

JSON Web 令牌漏洞和利用

JSON Web 令牌漏洞和利用

JWT格式 

3个部分 : HEADER, PAYLAOD 和 SIGNATURE由点 ( . )分隔
  1. eyJraWQiOiI5MTM2ZGRiMy1jYjBhLTRhMTktYTA3ZS1lYWRmNWE0NGM4YjUiLCJhbGciOiJSUzI1NiJ9. HEADER

  2. eyJpc3MiOiJwb3J0c3dpZ2dlciIsImV4cCI6MTY0ODAzNzE2NCwibmFtZSI6IkNhcmxvcyBNb250b3lhIiwic3ViIjoiY2FybG9zIiwicm9sZSI6ImJsb2dfYXV0aG9yIiwiZW1haWwiOiJjYXJsb3NAY2FybG9zLW1vbnRveWEubmV0IiwiaWF0IjoxNTE2MjM5MDIyfQ. PAYLOAD

  3. SYZBPIBg2CRjXAJ8vCER0LA_ENjII1JakvNQoP-Hw6GG1zfl4JyngsZReIfqRvIAEi5L4HV0q7_9qGhQZvy9ZdxEJbwTxRs_6Lb-fZTDpW6lKYNdMyjw45_alSCZ1fypsMWz_2mTpQzil0lOtps5Ei_z7mM7M8gCwe_AGpI53JxduQOaB5HkT5gVrv9cKu9CsW5MS6ZbqYXpGyOG5ehoxqm8DL5tFYaW3lB50ELxi0KsuTKEbD0t5BCl0aCR2MBJWAbN-xeLwEenaqBiwPVvKixYleeDQiBEIylFdNNIMviKRgXiYuAvMziVPbwSgkZVHeEdF5MQP1Oe2Spac-6IfA SIGNATURE

这就是从 JWT TOKEN 解码后的 Paylaod 看起来像

{     “iss” :“portswigger” ,exp” :1648037164    “name” :“Carlos Montoya” ,sub” :“carlos” ,role” :“blog_author” ,email” :“carlos@carlos-montoya ” .net" ,     "iat" :  1516239022 }
在大多数情况下,任何有权访问令牌的人都可以轻松读取或修改此数据。因此,任何基于 JWT 的机制的安全性都严重依赖于加密签名。


JWT 签名

颁发令牌的服务器通常通过散列标头和有效负载来生成签名。在某些情况下,他们还会加密生成的哈希值。无论哪种方式,此过程都涉及秘密签名密钥。此机制为服务器提供了一种方法来验证令牌中的任何数据自发布以来均未被篡改:

  • 由于签名直接源自令牌的其余部分,因此更改标头或paylaod的单个字节会导致签名不匹配。

  • 在不知道服务器的秘密签名密钥的情况下,不可能为给定的标头或paylaod生成正确的签名。

使用 JWT 的地方

JWT 令牌主要用于会话令牌、用于用户身份验证和授权的 API 令牌。当用户登录服务器时,将为登录的用户生成一个签名的 JWT 令牌,并将其用作会话令牌以进行身份验证


JWT 攻击

用户将修改后的 JWT 发送到服务器,以便可以绕过服务器上的访问控制、权限提升或帐户接管

我们使用完整的工具来操纵 JWT 令牌

JWT Editor Burp-Suite 扩展,对分析令牌、编辑和开发非常有用。

jwt.io:这些也是 JWT-Editor 的替代品,用于查看、签名和利用 jwt 错误配置漏洞。


查找和利用 JWT 漏洞

为了找到这些类型的漏洞,我们需要采用手动方法,并且需要逐一检查所有可能的错误配置


利用有缺陷的 JWT 签名验证

  • 服务器不存储有关他们发布的 jwt 的任何信息,令牌是完全独立的实体。由于服务器不知道令牌的签名和内容,我们可以任意更改令牌并将令牌伪造给服务器。

  • 例如。在这里我们可以将 isAdmin 参数更改为 true 以获得管理员权限。

{ 
   "username" : "dk" ,
   "isAdmin" : false //将此更改为 true,
//重新编码令牌并将其发送到服务器
}


服务器接受任意签名

  • 令牌上存在签名,但服务器未使用原始签名验证签名,我们可以调整令牌,重新编码并发送到服务器以利用它们。


服务器接受没有签名的令牌

  • jwt-header 的“ alg ”参数告诉服务器使用哪个算法对令牌进行签名,我们可以使用“ none ”算法对 jwt 进行签名,服务器通常会拒绝没有签名的令牌。但是,由于这种过滤依赖于字符串解析,您有时可以使用经典的混淆技术绕过这些过滤器,例如混合大写和意外编码。JWT editor > Attack > None sign。


  • JSON Web 令牌漏洞和利用


暴力破解用于使用 HS256 算法签名的密钥。

  • 一些签名算法,例如 HS256 (HMAC + SHA-256),使用任意的独立字符串作为密钥。就像密码一样,重要的是这个秘密不能轻易被攻击者猜到或暴力破解。否则,他们可能能够使用他们喜欢的任何标头和有效负载值创建 JWT,然后使用密钥重新签署具有有效签名的令牌。

  • 我们可以使用Hashcat来暴力破解签名密钥。

hashcat hashcat -a 0 -m 16500 jwt wordlist
https://github.com/wallarm/jwt-secrets/blob/master/jwt.secrets.list
常见的 jwt 秘密列表
  • 一旦识别出密钥,我们就可以调整 JWT 令牌的有效负载并使用“找到的密钥”重新签名令牌

JWT 标头参数注入

Acc to JWS only algparameter 是强制性的,但实际上jwt headers(JOSE headers)包含几个参数,例如

  • jwk: JSON WEB KEY – 提供一个嵌入的 JSON 对象表示密钥

  • jku: JSON Web 密钥集 Url:提供一个 URL,服务器可以从该 URL 获取一组包含正确密钥的密钥。

  • kid: 密钥 ID – 为密钥提供一个 ID,以便服务器可以识别正确的密钥,因为存在多个密钥


通过 jwk 参数注入自签名 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参数中嵌入匹配的公钥来利用这一点。

  • JWT editor 扩展中生成新的 rsa 密钥

  • 修改jwt的paylaod

  • attack > embaded JWK

通过 jku 参数注入自签名 JWT

一些服务器允许您使用jku (JWK set URL) ,标头参数,而不是直接使用 jwk 标头参数嵌入公钥

这是 json 对象如何查看远程 url 的示例。https://someurl.com/jwks.json

有时 JWK 集会通过 Standerd 端点公开公开,例如/.well-known/jwks.json

 

{    "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"        }    ]}

更安全的网站只会从受信任的域中获取密钥,但有时您可以利用 URL解析差异来绕过这种过滤

  • 修改jwt的payload。

  • 在JWT 标头中注入“ jku ”标头参数,并将已签名的公钥按上述格式放入your-server.com/jwk.json中。

 "kid":"somr hex of kid of key","kid":"somr hex of kid of key",
"jku":"https://ourserver.com/jwks.json"
  • 使用我们生成的私钥签署令牌并发送到服务器。如果服务器配置错误,我们就可以成功地充分利用它,否则就不会受到这种攻击。

如何防止 JWT 攻击

  • 使用最新库进行 JWT 处理。

  • 对收到的 JWT 实施健壮的签名验证,并考虑边缘情况,例如使用意外算法签名的 JWT。

  • jku为标头参数的允许主机强制执行严格白名单

  • 始终设置令牌的到期日期

  • 使发行服务器能够在注销时撤销令牌。ETC

原文始发于微信公众号(安全帮Live):JSON Web 令牌漏洞和利用

版权声明:admin 发表于 2023年4月3日 上午7:57。
转载请注明:JSON Web 令牌漏洞和利用 | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...