
Drupal 11.4.8 - उच्च - रिमोट - अपलोड - CKEditor 5 इमेज अपलोड अभी भी FileIsImage को छोड़ देता है
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · drupal-ckeditor-fileisimage
राइट-अप: https://abraxaslabs.tech/research/drupal-ckeditor-fileisimage
वर्ग: अप्रतिबंधित अपलोड / संग्रहीत XSS पहुँच: रिमोट
Drupal core 11.4.8 (61044508) - Drupal
SA-CORE-2026-009 ने JSON:API और REST इमेज फ़ील्ड्स पर FileIsImage जोड़ा। CKEditor5ImageController::getImageUploadValidators अभी भी केवल FileExtension, FileSizeLimit, और FileImageDimensions लौटाता है। जब फ़ाइल एक वैध इमेज नहीं होती, तो FileImageDimensions बिना किसी उल्लंघन के लौट आता है। फ़ाइल नाम का एक्सटेंशन ही शेष जाँच है।
CKEditor 5 इमेज अपलोड वाले टेक्स्ट फ़ॉर्मेट का उपयोगकर्ता x.png नाम की गैर-इमेज बाइट्स को /ckeditor5/upload-image/{editor} पर POST कर सकता है और 201 के साथ एक सार्वजनिक फ़ाइल URL प्राप्त कर सकता है।
| ID | अभी तक कोई CVE नहीं |
| वर्ग | अप्रतिबंधित अपलोड / स्निफ़ किए जाने पर संग्रहीत XSS |
| पहुँच | रिमोट (प्रमाणित फ़ॉर्मेट उपयोगकर्ता) |
| CWE | CWE-434, CWE-79 |
| CVSS | मध्यम: 5.4 CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N |
| उत्पाद | Drupal core |
| प्रभावित | 11.4.8 (61044508071749629aaf3380aa85971e94df9e84) |
| प्रमाणीकरण | CKEditor 5 इमेज अपलोड वाले टेक्स्ट फ़ॉर्मेट का प्रमाणित उपयोगकर्ता (Standard पर basic_html / full_html) |
| लाइसेंस | GNU Affero GPL v3.0 |
| लैब | केवल 127.0.0.1 |
ऐसे खाते की आवश्यकता है जो ऐसे फ़ॉर्मेट का उपयोग कर सके जिसके एडिटर में image_upload.status true हो। Standard पर ये basic_html और full_html हैं। बिना खाते वाला पूर्ण अजनबी इस रूट तक नहीं पहुँच सकता (_entity_access: editor.use के साथ CSRF)।
| विशेषाधिकार | विधि / सिंक | प्रकार | लैब-प्रमाणित या अनुमानित |
|---|---|---|---|
sites/default/files/inline-images/ के अंतर्गत सार्वजनिक .png में गैर-इमेज बाइट्स लिखना | POST /ckeditor5/upload-image/{editor} multipart upload | अखंडता | लैब-प्रमाणित। x.png ने 201 और url=/sites/default/files/inline-images/x.png लौटाया |
| उन बाइट्स को सार्वजनिक फ़ाइल URL पर वापस पढ़ना | JSON url का GET | रेकॉन | लैब-प्रमाणित। 200, 49 बाइट्स, बॉडी में DRUPAL-CKEDITOR-FILEISIMAGE-WITNESS था |
| यदि वेब सर्वर या ब्राउज़र फ़ाइल को HTML/JS के रूप में स्निफ़ करे तो किसी विज़िटर में संग्रहीत XSS | वही सार्वजनिक URL, Content-Type इमेज नहीं | अखंडता (विज़िटर ओरिजिन) | अनुमानित। इस लैब ने Apache MIME नहीं बदला। Drupal ने बाइट्स संग्रहीत किए। |
| उसी रूट से एक वास्तविक इमेज अपलोड करना | नियंत्रण control.png 1x1 PNG | इच्छित | लैब-प्रमाणित। 201 |
इस अवशेष पर बंद: .php के माध्यम से PHP/RCE (लैब-प्रमाणित 422 FileExtension); बिना प्रमाणीकरण अपलोड; JSON:API/REST ImageItem (वे पथ पहले से ही FileIsImage जोड़ते हैं); LPE; डिफ़ॉल्ट इमेज-एक्सटेंशन अनुमति सूची पर एक शेल।
2026 SA-CORE लहर के बाद मैंने Drupal 11.4.8 को पिन किया। JSON:API पहले से ही अनुपस्थित कंस्ट्रेंट जोड़ता है:
if (\is_a($field_definition->getItemDefinition()->getClass(), ImageItem::class, TRUE) && !array_key_exists('FileIsImage', $validators)) {
$validators['FileIsImage'] = [];
}
REST FileUploadResource.php भी वही करता है। CKEditor 5 को फ़ाइलनाम + आकार + आयामों पर छोड़ दिया गया था:
return [
'FileExtension' => [
'extensions' => implode(' ', $allowed_extensions),
],
'FileSizeLimit' => [
'fileLimit' => $max_filesize,
],
'FileImageDimensions' => [
'maxDimensions' => $max_dimensions,
],
];
FileImageDimensionsConstraintValidator किसी उल्लंघन के बिना लौट आता है जब फ़ाइल एक वैध छवि नहीं होती। Hub drupal:11.4 को 11.4.9 पर तैरता छोड़ा गया था; यह पिन composer-सटीक drupal/recommended-project:11.4.8 है। 11.4.0 ने Standard से Article हटा दिया, इसलिए यह छवि इंस्टॉल के बाद core/recipes/article_content_type लागू करती है ताकि /node/add/article CKEditor 5 लोड करे।
पहले से दर्ज गलत रास्ते: FileImageDimensions को MIME जाँच मानना (यह एक वैध छवि पर आयाम हैं, और अन्यथा कोई प्रभाव नहीं); डिफ़ॉल्ट allowlist पर PHP शेल का दावा करना (.php 422 है); तैरते hub टैग का उपयोग करना और 11.4.9 को आते देखना। नाटक: एक reverse shell। Oracle नकली x.png पर 201 है और उन्हीं बाइट्स पर 422 है जिनका नाम x.php रखा गया हो।
वही पिन के अवशेष: oEmbed second-hop SSRF।
python3 drupal-ckeditor-fileisimage-Abraxas-Labs.py
या
cd lab
./run.sh
केवल http://127.0.0.1:19500 को लक्षित करें। php:8.4-apache-trixie, SQLite पर लाइव Drupal 11.4.8 Standard।
SUCCESS drupal-ckeditor-fileisimage png-http=201 php-http=422 control-png-http=201 editor=basic_html stored-http=200 stored-has-witness=yes url=/sites/default/files/inline-images/x.png DRUPAL-CKEDITOR-FILEISIMAGE-WITNESS
CKEditor5ImageController::getImageUploadValidators में 'FileIsImage' => [] जोड़ें। FileExtension को बनाए रखें ताकि .php 422 ही रहे। Media Library में इमेज मीडिया प्रकारों को सामान्य FileItem के बजाय ImageItem का उपयोग करना चाहिए ताकि उन्हें वही प्रतिबंध विरासत में मिले।
61044508071749629aaf3380aa85971e94df9e84)CKEditor5ImageController.phpGNU Affero GPL v3.0. देखें LICENSE. केवल लूपबैक लैब। कोई वारंटी नहीं।