免责声明
合法使用原则:文中提及的技术、工具或案例,仅用于授权范围内的安全测试、防御研究或合规技术分享,未经授权的网络攻击、数据窃取等行为均属违法,需承担法律责任。
风险自担与责任豁免:文章内容基于公开信息整理,不保证技术的准确性、完整性或适用性。读者需自行评估技术应用风险,若因不当使用导致任何法律后果或损失,均由使用者自行承担,与本公众号及作者无关。
法律管辖与提示:本公众号坚决拥护相关法律法规,反对任何危害网络安全的行为,读者需严格遵守法律法规。
一、JWT介绍
-
JWT,全称是JSON Web Token,用于在网络应用环境间以JSON对象安全地将信息作为令牌进行传输,这种令牌被广泛应用于用户认证和信息交换的场景中。 -
与传统会话令牌不同,服务器所需的所有数据都存储在客户端的JWT本身中。这使得JWT成为高度分布式网站的热门选择,因为用户需要与多个后端服务器无缝交互。 -
实际上JWT也是一种鉴权字段(cookie字段变为JWT)
JWT的结构
-
JWT通常由三部分组成:Header(头部)、Payload(载荷)和Signature(签名),这三部分通过点号 .
连接在一起形成一个完整的JWT字符串。 -
Header:包含了令牌的类型(即JWT)和所使用的签名算法(如HMAC SHA256或RSA等)。例如:
{
"alg": "HS256",
"typ": "JWT"
}
-
Payload:包含声明(claims)。Claims是关于实体(通常是用户)和其他数据的声明。JWT定义了三种类型的claim:registered、public和private。
-
Registered claims:这些是一组预定义的claims,不是强制的,但推荐使用,包括iss(issuer)、exp(expiration time)、sub(subject)、aud(audience)等。 -
Public claims:可以随意定义,为了避免冲突应该在IANA JSON Web Token Registry中定义或者使用一个抗冲突的命名空间。 -
Private claims:用于在同意使用它们的各方之间共享信息,并且既不是Registered也不是Public claims。
-
Signature:要创建签名部分,就必须采取编码后的header、编码后的payload、一个秘钥,以及头部指定的算法。比如使用HMAC SHA256算法,签名按照下面方式创建:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
JWT的工作原理
-
当用户使用其凭据成功登录时,服务器会生成一个JWT并返回给客户端。 -
之后,客户端应在每个请求中附带这个令牌(通常通过HTTP头部Authorization字段携带)。 -
服务器接收到请求后,首先验证JWT的有效性,如果有效,则处理请求。
二、Burp插件推荐-JWT Editor
-
便于修改JWT
三、通过未验证的签名绕过JWT身份验证
-
方法:签名随便写即可绕过 -
靶场地址:https://portswigger.net/web-security/jwt/lab-jwt-authentication-bypass-via-unverified-signature -
场景:通过登录已给的普通用户账号密码登录后,访问管理员的管理面板,删除另一个用户(本质其实就是越权)
-
先通过已给的账户进行登录
-
登录成功
-
访问 /admin
这个页面,发现不是管理员账户,无法访问
-
再次访问,使用Burp抓包,发送到Repeater,发现通过JWT鉴权
-
点击JSON Web Token,可以清晰看到解码后的JWT各个字段的值
-
能够看到现在登录的账户是wiener
-
此时将wiener改为administrator,然后发包,发现访问成功
-
原因是此处没有验证JWT的签名字段
-
由于没有验证JWT的签名字段,所以在攻击过程中就可以随意更改这个签名,然后发包,发现依然能够成功访问
-
此时就可以将这个能够访问成功的JWT复制下来
-
然后重新访问 /admin
,用Burp抓包,将此时的JWT换成刚能够成功访问的JWT,然后放包,并且将每一步的JWT都替换一下,直到所有数据包替换完成
-
此处的不用改
-
最后回到浏览器,发现成功越权访问
-
此时点击删除carlos用户,依旧将JWT进行修改,最后即可删除成功
四、不签名攻击(none攻击)
-
原理:
-
JWT标头包含一个 alg
参数。这会告诉服务器使用哪种算法对令牌进行签名,从而告诉服务器在验证签名时需要使用哪种算法。JWT可以使用一系列不同的算法进行签名,但也可以保持不签名状态。 -
在这种情况下, alg
参数设置为none
,这表示所谓的“不安全的 JWT”。由于这样做的明显危险,服务器通常会拒绝没有签名的令牌。 -
JWT允许设置其头部中的 alg
字段为"none",表示这是一个不签名的JWT,这意味着任何实体都可以修改令牌内容而不被发现。
-
靶场地址:https://portswigger.net/web-security/jwt/lab-jwt-authentication-bypass-via-flawed-signature-verification -
场景:通过登录已给的普通用户账号密码登录后,访问管理员的管理面板,删除另一个用户
-
先通过已给的账户进行登录
-
登录成功
-
访问 /admin
这个页面,发现不是管理员账户,无法访问
-
再次访问,使用Burp抓包,发送到Repeater,发现通过JWT鉴权
-
点击JSON Web Token,将wiener用户改为administrator,然后发包,发现依旧没有访问成功
-
此时在左下角,将alg改为none,发包后发现访问成功
五、通过弱签名密钥绕过JWT身份验证
-
靶场地址:https://portswigger.net/web-security/jwt/lab-jwt-authentication-bypass-via-weak-signing-key
-
先通过已给的账户进行登录
-
登录成功
-
访问 /admin
这个页面,发现不是管理员账户,无法访问
-
再次访问,使用Burp抓包,发送到Repeater,发现通过JWT鉴权
-
点击JSON Web Token,可以看到加密算法为 HS256
-
此时可以将整个JWT复制到无影工具中,对密钥进行破解
-
然后将JWT和破解出来的密钥复制到以下网站,然后将wiener用户改为administrator
-
https://jwt.io/
-
将重新编码后的JWT复制到Burp,然后发包,发现访问成功
原文始发于微信公众号(AegisGuard):不容忽视的威胁:探索与JWT相关漏洞(另类的越权)
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论