
PoC لثغرة CVE-2026-73847 - emlog AI Assistant: من CSRF إلى تنفيذ SQL إلى الاستيلاء على حساب المدير (CVSS 6.8)
إثبات مفهوم (PoC) لغياب حماية CSRF في نقطة نهاية execute_tool الخاصة بمساعد الذكاء الاصطناعي في emlog pro، والتي تتيح للمهاجم ركوب جلسة مدير مصادق عليها لتنفيذ استعلامات SQL عشوائية على قاعدة بيانات الموقع — بما في ذلك استيلاء كامل على حساب المدير.
| CVE | CVE-2026-73847 |
| CNA | GitHub |
| الاستشارة | GHSA-v6wr-4x55-7qp5 |
| CVSS 3.1 | 6.8 متوسط — AV:N/AC:H/PR:N/UI:R/S:U/C:H/I:H/A:N |
| CWE | CWE-352 (CSRF)، CWE-1275 (SameSite غير سليم)، CWE-798 (سلسلة تأكيد كتابة مبرمجة بشكل ثابت) |
| المتأثر | emlog pro حتى 2.6.23 |
| الإسناد | Dostxodjayev Abdullox (@squeeze440) — تصحيح معلّق في سجل CVE، انظر أدناه |
لوحة تحكم emlog pro تتضمن مساعد ذكاء اصطناعي يمكنه تنفيذ SQL نيابةً عن المدير عبر POST /admin/ai.php?action=execute_tool. تتراكم عدة مشكلات على نقطة النهاية هذه:
admin/ يستدعي LoginAuth::checkToken() أولاً (مثل admin/media.php:140). أما admin/ai.php فلا يفعل ذلك أبداً.admin/ai.php:152, User::isAdmin()) — لا يوجد فحص لـ Origin/Referer.include/service/ai.php:594: if (trim($confirm_code) !== 'confirm'). أي طلب مزوّر يرسل فقط confirm_code=confirm.include/service/ai.php:578,589) — أي طلب مصادق عليه مجرّد يمكنه تنفيذ SELECT على أي جدول.blog فقط هو المحمي من الكتابة (include/service/ai.php:591) — بينما user وكل جدول آخر قابل للكتابة بالكامل.password (include/service/ai.php:822-828) — SELECT password AS pwd_hash FROM user يعيد الهاش الخام.SameSite (include/lib/loginauth.php:99)، مما يترك نافذة السماح الافتراضية في Chrome "Lax+POST" (تقريباً أول دقيقتين بعد تسجيل الدخول) كالحاجز الوحيد بين هذا الهجوم وبين إيصال موثوق عبر المواقع.عند ربط هذه الثغرات معاً: طلب واحد مزوّر من متصفح المدير يقرأ كل جدول (بما في ذلك هاشات كلمات المرور) ويكتب في كل جدول باستثناء blog، بما في ذلك الكتابة المباشرة فوق user.password.
poc_raw_impact.sh)يعزل أساس تجاوز SQL/المصادقة عن مسألة إيصال CSRF. شغّله ضد نسخة محلية تتحكم بها:
./poc_raw_impact.sh http://TARGET admin '<adminpass>'
يقوم هذا السكربت بتسجيل الدخول كمدير، ويسحب هاشات كلمات المرور عبر تجاوز الاسم المستعار للعمود، ويكتب مباشرة فوق كلمة مرور المدير عبر جدول user، ثم يسجل الدخول مجدداً بكلمة المرور التي اختارها المهاجم من مخزن كوكيز جديد — مما يثبت الاستيلاء الكامل على الحساب بمجرد وصول طلب مصادق عليه إلى نقطة النهاية.

poc_csrf.html)يحسم مسألة SameSite بمتصفح مباشر بدلاً من افتراضها. قدّم poc_csrf.html من أي أصل (origin) مختلف عن الهدف (عنوان IP مختلف يكفي — Chrome يعامل عناوين IP الحرفية المختلفة كمواقع منفصلة) واجعل مديراً مسجلاً الدخول يفتحه خلال دقيقتين تقريباً من تسجيل الدخول:
python3 -m http.server 8888
# then point poc_csrf.html's form action at your target and get it opened
يرسل النموذج نفسه تلقائياً عند التحميل، حيث ينفّذ طلب POST مزوّراً لاستدعاء query_database مع confirm_code=confirm عبر المواقع.

تم التحقق مباشرة: حمل طلب POST المزوّر عبر المواقع كوكيز مصادقة المدير الحقيقي (sec-fetch-site: cross-site, مع إرفاق الكوكيز)، وأعاد 200 {"code":0,"msg":"ok",...}، وتم تأكيد وجود الصف المحقون عبر قراءة مصادق عليها لاحقة. إعادة نفس الطلب بعد حوالي 48 دقيقة ضد نفس مخزن الكوكيز المتقادم باءت بالفشل — لم تُرفق أي كوكيز وأعاد الخادم توجيهاً غير مصادق عليه، مما يؤكد أن نافذة Lax+POST التي تبلغ حوالي دقيقتين هي القيد الحقيقي (وينعكس في AC:H).
emlog_options (بيانات SMTP، مفاتيح API، إلخ.).blog، بما في ذلك user — الكتابة فوق الدور/كلمة المرور/البريد الإلكتروني، ومثبتة من البداية للنهاية كاستيلاء على الحساب.role=admin؛ writer/editor محجوبون بواسطة User::checkRolePermission(). ليس تصعيد صلاحيات من دور أدنى — بل يحوّل نقرة واحدة على رابط خبيث من مدير مسجل الدخول إلى اختراق كامل وصامت للموقع.أضف LoginAuth::checkToken() إلى execute_tool، واضبط SameSite=Strict على كوكيز المصادقة، واستبدل سلسلة confirm_code الثابتة برمز حقيقي لكل جلسة يُستخدم مرة واحدة. التفاصيل الكاملة للمعالجة في الاستشارة الأمنية.
ملاحظة حول الإسناد: نشر GitHub بصفته CNA سجل CVE دون إدخال credits، على الرغم من أن GHSA نفسها نسبت المُبلّغ وقبلته. أُرسل طلب تصحيح إلى [email protected] في 2026-08-16؛ سيتم تحديث ملف README هذا إذا صُحح السجل.
نُشر هذا المحتوى بعد أن أصبحت الاستشارة عامة وتم تعيين CVE، للاستخدام الدفاعي/التعليمي. لا تشغّل هذا ضد نسخة emlog لا تملكها أو لست مخوّلاً صراحةً لاختبارها.