
Resumen
/api/set-password que permite cambios de contraseña sin consentimiento.Impacto
built-in/admin), lo que lleva a la toma de control de la cuenta.Prerrequisitos del ataque
casdoor_session_id válida./api/set-password.Prueba de concepto
<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 raíz
/api/* aceptan solicitudes autenticadas por cookie sin aplicar comprobaciones de mismo origen (Origin/Referer) ni tokens CSRF.Resumen de la corrección
/api/*.Authorization, autenticación Basic, credenciales de cliente o accessToken) o solicitudes sin cookies de sesión del navegador (llamadas típicas de servidor a servidor).Implementación
routers.CSRFFilter implementado en csrf_filter.go. Este filtro:
Cómo integrarlo en Casdoor
csrf_filter.go al paquete routers existente del proyecto Casdoor. No modifiques ni elimines nada de este archivo.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)
Verificación
Unauthorized operation y el servidor debe registrar CSRF check failed.Authorization o parámetros accessToken deberían seguir funcionando.Archivos del repositorio
csrf_filter.go: filtro CSRF que se copia al paquete routers de Casdoor.poc.html: página mínima que reproduce el ataque CSRF.README.md: este documento que describe la vulnerabilidad y los pasos de corrección.Referencias
Vídeo