web345
看源码发现/admin
放问/admin在cookie生成了
把他用jwt解密
在alg中是None所以是无加密,吧user改为admin再base64加密即可
web346
和上题差不多但有了个加密,
我们还是要把user改成admin,但不知道秘钥,盲猜一波123456
将cookie提交再去访问/admin/即可
web347
和上题一样key是123456
web348
相同的前端,题目提示爆破,把cookie拿出来
加密的,还是要把user改成admin,但不知道key用jwtcrack爆破一下
下载地址https://github.com/brendan-rius/c-jwt-cracker
爆破出aaab来就跟上面的布置相同了
web349
app.js
/* 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');
}
});
});
通过访问/private.key
和public.key
来获得公私钥
之后在jwt.io中填入,修改admin后将得到的cookie传入,同时post一个参数就可以了
web350
HS256算法使用密钥为所有消息进行签名和验证。
而RS256算法则使用私钥对消息进行签名并使用公钥进行身份验证。
如果将算法从RS256改为HS256,则后端代码将使用公钥作为密钥,然后使用HS256算法验证签名。
由于攻击者有时可以获取公钥,因此,攻击者可以将头部中的算法修改为HS256,然后使用RSA公钥对数据进行签名。
这样的话,后端代码使用RSA公钥+HS256算法进行签名验证。
node脚本
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)
ken = jwt.sign({ user: ‘admin’ }, privateKey, { algorithm: ‘HS256’ });
console.log(token)
运行 nodejs 获取 cookie 去替换即可