Il sito permette di registrarsi ed eseguire il login, ogni volta che viene commessa una delle due azioni, viene impostato un token jwt, il token viene successivamente controllato da questa funzione
const authenticateToken = (req, res, next) => {
let token = null;
let cookies = req.headers.cookie;
if (cookies) {
cookies = cookies
.split(";")
.find((e) => e.split("=")[0].replace(" ", "") === "auth");
if (cookies != undefined) token = cookies.split("=")[1].replace(" ", "");
}
if (token == null) {
req.user = null;
next();
return;
}
const user = jwt.decode(token);
if (typeof user.username !== "string") return res.sendStatus(400);
req.user = user;
next();
};
La funzione authenticateToken
utilizza la libreria jsonwebtokens, in particolare utilizza la funzione jwt.decode
, sulla documentazione della libreria si può scoprire che questa funzione non fa un controllo sulla firma, di conseguenza si può impostare lo username "gabibbo" all'interno del jwt e prendere la flag salvata nella sua home.
{
"username": "gabibbo",
"is_admin": true
}