
CakePHP 5.4.2 - عالي - عن بُعد - SQLi - COLLATE collation هو جزء SQL خام
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · cakephp-collate-sqli
التحليل المكتوب: https://abraxaslabs.tech/research/cakephp-collate-sqli
الفئة: SQLi الوصول: عن بُعد
CakePHP 5.4.2 (887b641) - Cake Software Foundation
StringExpression::sql يربط قيمة السلسلة ويدمج الترتيب (collation). وIdentifierExpression يفعل الشيء نفسه. لا يوجد ensureSimpleString. في Postgres فإن quoteIdentifier هي '"' . trim($collation, '"') . '"، لذا فإن علامة اقتباس مُضمَّنة تُغلق CAST مبكرًا.
التطبيق الذي يمرّر ترتيب الطلب/اللغة (collation/locale) إلى new StringExpression($term, $collation) يضع تلك السلسلة داخل COLLATE. تبقى القيمة مربوطة. أما الترتيب فلا.
| المعرّف | لا يوجد CVE بعد |
| الفئة | SQLi |
| الوصول | عن بُعد (تطبيق يمرّر collation/locale إلى StringExpression / IdentifierExpression) |
| CWE | CWE-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) |
| المصادقة | تطبيق يمرّر collation/locale إلى تلك المُنشِئات |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1 فقط |
يتطلب تطبيقًا يمرّر ترتيب المستخدم/اللغة (collation/locale) إلى تلك المُنشِئات. تطبيق cakephp/app الافتراضي لا يعرّض الترتيب على نموذج عام بحد ذاته.
| الصلاحية | الطريقة / نقطة الوصول | النوع | مُثبَت مختبريًا أم مُستنتَج |
|---|---|---|---|
حقن SQL بعد COLLATE | StringExpression::sql يدمج $this->collation | سلامة SQL المُجمَّع | مُثبَت مختبريًا. SQL الخام يحتوي على الحمولة غير مربوطة |
| نفس الحقن على المعرّفات | IdentifierExpression note COLLATE <payload> | سلامة SQL المُجمَّع | مُثبَت مختبريًا. id_raw_sql يحتوي على الحمولة |
الخروج من تغليف Postgres "..." | quoteIdentifier = '"' . trim($collation, '"') . '"' | سلامة SQL المُجمَّع | مُثبَت مختبريًا. SQL المُجمَّع هو COLLATE "C" AS text)) || (SELECT ... |
| تنفيذ الخروج وقراءة جدول آخر | CAST(... ) || (SELECT note FROM lab_secret ...) | استطلاع قاعدة البيانات | مُثبَت مختبريًا. النتيجة xCAKEPHP-COLLATE-SQLI-WITNESS، دون خطأ تنفيذ |
| تعديل الصفوف / مزيد من SQL بدور الاتصال | نفس الحقن | سلامة قاعدة البيانات | مُستنتَج. المختبر أوراكل SELECT |
| الضبط السلبي | collation C | مغلق | مُثبَت مختبريًا. النتيجة x، دون شاهد، والمُجمَّع COLLATE "C" |
مغلق في هذه البقايا: قيمة السلسلة المربوطة (:c0 تبقى الحرف x)؛ الترتيب الذي يمرّ عبر ensureSimpleString (^[a-zA-Z0-9]+$) ليس هذه الحمولة. ليس RCE غير مُصادَق على تطبيق هيكلي. ليس صدفة (shell).
بقايا نفس التثبيت: window SQLi، attachment CRLF، cache unserialize.
ثبّتُ 5.4.2 بعد ملاحظات FunctionsBuilder / filename=. عشر عمليات بحث. جولة SQLi المتبقية هي هذه. StringExpression::sql:
$placeholder = $binder->placeholder('c');
$binder->bind($placeholder, $this->string, 'string');
return $placeholder . ' COLLATE ' . $this->collation;
Postgres quoteIdentifier يلفّ بعلامات اقتباس ASCII و trim($collation, '"'). علامة " المضمّنة تُغلق المعرّف. -- تلتهم المُغلِق المتبقي الذي لا يزال Cake يضيفه.
المسارات الخاطئة المسجّلة سلفًا: SQLite كمحرّك وحيد (concat حقيقي، والاختراق من الالتفاف في Postgres)؛ معاملة القيمة المربوطة على أنها الحقن؛ الادعاء بأن ensureSimpleString قد نُفّذ هنا بالفعل (لم يحدث)؛ reverse shell. مسرحية.
python3 cakephp-collate-sqli-Abraxas-Labs.py
أو
cd lab
./run.sh
استهدف فقط http://127.0.0.1:19450. حزمة cakephp/database 5.4.2 مع Postgres 16. تطبيق صغير يمرّر ?collation= إلى StringExpression / IdentifierExpression وينفّذ CAST(... AS text). جدول الأسرار يحمل الشاهد.
SUCCESS cakephp-collate-sqli pin=5.4.2 raw=concat pg-wrap=breakout exec=yes CAKEPHP-COLLATE-SQLI-WITNESS
ensureSimpleString() (أو قائمة سماح للترتيب) على وسيط الترتيب. يجب على Postgres اقتباس المعرّفات بشكل صحيح، وليس trim مع التغليف.
887b641de9f7aba06071f98f17edcbc573cbcf63)StringExpression.php · IdentifierExpression.php · Postgres.phpensureSimpleString()GNU Affero GPL v3.0. راجع LICENSE. مختبر الاسترجاع المحلي فقط. دون أي ضمان.