
إثبات المفهوم لـ CVE-2025-22783
إضافة ووردبريس
اسم المكون إضافة SEO من Squirrly SEO
الإصدار القابل للاستغلال <= 12.4.01
الاسم المختصر للمكون squirrly-seo
رابط المكون https://wordpress.org/plugins/squirrly-seo/
فئة الثغرة A3: حقن
نوع الثغرة حقن SQL
مساهم (Contributor) أو أعلى
إضافة SEO من Squirrly SEO تتيح لك تحسين محركات البحث لموقعك من خلال ميزة الروابط الداخلية التي تسمح لك بتحديد صفحات المصدر والهدف بناءً على كلمات مفتاحية محددة. يمكنك إدارة كلمات المفتاح لكل رابط، وصفحات المصدر، وصفحات الهدف، والحالة من خلال صفحة إدارة الروابط الداخلية (/wp-admin/admin.php?page=sq_focuspages&tab=innerlinks).
في الإصدارات 12.4.01 وما دون من إضافة Squirrly SEO، يمكنك البحث عن الروابط الداخلية التي تم إنشاؤها في صفحة إدارة الروابط الداخلية. تحدث ثغرة حقن SQL عندما يتم تمرير مصطلحات البحث التي أدخلها المستخدمون (مساهمون+) مباشرة إلى استعلامات قاعدة البيانات دون التحقق من صحتها.
على الرغم من أن نتائج البحث لا تُعرض مباشرة في صفحة إدارة الروابط الداخلية، إلا أنه يمكن استخراج معلومات قاعدة البيانات باستخدام تقنيات حقن SQL القائمة على الوقت مثل دالة SLEEP.
سجل الدخول إلى الموقع المستهدف بحساب لديه صلاحيات مساهم أو أعلى حيث مثبتة إضافة Squirrly SEO الإصدار 12.4.01 أو أقل.
بعد ذلك، عند الوصول إلى الرابط أدناه، نظرًا لأن شرط جملة IF '1=1' في حمولة حقن SQL صحيح دائمًا، سيتم تنفيذ دالة SLEEP(5) وسيتم تحميل الصفحة بعد 5 ثوانٍ.
http://localhost:8080/wp-admin/admin.php?page=sq_focuspages&tab=innerlinks&stype&squery='+AND+1%3D2)+UNION+SELECT+(IF(1=1,SLEEP(5),1)),2,3,4,5,6,7%23
من ناحية أخرى، إذا قمت بتغيير شرط جملة IF إلى '1=2'، سيتم تحميل الصفحة فورًا لأن النتيجة خاطئة.
http://localhost:8080/wp-admin/admin.php?page=sq_focuspages&tab=innerlinks&stype&squery='+AND+1%3D2)+UNION+SELECT+(IF(1=2,SLEEP(5),1)),2,3,4,5,6,7%23
في صفحة إدارة الروابط الداخلية (/wp-admin/admin.php?page=sq_focuspages&tab=innerlinks) لإضافة Squirrly SEO، عند البحث عن الروابط الداخلية، يتم الاستعلام عن قاعدة البيانات عن طريق استدعاء دالة getSqInnerlinks في الملف /wp-content/plugins/squirrly-seo/models/Qss.php.

في هذه النقطة، نرى أن المتغير $query_where يتم إدراجه مباشرة في استعلام SQL. دعنا نفحص كيف يتم بناء قيمة المتغير $query_where:
$search يحتوي على مصطلح البحث الذي تم إدخاله أثناء البحث عن الرابط الداخلي، ويتم استخدام دالة sanitize_text_field لمعالجة بيانات إدخال المستخدم.$search كجزء من جملة الشرط وتخزينه في المتغير $query_where.$query_where، ويتم تطبيق المرشحات من خلال دالة apply_filters.لذلك، على الرغم من أن مصطلح البحث الذي أدخله المستخدمون أثناء بحث الرابط الداخلي يتم معالجته بواسطة دالة sanitize_text_field، إلا أن هذه الدالة لا يمكنها منع هجمات حقن SQL. لا يتم تصفية الأحرف الخاصة المستخدمة في استعلامات SQL (الاقتباسات المفردة (')، التعليقات (#)، إلخ)، وعندما يتم تمرير المتغير $search الذي يحتوي على حمولة حقن SQL إلى استعلام قاعدة البيانات دون هروب مناسب، تحدث ثغرة حقن SQL.
⚠️ يقوم كود PoC المنفذ بتسجيل الدخول بحساب مسؤول لإنشاء حساب بأقل الصلاحيات المطلوبة (مساهم+) لإعادة إنتاج الثغرة، ثم يقوم بتشغيل الثغرة باستخدام ذلك الحساب.

بعد ذلك، أدخل الأمر التالي لتشغيل كود PoC.
الوحدة المطلوبةrequests
python poc.py
