Skip to content
KitploitKITPLOIT
أدواتعمليات الاستغلالالمدونة
Log in
إرسال
أدواتعمليات الاستغلالالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

الخلاصاتاتصالالخصوصية© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
cakephp-window-sqli — CakePHP 5.4.2 - عالي - عن بُعد - SQLi - إزاحات النطاق/الإطار في WindowExpression مدمجة في SQL | Kitploit
أدوات/GitHubGitHub/abraxas/cakephp-window-sqli
ماسحات الثغرات الأمنيةتحليل الثغرات الأمنيةتحليل الكودالاستغلالاستغلال تطبيقات الويبأمن الويبأمن قواعد البيانات
GitHubabraxas/cakephp-window-sqli

cakephp-window-sqli

CakePHP 5.4.2 - عالي - عن بُعد - SQLi - إزاحات النطاق/الإطار في WindowExpression مدمجة في SQL

عرض المستودع
17منذ 8 أياملم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

Abraxas Labs - cakephp-window-sqli

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  cakephp-window-sqli

تقرير: https://abraxaslabs.tech/research/cakephp-window-sqli

cakephp-window-sqli

الفئة: SQLi الوصول: عن بُعد

CakePHP 5.4.2 (887b641) - Cake Software Foundation

أغلق CVE-2026-79752 دوال FunctionsBuilder cast / extract / dateAdd باستخدام ensureSimpleString(). لم تكن WindowExpression::range() وframe() ضمن ذلك الإصلاح. تأخذ rows() وgroups() قيمة ?int. لا تزال range() تأخذ سلسلة نصية. تربط buildOffsetSql الإزاحة ونوع الإطار وPRECEDING / FOLLOWING داخل OVER. لا يُستخدم الرابط (binder) إلا إذا كانت الإزاحة بالفعل من نوع ExpressionInterface.

التطبيق الذي يمرر بيانات الطلب إلى func()->count('*')->over()->range($start, $end) يُدخل سلسلة النص الخاصة بالمُستدعي داخل RANGE BETWEEN دون ربط ودون اقتباس.

المعرّفلا يوجد CVE بعد
الفئةSQLi
الوصولعن بُعد (تطبيق يمرر بيانات الطلب إلى range() / frame())
CWECWE-89
CVSSعالٍ: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N
المنتجCakePHP (cakephp/database)
المتأثر5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63)
المصادقةتطبيق يمرر بيانات الاستعلام/النموذج إلى ->over()->range($start, $end) / frame()
الترخيصGNU Affero GPL v3.0
المختبر127.0.0.1 فقط

ما يمكن للمهاجم فعله

المستخدم الذي يمكنه تعيين حد النافذة الذي يمرره التطبيق (تحليلات "آخر N أيام"، منشئ تقارير) يغيّر جملة OVER إلى SQL إضافي.

الصلاحيةالطريقة / نقطة الوصولالنوعمُثبت مختبريًا أو مُستنتج
حقن جزء SQL داخل OVER (RANGE BETWEEN ...)GET /?mode=range&start= إلى AggregateExpression::range($start, $end) / WindowExpression::frame()سلامة SQL المُجمّعمُثبت مختبريًا. SQL المُجمّع هو RANGE BETWEEN 1) /* CAKEPHP-WINDOW-SQLI-WITNESS */ -- PRECEDING مع رابط فارغ
قراءة أو تعديل الصفوف بصلاحية مستخدم قاعدة بيانات التطبيقنفس الاستعلام، مُنفَّذسلامة / استطلاع قاعدة البياناتمُستنتج من الحقن. هذا المختبر للتجميع فقط
تغيير نوع الإطار أو اتجاهه بالطريقة نفسهاframe($type, $offset, $direction, ...) يربط تلك السلاسل النصية أيضًاسلامة SQL المُجمّعمُستنتج من sql() / buildOffsetSql(). استخدم المختبر range()
كسر rows() / groups() بالطريقة نفسهامُقيّد بـ ?intمُغلقمُثبت مختبريًا أنه مُغلق. rows(3) هو ROWS BETWEEN 3 PRECEDING، غير مُقتبس وغير مربوط

مُغلق على هذا الإصدار: FunctionsBuilder cast / extract / dateAdd / jsonValue (CVE-2026-79752 / CVE-2026-77635)؛ Query::limit / offset (مُقيّد بـ int). لا يستدعي cakephp/app الافتراضي range() ببيانات سلسلة الاستعلام. المتبقي هو واجهة برمجة النوافذ الموثقة. ليس RCE غير مُصادق عليه على تطبيق هيكلي. ليس صدفة (shell).

بقايا نفس المسألة: حقن SQL في collate، CRLF في المرفقات، إلغاء تسلسل ذاكرة التخزين المؤقت.

كيف وجدته

ثبّتُ إصدار cakephp/cakephp 5.4.2 بعد نشر GHSAs الخاصة بـ FunctionsBuilder SQLi لعام 2026. عشرة عمليات بحث على ذلك الوسم. عادت عمليات البحث الخاصة بـ CSRF / FormProtection، وView LFI، وBodyParser XXE، وmass assignment، وhelper XSS، وclientIp() بدون trustProxy فارغة في هذا الإصدار. لا يزال WindowExpressionTest::testRange يؤكد:

$w = (new WindowExpression())->range("'1 day'", "'10 days'");

buildOffsetSql لا يربط أبدًا إزاحة نصية:

protected function buildOffsetSql(
    ValueBinder $binder,
    ExpressionInterface|string|int|null $offset,
    string $direction,
): string {
    if ($offset === 0) {
        return 'CURRENT ROW';
    }
    if ($offset instanceof ExpressionInterface) {
        $offset = $offset->sql($binder);
    }
    return sprintf('%s %s', $offset ?? 'UNBOUNDED', $direction);
}

$binder غير مستخدم ما لم يكن الإزاحة بالفعل ExpressionInterface.

المنعطفات الخاطئة المسجّلة مسبقًا: التعامل مع rows() على أنها الثغرة (فهي من النوع int)؛ الادعاء بأن cakephp/app القياسي يكشف هذا في نموذج عام؛ تنفيذ SQL المحقون في SQLite كأداة تحقق (POC-READY هو تجميع فقط)؛ صدفة عكسية. مسرح.

المختبر

python3 cakephp-window-sqli-Abraxas-Labs.py

أو

cd lab
./run.sh

استهدف فقط http://127.0.0.1:19440. تطبيق PHP صغير، cakephp/database 5.4.2، SQLite :memory:. يُمرَّر GET /?mode=range&start= كسلسلة نصية إلى range(). GET /?mode=rows&n=3 هو عنصر التحكم من نوع int.

SUCCESS cakephp-window-sqli pin=5.4.2 range-raw=yes rows-numeric=yes bound=no quoted=no CAKEPHP-WINDOW-SQLI-WITNESS

IOC عبارة عن SQL مُجمَّع:

SELECT (COUNT(*) OVER (RANGE BETWEEN 1) /* CAKEPHP-WINDOW-SQLI-WITNESS */ -- PRECEDING AND CURRENT ROW)) AS n FROM sqlite_master

التحكم:

SELECT (COUNT(*) OVER (ROWS BETWEEN 3 PRECEDING AND CURRENT ROW)) AS n FROM sqlite_master

الإصلاح

اربط الإزاحات الرقمية. اسمح بنوع الإطار (RANGE / ROWS / GROUPS) والاتجاه (PRECEDING / FOLLOWING) عبر قائمة السماح. بالنسبة لسلاسل الفواصل الزمنية، ضعها بين علامتي اقتباس أو اشترط ExpressionInterface. أضف اختبارًا يتحقق من أن إزاحة range() غير الصحيحة من نوع int تتحول إلى عنصر نائب (placeholder) أو نص حرفي بين علامتي اقتباس، وليس إلى SQL خام.

المراجع

  • github.com/cakephp/cakephp وسم 5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63)
  • WindowExpression.php · AggregateExpression.php
  • إصلاحات قريبة: CVE-2026-79752 · CVE-2026-77635
  • نفس الإصدار المثبّت: cakephp-collate-sqli · cakephp-attachment-crlf · cakephp-cache-unserialize
  • CWE-89

الترخيص

GNU Affero GPL v3.0. راجع LICENSE. للاستخدام في مختبر loopback فقط. دون أي ضمان.

تنزيل الأداة