
CakePHP 5.4.2 - عالي - عن بُعد - CRLF - مرفق Content-Type و Content-ID المتبقي
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · cakephp-attachment-crlf
التحليل المكتوب: https://abraxaslabs.tech/research/cakephp-attachment-crlf
الفئة: حقن ترويسات جزء MIME النطاق: عن بُعد
CakePHP 5.4.2 (887b641) - Cake Software Foundation
الإصدار 5.4.2 يزيل بالفعل " و\r و\n من name= / filename= في multipart (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 | مُثبت مختبريًا. سطر الشاهد موجود |
CRLF في filename= | اسم المرفق يحتوي CR/LF | مغلق | مُثبت مختبريًا أنه مغلق. إزالة 5.4.2 صامدة |
RCPT في المظروف / Bcc عبر نقطة الوصول هذه | ترويسات جزء MIME في النص | مغلق | ذلك هو إزالة SmtpTransport للزوج فقط، وهو مسار شقيق |
| إرسال SMTP | المختبر يستدعي getBodyString() فقط | مغلق | لا ناقل، لا shell |
مُستنتج من نفس الدمج، غير مُثبت: نوع أو contentId مصمم بعناية يتضمن حدًا (boundary) لـ multipart قد يقسم الرسالة إلى أجزاء إضافية في عميل بريد مستقبِل. لم أرسل بريدًا.
بقايا نفس التثبيت: window SQLi، collate SQLi، cache unserialize.
ثبّتُ cakephp/cakephp 5.4.2 بعد ملاحظة المخبز أن حقن filename= في Content-Disposition الخاص بـ multipart قد أُصلح. _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؛ وصدفة عكسية. مسرح.
python3 cakephp-attachment-crlf-Abraxas-Labs.py
أو
cd lab
./run.sh
استهدف فقط http://127.0.0.1:19460. PHP 8.3، CakePHP tag 5.4.2 مستنسخ عند البناء. lab_server.php يكشف Message::setAttachments. أربع حالات: التحكم باسم الملف، 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.2 bakeryGNU Affero GPL v3.0. راجع LICENSE. مختبر loopback فقط. دون أي ضمان.