Fork me on GitHub

JWT利用

参考文献:www.cnblogs.com/dliv3/p/7450057.html
工具:https://jwt.io/

JWT概念:

JWT是用于网络间传递声明而执行一种基于JSON 的标准。JWT 提供了一种简单的方法,在彼此传递数据时,验证是由谁先创建了数据。JWT和cookie,session有点类似。

JWT应用场景

①授权:一旦用户登录,每个后续请求将包括JWT,允许用户访问该令牌允许的路由,服务和资源。它的开销很小,并且能够在不同的域中轻松使用。
②信息交换:JWT可以签名。例如,使用公钥/私钥对可以确定发件人是他们所说的人。此外,由于使用标头和有效负载计算签名,还可以验证内容是否未被篡改。

JWT结构

①Header
通常由两部分组成:①令牌的类型JWT,②正在使用的散列算法如HMACSHA256RSA

1
2
3
4
{
"alg":"RS256", #alg算法的缩写
"typ":"JWT" #typ为类型的缩写
}

然后,这个JSONBase64编码,形成JSON Web Token的第一部分。

②Payload
令牌的第二部分是包含声明的有效负载。
payload中也有一些JWT标准定义的字段,用户可选择使用

1
2
3
4
5
6
7
8
{
"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),签名的构成为:

1
2
3
4
HMACSHA256(
base64Encode(header) + "." +
base64Encode(payload),
secret)

然后将这部分base64编码形成JSON Web Token第三部分、

完整的JWT:

JWT 的使用方式

在身份验证中,当用户使用其凭据成功登录时,客户端收到服务器返回的 JWT,可以储存在 Cookie 里面,也可以储存在localStorage。此后,客户端每次与服务器通信,都要带上这个 JWT。可以把它放在 Cookie里面自动发送,但是这样不能跨域,所以更好的做法是放在 HTTP 请求的头信息Authorization字段里面。

1
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里的内容是

    1
    2
    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6ImZhbHNlIn0.oe4qhTxvJB8nNAsFWJc7_m3UylVZzO3FwhkYuESAyUM
    {"alg":"HS256","typ":"JWT"}{"admin":"false"}({Š¡OÉÉÍÁV%ÎæÝL¥UœÎÜ\!‘‹„H ”0
  • admin里面的false变成true就可以拿到flag。但直接变肯定是不行的,Signature部分会验证,还需要知道key是什么

  • 使用了这个工具进行破解
  • 得到key,再生成cookie
-------------本文结束感谢您的阅读-------------