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


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

然后,这个JSONBase64编码,形成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 的使用方式

在身份验证中,当用户使用其凭据成功登录时,客户端收到服务器返回的 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了。




标签: jwt
2019.10.30   /   热度:1180   /   分类: 其它相关

发表评论:

©地球仪的BLOG  |  Powered by Emlog