
CakePHP 5.4.2 - عالي - عن بُعد - SQLi - COLLATE collation هو جزء SQL خام
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · 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 فقط |
يحتاج إلى تطبيق يمرّر ترتيب المستخدم/اللغة إلى تلك المُنشِئات. تطبيق 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 |
| الضبط السلبي | الترتيب 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 كمشغّل وحيد (الدمج حقيقي، لكن كسر التغليف خاص بـ 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. مختبر loopback فقط. دون أي ضمان.