签名算法可被修改为none,JWT支持将算法设定为"None"。如果"alg"字段设为"None",那么签名会被置空,这样任何token都是有效的。
打开burpsuite,抓包,可以看到是jwt
发送到repeater
通过jwt.io网站,可以发现alg,也就是加密算法是None
第一部分:对 JSON 的头部做 base64 编码处理得到第二部分:对 JSON 类型的 payload 做 base64 编码处理得到第三部分:分别对头部和载荷做base64编码,并使用.拼接起来使用头部声明的加密方式,对base64编码前两部分合并的结果加盐加密处理,作为JWT
通过以上内容可知,我们可以先把jwt用base64解密,把user改成admin
在进行base64加密,看是否会显示admin的内容
放进repeater中,并把路径改成 /admin/发送,得到flag
346.web346
未校验签名(攻击签名不使用签名认证)
某些服务端并未校验JWT签名,可以尝试修改payload后然后直接请求token或者直接删除signature再次请求查看其是否还有效。
打开题目,抓包,发送到repeater里
插件识别到jwt,发现有加密,利用工具解密
利用jwt-tools解密
把以下图片中分别改成None和admin
利用命令开始修改
HS256修改成None
sub=user修改成sub=admin
得到新的jwt,放入burpsuite中
发现没有flag,需要把签名置空
签名算法可被修改为none,JWT支持将算法设定为"None"。如果"alg"字段设为"None",那么签名会被置空,这样任何token都是有效的。
置空后,发现flag
347.web347
暴力破解密钥(攻击签名知道密钥实现重组)
针对是对称加密算法(非对称没有用)
非对称要使用方法:获取源码或者公钥私钥文件
某些签名算法,例如HS256(HMAC+SHA-256),会像密码一样使用一个任意的、独立的字符串作为秘密密钥。这个秘钥如被轻易猜到或暴力破解,则攻击者能以任意的头部和载荷值来创建JWT,然后用密钥重新给令牌签名。
打开题目抓包,发送到repeater
利用工具ctf_tools工具,爆破密钥
密钥为123456,验证密钥,密钥正确
使用jwt.io网站解析jwt,把密钥放进去,把sub改成admin
放入包中,得到flag
348.web348
步骤和上一题一致,密钥爆破,爆破为aaab
按照上题步骤得到flag
349.web349
通过泄露的源码可以知道,jwt是用私钥加密,公钥解密,那我们通过路径下载私钥,利用私钥进行payload进行加密,然后发包得到flag
下载private.key
下载PyJWT,jwt
使用脚本,生成jwt
import jwt public = open('private.key', 'r').read() payload={"user":"admin"} print(jwt.encode(payload, key=public, algorithm='RS256'))
因为泄露的js代码中是用post发送,所以发送数据包时要改成post发送
发送,发现flag
350.web350
通过源码可以看到,只规定了加密时private.key为RS256加密,而解密时的public.key没有规定,则为任意加密,那我们用HS256,原因是HS256为对称加密,加解密公用一个密钥。
写一个python脚本,利用public.key进行HS256加密
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)
抓包,发送到repeater中,改成POST方法,jwt换成加密后的,发送,发现flag
<br/>
评论