参考文献:www.cnblogs.com/dliv3/p/7450057.html
工具:https://jwt.io/
JWT概念:
JWT是用于网络间传递声明而执行一种基于JSON
的标准。JWT
提供了一种简单的方法,在彼此传递数据时,验证是由谁先创建了数据。JWT和cookie,session有点类似。
JWT应用场景
①授权:一旦用户登录,每个后续请求将包括JWT
,允许用户访问该令牌允许的路由,服务和资源。它的开销很小,并且能够在不同的域中轻松使用。
②信息交换:JWT可以签名。例如,使用公钥/私钥对可以确定发件人是他们所说的人。此外,由于使用标头和有效负载计算签名,还可以验证内容是否未被篡改。
JWT结构
①Header
通常由两部分组成:①令牌的类型JWT
,②正在使用的散列算法如HMAC
,SHA256
或RSA
。
{
"alg":"RS256", #alg算法的缩写
"typ":"JWT" #typ为类型的缩写
}
然后,这个JSON
被Base64
编码,形成JSON Web Token
的第一部分。
②Payload
令牌的第二部分是包含声明的有效负载。payload
中也有一些JWT
标准定义的字段,用户可选择使用
{
"iss": "John Wu JWT", #该JWT的签发者
"iat": 1441593502, #在什么时候签发的
"exp": 1441594722, #什么时候过期,这里是一个Unix时间戳
"aud": "www.example.com", #接收该JWT的一方
"sub": "jrocket@example.com", #该JWT所面向的用户
"username": "A" #私有字段
}
然后将有效载荷Base64
进行编码以形成JSON Web Token
的第二部分。
③Signature
利用header中指定算法进行签名
例如HS256(HMAC SHA256),签名的构成为:
HMACSHA256(
base64Encode(header) + "." +
base64Encode(payload),
secret)
然后将这部分base64
编码形成JSON Web Token
第三部分、
完整的JWT:
![img_e2093f1a2d1c92572437b8f504a571e4.png](https://i-blog.csdnimg.cn/blog_migrate/c36b15faad080307ecb52a6a804b85af.png)
JWT 的使用方式
在身份验证中,当用户使用其凭据成功登录时,客户端收到服务器返回的 JWT
,可以储存在 Cookie
里面,也可以储存在localStorage
。此后,客户端每次与服务器通信,都要带上这个 JWT
。可以把它放在 Cookie
里面自动发送,但是这样不能跨域,所以更好的做法是放在 HTTP 请求
的头信息Authorization字段
里面。
Authorization: Bearer <token>
攻击JWT
①敏感信息泄露payload
是明文传输的,所以如果payload
中存在敏感信息就会出现信息泄露
②修改算法为none
签名算法保证了JWT在传输的过程中不被恶意用户修改,但是header
中的alg字段
可被修改为none
,一些JWT库
支持none算法
,即没有签名算法,去掉JWT中的signature数据
(仅剩header + '.' + payload + '.'
)然后提交到服务端即可
③修改算法RS256为HS256(非对称密码算法 => 对称密码算法)
算法HS256
使用秘密密钥对每条消息进行签名和验证,算法RS256
使用私钥对消息进行签名,并使用公钥进行验证。
如果将算法从RS256
更改为HS256
,后端代码会使用公钥作为秘密密钥,然后使用HS256
算法验证签名。由于公钥有时可以获取到,所以可以修改header
中算法为HS256
,然后使用RSA公钥
对数据进行签名,后端代码会使用RSA公钥+HS256
算法进行签名验证。
④HS256(对称加密)密钥破解
如果HS256密钥
强度较弱,可以直接暴力破解,可使用PyJWT或 John Ripper进行破解测试
例子
参考文献:https://delcoding.github.io/2018/03/jwt-bypass/
找了挺多也没找到一个能玩的靶机,就直接放大佬的wp了。
- 在cookie里的内容是
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6ImZhbHNlIn0.oe4qhTxvJB8nNAsFWJc7_m3UylVZzO3FwhkYuESAyUM
{"alg":"HS256","typ":"JWT"}{"admin":"false"}({�¡O�É�ÉÍ�ÁV%ÎæÝL¥U�ÎÜ\!���H�0
- 将
admin
里面的false
变成true
就可以拿到flag。但直接变肯定是不行的,Signature部分会验证,还需要知道key
是什么 - 使用了这个工具进行破解
-
得到key,再生成cookie