Неосмотрительное использование плагина jQuery-File-Upload делает многие сайты уязвимыми
В плагине jQuery-File-Upload выявлена поучительная уязвимость CVE-2018-9206, показавшая удивительную беспечность web-разработчиков и web-администраторов. jQuery-плагин jQuery-File-Upload предоставляет функциональный web-виджет для организации загрузки файлов на сайты, поддерживающий групповую загрузку, индикатор прогресса и возобновление прерванных загрузок. Основная функциональность jQuery-File-Upload реализована на JavaScript и выполняется на стороне браузера, при этом в состав также входит набор примеров серверных обработчиков для сохранения отправляемых файлов.
Суть уязвимости в том, что в предлагаемых серверных обработчиках полностью отсутствовали фильтры для блокирования загрузки потенциально опасных типов контента и загружаемые файлы сохранялись на сервере под исходным именем, которое определял пользователь на сайте. Данные загружались в каталог "./files" находящийся в рабочей иерархии каталогов web-сервера. Таким образом, при использовании предлагаемых сервреных обработчиков, пользователь мог сохранить любые типы файлов, например, "text.php", который сохранялся в публчно доступной директории и становился видимым для внешних запросов (например, его можно было получить запросив "http://test.ru/files/test.php").
В ситуации, если на сайте используется PHP и включено выполнение php-файлов во всей иерархии каталогов, подобный запрос без должного ограничения доступа к каталогу "./files" приводил к выполнению кода сохраненного в файле test.php скрипта на стороне сервера, что позволяло полностью получить контроль за сайтом. Основной ошибкой разработчика jQuery-File-Upload стало то, что он не стал ограничивать допустимые для сохранения типы файлов, а попытался включить в поставку ".htaccess", устанавливающий обработчик по умолчанию ("SetHandler default-handler" "ForceType application/octet-stream").
Разработчик jQuery-File-Upload почему-то полагал, что на всех web-серверах включена обработка ".htaccess" и активен модуль mod_headers. В обсуждении разработчик дополнения попытался оправдаться, что на момент написания плагина по умолчанию в Apache httpd для всех каталогов выставлялась опция "AllowOverride All", но начиная с выпуска 2.3.9 она была незаметно заменена на "AllowOverride None".
Но данное объяснение не выдерживает критики, так как ветка 2.3.x являлась тестовой и сама по себе не использовалась на практике, а выступала основой для формирования следующего значительной ветки Apache httpd 2.4, в которой указанное поведение было документировано и преподносилось как одно из изменений для повышения безопасности и производительности. Кроме того, решение о включении или отключении по умолчанию ".htaccess" всегда лежало на операторах хостинга и мэйнтейнерах пактов в дистрибутивах, поэтому и во времена до появления Apache httpd 2.4 нельзя было с уверенностью утверждать, что.htaccess везде будет работать.
В итоге, плагин jQuery-File-Upload был включен в состав сотен web-приложений и дополнений к системам управления web-контентом, и лишь единицы догадались ограничить список допустимых для загрузки файлов. В настоящее время на GitHub репозиторий jQuery-File-Upload насчитывает 7843 форков, проверка 1000 из которых показала, что лишь 36 содержат должные исправления, блокирующие уязвимость.
Судя по всему, проблема уже давно известна в кругах атакующих, так как в сети найдено несколько руководств, первое из которых датируется 2015 годом, с демонстрацией взломов тех или иных систем через загрузку php-файла и его последующего открытия из каталога "./files". Всем web-мастерам рекомендуется срочно проверить наличие блокировки доступа к каталогу "./files" для внешних запросов и при необходимости внести изменения, отключающие выполнение PHP-скриптов в данной директории, на уровне настроек web-сервера.