
CakePHP 5.4.2 - عالي - عن بُعد - CRLF - مرفق Content-Type و Content-ID المتبقي
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · cakephp-attachment-crlf
الفئة: حقن ترويسة جزء MIME الوصول: عن بُعد
CakePHP 5.4.2 (887b641) - Cake Software Foundation
الإصدار 5.4.2 يزيل بالفعل " و \r و \n من name= / filename= متعدد الأجزاء (FormDataPart::_headerParameterToString). هذا هو الضابط. تم ترك Content-Type و Content-ID كدمج خام. Message::setAttachments ينسخ نوع الوسائط الخاص بعميل UploadedFile إلى حقل النوع هذا دون مرشح إضافي.
التطبيق الذي يرفق تحميلاً من المستخدم، أو الذي يمرر contentId من المستخدم، يضع تلك البايتات على جزء MIME. ثم يُظهر getBodyString() سطر ترويسة ثانياً تحت ذلك الجزء.
| المعرّف | لا يوجد CVE بعد |
| الفئة | حقن ترويسة جزء MIME |
| الوصول | عن بُعد (تطبيق يرفق تحميلاً من المستخدم أو contentId من المستخدم) |
| CWE | CWE-93 |
| CVSS | متوسط: 5.4 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:N |
| المنتج | CakePHP |
| المتأثر | 5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63) |
| المصادقة | تطبيق يرفق تحميلاً من المستخدم (نوع MIME الخاص بعميل UploadedFile) أو contentId من المستخدم |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1 فقط |
من يستطيع التأثير على بيانات وصفية للمرفقات يمررها التطبيق إلى Message::setAttachments / addAttachment يمكنه حقن ترويسات أجزاء MIME.
| الصلاحية | الطريقة / نقطة الوصول | النوع | مُثبت مختبرياً أو مُستنتج |
|---|---|---|---|
سطر ترويسة Content-Type إضافي | setAttachments مع 'mimetype' => "text/plain\\r\\nX-Injected: …" | سلامة ترويسات جزء MIME | مُثبت مختبرياً. سطر الشاهد موجود |
سطر ترويسة Content-ID إضافي | 'contentId' => "cid@…>\\r\\nX-Injected: …" (جزء مضمّن) | سلامة ترويسات جزء MIME | مُثبت مختبرياً. سطر الشاهد موجود |
| نفس الحقن عبر MIME الخاص بالتحميل | UploadedFile::getClientMediaType() يُنسخ إلى mimetype | سلامة ترويسات جزء MIME | مُثبت مختبرياً. سطر الشاهد موجود |
filename= CRLF | اسم مرفق يحتوي CR/LF | مُغلق | مُثبت الإغلاق مختبرياً. إزالة 5.4.2 صامدة |
RCPT الخاص بالمظروف / Bcc عبر نقطة الوصول هذه | ترويسات جزء MIME في النص | مُغلق | هذا إزالة زوجية خاصة بـ SmtpTransport فقط، وهو شقيق |
| إرسال SMTP | المختبر يستدعي getBodyString() فقط | مُغلق | لا ناقل، لا shell |
مُستنتج من نفس الدمج، غير مُبرهن: نوع أو contentId مُصمم يتضمن حداً متعدد الأجزاء قد يقسم الرسالة إلى أجزاء إضافية في MUA مستقبِل. لم أرسل بريداً.
بقايا نفس التثبيت: window SQLi، collate SQLi، cache unserialize.
ثبّتت cakephp/cakephp 5.4.2 بعد ملاحظة المخبز أن حقن filename= في Content-Disposition متعدد الأجزاء قد تم إصلاحه. _headerParameterToString هو المُطهّر:
$transliterated = Text::transliterate(str_replace(['"', "\r", "\n"], '', $value));
__toString() لا يزال يفعل:
if ($this->type) {
$out .= 'Content-Type: ' . $this->type . "\r\n";
}
if ($this->contentId) {
$out .= 'Content-ID: <' . $this->contentId . ">\r\n";
}
Message::setAttachments ينسخ نوع عميل التحميل دون إزالة. ثم يستدعي attachFiles / attachInlineFiles كلاً من $part->type($fileInfo['mimetype']) و $part->contentId($fileInfo['contentId']).
منعطفات خاطئة مسجلة بالفعل: معاملة RCPT الخاص بالمظروف كأنه هذه البقية (السطر الإضافي في النص)؛ الادعاء بأن filename= لا يزال يحقن (إنه لا يفعل)؛ إرسال SMTP؛ reverse shell. مسرح.
python3 cakephp-attachment-crlf-Abraxas-Labs.py
أو
cd lab
./run.sh
استهدف فقط http://127.0.0.1:19460. PHP 8.3، وسم CakePHP 5.4.2 مُستنسخ عند البناء. lab_server.php يكشف Message::setAttachments. أربع حالات: ضابط filename، mimetype، contentId، نوع وسائط UploadedFile.
SUCCESS cakephp-attachment-crlf how=live pin=5.4.2 sha=887b641de9f7aba06071f98f17edcbc573cbcf63 mimetype=yes contentId=yes upload=yes filename-stripped=yes CAKEPHP-ATTACHMENT-CRLF-WITNESS
مرّر type و contentId و transferEncoding عبر نفس إزالة " / \r / \n كما في _headerParameterToString. ارفض القيمة إذا كانت لا تزال تحتوي على فاصل أسطر بعد الإزالة. غطِّ MIME الخاص بعميل UploadedFile و mimetype / contentId الصريحين في اختبارات البريد، وليس filename= فقط.
887b641de9f7aba06071f98f17edcbc573cbcf63)FormDataPart.php · Message.phpfilename= في مخبز 5.4.2GNU Affero GPL v3.0. انظر LICENSE. مختبر loopback فقط. لا ضمان.