The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Неосмотрительное использование плагина jQuery-File-Upload делает многие сайты уязвимыми

23.10.2018 22:27

В плагине jQuery-File-Upload выявлена поучительная уязвимость CVE-2018-9206, показавшая беспечность web-разработчиков и web-администраторов. jQuery-плагин jQuery-File-Upload предоставляет функциональный web-виджет для организации загрузки файлов на сайты, поддерживающий групповую загрузку, индикатор прогресса и возобновление прерванных загрузок. Основная функциональность jQuery-File-Upload реализована на JavaScript и выполняется на стороне браузера, при этом в состав также входит набор примеров серверных обработчиков для сохранения отправляемых файлов.

Суть уязвимости в том, что в предлагаемых серверных обработчиках полностью отсутствовали фильтры для блокирования загрузки потенциально опасных типов контента и загружаемые файлы сохранялись на сервере под исходными именами, которые определял пользователь на сайте. Данные загружались в каталог "./files", находящийся в рабочей иерархии каталогов web-сервера. Таким образом, при использовании предлагаемых серверных обработчиков, пользователь мог сохранить любые типы файлов, например, "test.php", которые сохранялись в публично доступной директории и становились видимыми для внешних запросов (например, загруженный "test.php" можно было получить запросив "http://example.com/files/test.php").

В ситуации, если на сайте используется PHP и включено выполнение php-файлов во всей иерархии каталогов, подобный запрос без должного ограничения доступа к каталогу "./files" приведёт к выполнению кода скрипта, сохранённого в файле test.php, на стороне сервера, что позволит полностью получить контроль за сайтом. Основной ошибкой разработчика jQuery-File-Upload стало то, что он не стал ограничивать допустимые для сохранения типы файлов, а попытался включить в поставку ".htaccess", отключающий выполнение PHP-файлов через возврат обработчика по умолчанию ("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-мастерам сайтов с формами загрузки на базе jQuery-File-Upload рекомендуется проверить наличие блокировки доступа к каталогу "./files" для внешних запросов и при необходимости внести изменения, отключающие выполнение PHP-скриптов в данной директории, на уровне настроек web-сервера.

  1. Главная ссылка к новости (https://blogs.akamai.com/sitr/...)
  2. OpenNews: Релиз новой стабильной ветки http-сервера Apache 2.4
  3. OpenNews: Вредоносное ПО организует майнинг криптовалют на серверах с незакрытыми уязвимостями
  4. OpenNews: Уязвимость, позволяющая удалённо выполнить код на сервере PHP-репозитория Packagist
  5. OpenNews: Около 390 тысяч сайтов оставили открытыми каталоги .git с кодом
  6. OpenNews: Зафиксирована массовая атака на сайты с необновлённым движком WordPress
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/49483-php
Ключевые слова: php, security
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (49) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.2, Jehy (?), 22:44, 23/10/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • +5 +/
    Удивительно одно - идиотизм людей, которые на полном серьёзе рассказывают эту школьную историю по всему интернету.
     
     
  • 2.14, Электрон мастдай (?), 02:15, 24/10/2018 [^] [^^] [^^^] [ответить]  
  • –11 +/
    Удивительно одно - идиотизм людей, которые тянут js библиотеку на несколько мегабайт вместо того, чтобы написать одну строчку на html.
     
     
  • 3.25, Ононимко (?), 08:39, 24/10/2018 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Давай, г-ній JS, покажи-ка нам эту самую заветную одну строчку на html, функционально торжественную плагины.
     
     
  • 4.57, annual slayer (?), 04:30, 09/11/2018 [^] [^^] [^^^] [ответить]  
  • +/
    плагины в функционально-торжественном стиле

    доступны также повседневные плагины и плагины выходного дня

     
  • 3.26, Аноним (26), 08:40, 24/10/2018 [^] [^^] [^^^] [ответить]  
  • +4 +/
    И как же одной строчкой на html сделать закрузчик множественных файлов с индикатором?
     
     
  • 4.38, Аноним (38), 11:17, 24/10/2018 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Множественные загрузки возможно, а «индикатором» будет браузер ¯\_(ツ)_/¯
     
     
  • 5.47, captcha 20168 (?), 12:36, 24/10/2018 [^] [^^] [^^^] [ответить]  
  • –1 +/
    действительно
    https://caniuse.com/#search=multiple
     
  • 3.27, Аноним (27), 09:03, 24/10/2018 [^] [^^] [^^^] [ответить]  
  • +3 +/
    > Удивительно одно - идиотизм людей, которые тянут js библиотеку на несколько мегабайт

    Дыра в примерах на php, python и go, а не в JS. Ты, кстати, свое коронное "вспомнити leftpaf" еще забыл.

     

  • 1.3, Григорий Федорович Конин (?), 22:49, 23/10/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • +11 +/
    А при чем тут js-мирок, если виноваты во всём серверные обработчики?
     
     
  • 2.15, Аноним (15), 04:49, 24/10/2018 [^] [^^] [^^^] [ответить]  
  • –2 +/
    Похапешники: Мы не виноваты! Это JS-ребята психологически манипулировали нами и подсунули нам уязвимый код в своей документации.

    Опеннет: Похапешники не виноваты! Вспомнити leftpad. ОЧЕВИДНО, что проблема в JS. Необдуманное использование именно JS-плагина к JS-фреймворку с психологическим давлением на похапешников!

     
     
  • 3.23, Аноним (23), 08:15, 24/10/2018 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Это не жс и не пхпшники, это просто идиоты, писавшие код на стороне сервера. В следующий раз они на чём-нибудь другом сохранят пользовательский файл, как исполняемый модуль, в ветке исполнения. Антрастед юзер-инпут - не, не слышали.
     
     
  • 4.33, уебмакак (?), 10:00, 24/10/2018 [^] [^^] [^^^] [ответить]  
  • –1 +/
    это чего это вот "файл"? Мы и круче умеем, учись, шкoльник:

                    $strSql=
                            "SELECT ID, NAME, AGENT_INTERVAL, IS_PERIOD, MODULE_ID ".
                            "FROM b_agent ".
                            "WHERE ACTIVE='Y' ".
                            "       AND NEXT_EXEC<=now() ".
                            "       AND (DATE_CHECK IS NULL OR DATE_CHECK<=now()) ".
                            $str_crontab.
                            " ORDER BY SORT desc";

                    $db_result_agents = $DB->Query($strSql);
    [skip]
                            $eval_result = "";
                            eval("\$eval_result=".$arAgent["NAME"]);


    (кто не понимает - весь прикол в том, что тут не должно лежать ничего, кроме заранее определенных функций, но парсить их имена и вызывать по ссылке, убедившись что вызываемое действительно существует - не, слишком сложно для обизяна - eval, даже без try, и всех делов! При попадании в таблицу мусора или троянского кода - сам понимаешь - и хрен его кто потом найдет)

    завтра точно так же сложим в таблицу все что юзер навводил или ему навводили, и eval его.


     

  • 1.6, Аноним (6), 23:05, 23/10/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Поэтому надо пользоваться CMS, в которых URL не маппится напрямую в часть древа ФС, а парсится с помощью dispatch rules, или как они там у кого называются.
     
     
  • 2.7, sdf (?), 23:10, 23/10/2018 [^] [^^] [^^^] [ответить]  
  • +/
    routes
     
  • 2.30, istepan (ok), 09:20, 24/10/2018 [^] [^^] [^^^] [ответить]  
  • +/
    Не CMS, а тупо файлы отдавать через Nginx как статику, без всяких php и т.п. обработчиков.
     
     
  • 3.43, уебмакак (?), 11:55, 24/10/2018 [^] [^^] [^^^] [ответить]  
  • +2 +/
    это слишком сложно для типового девляпсика, у него КПИ горят, git clone, ansible-playbook -f 10000 , ляп, ляп, ляп.

    И практически невозможно для обычного юзера с недосайтиком на шареном помойкохостинге - он уже заплатил 500 рублей мне, за сайтик, и совсем не собирается платить еще 1500 в месяц за хостинг с нормальными настройками (да и кто настраивать будет? Мы-то могем в php, nodejs и еще вот, пихон. nginx - не могем)

     

  • 1.8, Аноним (8), 23:15, 23/10/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • +5 +/
    А с чего бы скрипту общего назначения что-то проверять по дефолту? Может ещё и сайт весь за разработчика написать?
     
     
  • 2.9, Аноним (9), 23:27, 23/10/2018 [^] [^^] [^^^] [ответить]  
  • –2 +/
    В конечном счёте фильтрами всё и исправили:

    https://github.com/blueimp/jQuery-File-Upload/commit/ad4aefd96e4056deab6fea269

    + 'accept_file_types' => '/\.(gif|jpe?g|png)$/i',

    В добавок и замену точек в имени файлов добавили:

    +         'replace_dots_in_filenames' => '-',
    +        // Replace dots in filenames to avoid security issues with servers
    +        // that interpret multiple file extensions, e.g. "example.php.png":

     
     
  • 3.24, Аноним (23), 08:17, 24/10/2018 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Выпал в осадок. Править в этом случае надо серверсайд.
     
  • 3.34, уебмакак (?), 10:05, 24/10/2018 [^] [^^] [^^^] [ответить]  
  • +4 +/
    ну вот, а вы ругались, что проблема в пехепе - видите же, автор все признал, покаялся перед партией и товарищами по цеху, и исправ...изуродовал свой скрипт так, чтобы альтернативно-одаренным жить стало проще. Странно, действительно, что не переименовал его в "jquery-jpsosmth-png-and-gif-only-upload".

    то есть если даже и не во всем виноват js, то разработчики на нем - все равно *даки, как ни поверни.

     

  • 1.10, koblin_ (?), 23:31, 23/10/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • +15 +/
    Это не забота плагина что-то фильтровать и почему он должен запрещать к загрузке какие-то типы файлов? Может пользователь хочет передать скрипт через шару. То что скрипты выполняются в директории для загрузки - это диагноз админу хоста.
    Проблема высосана
     
     
  • 2.59, mihacoder (?), 12:02, 21/01/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Точно. Считаю, что тот, кто ставит плагин к себе на сайт, и должен думать об этом. С другой стороны, разработчик плагина мог бы в документации указать на эту возможную опасность.
     

  • 1.11, Аноним (11), 00:17, 24/10/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • +11 +/
    В молотке найдена поучительная уязвимость, показавшая беспечность изобретателя: можно ударить по пальцу или даже уронить его на ногу. По умолчанию молоток бьёт бойком по всему, что под него попадает, не различая гвоздь это или конечность идиота!
     
  • 1.12, Алконим (?), 00:23, 24/10/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    7843 форков? Кто все эти люди?
     
     
  • 2.39, КО (?), 11:19, 24/10/2018 [^] [^^] [^^^] [ответить]  
  • +/
    Вы исправление видели?
    + 'accept_file_types' => '/\.(gif|jpe?g|png)$/i',
    Теперь всем тем, кому нужен будет pdf, придется делать форк. :)
     
     
  • 3.42, трурль (?), 11:36, 24/10/2018 [^] [^^] [^^^] [ответить]  
  • +/
    Поясните, плиз, куда именно воткнули это «исправление»? В жс код, в пример жс кода или в пример серверного обработчика?
    Бред какой, что «уязвимость», что новость.
     
     
  • 4.44, уебмакак (?), 11:56, 24/10/2018 [^] [^^] [^^^] [ответить]  
  • +/
    в конфиг его воткнули, сюрпрайз.
     

  • 1.13, Sw00p aka Jerom (?), 00:32, 24/10/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    SECURITY FIX: Only allow image file types by default.

    смешно, превратили в jQuery-Image-Upload

     
     
  • 2.36, пох (?), 10:15, 24/10/2018 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > смешно, превратили в jQuery-Image-Upload

    на самом деле - нет, "что настроишь, то и upload" - причем оно там всегда было, просто по умолчанию принимало все подряд, а теперь, для упрощения жизни альтернативно-одаренным, фильтр изначально выставлен в дурацкие имена картинок.

    Что говорит в пользу автора, #дак бы добавил антифильтр с .php, .php5, .php7, а потом "ой, а тут подсунули .py"
    Но вот трансляцию надо было сделать нормально, а не . на - менять.


    вообще-то хороший плагин, надо брать.

     

  • 1.16, Игорь С. (?), 05:14, 24/10/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    В статье 0 про nginx с fpm, который тоже напрочь не слушает .htacces и как то без этого отлично безопасно работает. Лучше бы написали, что держать аплоадер без авторизации это плохо и все.
     
  • 1.17, anonymous (??), 05:56, 24/10/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    files ? Хм. Ну так нужно специально сделать обработчик пути files для начала чтобы можно было так обратиться ...
     
  • 1.18, Аноним (18), 07:27, 24/10/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    это косяк не разработчика плагина. больше тянет на разработчиков apache и может админов
     
     
  • 2.20, ну (?), 07:52, 24/10/2018 [^] [^^] [^^^] [ответить]  
  • +7 +/
    по результатам голосования среди админов и разработчиков было решено, что виноват только автор плагина.
     
     
  • 3.37, 1 (??), 11:07, 24/10/2018 [^] [^^] [^^^] [ответить]  
  • +/
    автор apache же ... Он так злокозненно заменил умолчание в 2.4
     
     
  • 4.45, пох (?), 12:02, 24/10/2018 [^] [^^] [^^^] [ответить]  
  • +/
    > автор apache же ... Он так злокозненно заменил умолчание в 2.4

    ну что авторы нынешнего апача совсем плохие п-сы, никто и не сомневается. А вот зачем им люди все еще пользуются - понять не могу.

    (там прикол что None, которое  нынче ваш новый стандарт, вообще отключает чтение htaccess - то есть ошибку не выдает, а просто молча его игнорирует)


     

  • 1.21, Нанобот (ok), 07:58, 24/10/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    явная ошибка конфигурации веб-сервера, а крайним сделали разработчика плагина
     
     
  • 2.32, Аноним (15), 09:33, 24/10/2018 [^] [^^] [^^^] [ответить]  
  • –2 +/
    ты еще скажи, что электрон это круто. ЖС должен умерет
     

  • 1.22, Аноним (23), 08:13, 24/10/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > загружаемые файлы сохранялись на сервере под исходными именами

    Воистину, неискоренима тупость... Какие фильтры? Какие ошибки конфигурации?

    Сохранять пользовательские файлы под внутренним именем и делать связывание с пользовательским именем через БД или файл метаданных школоту так и не научили.

     
     
  • 2.41, Аноним (38), 11:29, 24/10/2018 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Шёл 21 век, ФС позволяла сохранять метаданные в себя…
     
     
  • 3.53, Аноним (53), 16:34, 25/10/2018 [^] [^^] [^^^] [ответить]  
  • +/
    Не надо метаданные в себя, ФС может оказаться разная.
     
     
  • 4.56, нах (?), 18:11, 25/10/2018 [^] [^^] [^^^] [ответить]  
  • +/
    > Не надо метаданные в себя, ФС может оказаться разная.

    давайте тогда и данные (вот все 48 мегапикселей фоточки салатика) сохранять в БД - "fs же может оказаться разная" (а не горе-девляпс, выбравший fs для хранения юзерских файлов, не умеющую хранить файлы, покидает нас в трех ботинках) - вдруг у нее размер файла три килобайта и ни байтом больше? А, и внутри файла могут быть только четные байты, а от нечетных она ломается.

     
  • 2.48, Аноним (48), 15:50, 24/10/2018 [^] [^^] [^^^] [ответить]  
  • –3 +/
    Да Интересно как это работает на высоко нагруженных серверах Что будет если ... большой текст свёрнут, показать
     
     
  • 3.54, Аноним (53), 16:35, 25/10/2018 [^] [^^] [^^^] [ответить]  
  • +/
    > Да ;) Интересно как это работает на высоко нагруженных серверах? Что будет если два пользователя одновременно захотят сохранить файл "Noname.txt"?

    Будут два файла abcd0001.dat и abcd0002.dat, и две записи в БД.

    Файл отдать можно например через mod_xsendfile, но с прослоечкой, которая подставит content-disposition с нужным файлнеймом.

     
     
  • 4.55, нах (?), 18:07, 25/10/2018 [^] [^^] [^^^] [ответить]  
  • +/
    > Будут два файла abcd0001.dat и abcd0002.dat, и две записи в БД.

    а если запись в бд по каким-то причинам пропала - мусор храним вечно, да?

    > Файл отдать можно например через mod_xsendfile, но с прослоечкой, которая подставит content-
    > disposition с нужным файлнеймом.

    вон сколько всего ненужно нужно сделать, чтобы подменить то, что файловая система изначально предназначена делать сама.

     

  • 1.28, ыы (?), 09:09, 24/10/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Количество интеллекта в мире- величина постоянная, а население растет... (с)

    Апач - не единственный веб-сервер на свете, и какая-то аргументация по поводу привязки плагина к .htaccess - просто абсурдна по сути. И со стороны автора и со стороны обвинителей.

    Что же до описания механизма уязвимости - то это какой-то паноптикум некомпетентности.

    Ждем продолжения :)

     
     
  • 2.50, пох (?), 22:25, 24/10/2018 [^] [^^] [^^^] [ответить]  
  • +/
    аффтар попытался подложить соломки, как умел, примерно предвидя уровень "админов", которые это будут настраивать.

    Но кунфу аффатаров апача оказалось круче, и они таки умудрились именно в тех местах, где гнездятся эти админы, поделить плохонькую защиту на ноль, безусловно, тоже ради заботы об альтернативно одаренных (всем остальным их поделка даром не нужна со времен убийства 1.3)

     
  • 2.52, Тот самый (?), 16:18, 25/10/2018 [^] [^^] [^^^] [ответить]  
  • +/
    >это какой-то паноптикум некомпетентности.

    Полностью согласен, особенно глядя на предлагаемые воркараунды

    По поводу идиотского ограничения загружать только image/*. Не удивлюсь если потом выяснится, что  в php включен fileinfo c libmagic и оно, увидев в начале .jpg файла волшебные строчки "<?php", проигнорирует расширение и замечательно отработает как php.

    Элементарное правило - отключение всех серверных хандлеров для каталогов, куда юзерам позволено загружать файло, не зависимо от расширения. Например, для Апача неужели сложно сделать
    <Directory "/uploads">
        php_flag engine off
        AllowOverride None
        Options None
        Require all granted
    </Directory>

    Либо в .htaccess
    php_flag engine off

     

  • 1.49, arisu (ok), 19:57, 24/10/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    в тексте новости досадная ошибка: не «беспечность», а «…зм».
     
  • 1.58, annual slayer (?), 04:34, 09/11/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    лихо говнокодеры всех дырявых пыхобэкендов попытались спрыгнуть, что фронтенд библиотека браузерная не проверяла тип файлов на опасность против их прелестного пыха
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру