воскресенье, 29 ноября 2020 г.

Безопасности пост... или безисходности

        В последнее время я все чаще понимаю насколько херово обстоят дела с безопасностью в небольших компаниях, где сервера расположены не в приватной сети а имеют белые адреса. Наличие приватной сети конечно ничего не гарантирует, всегда остаются другие способы ломануть тебя. Если твои программисты слабо понимают что такое SQL-injection, XSS и прочие - значит таких дыр у вас в избытке. Вы просто об этом пока не знаете. Но как только компания растет и становится более заметной - жди сюрпризов. В общем сегодня у меня вечер грустных историй.

           История номер 1: Жила была форма загрузки документов, где-то в жопе админки. Написана хер знает когда и хер знает кем. Она была защищена паролем. Но потом добавили модный self-onboarding, и любой хмырь теперь может создать аккаунт и получить доступ к админке. Но ее конечно никто на уязвимости не проверял. Ей же только "свои" пользуются. Выяснилось что если через эту форму загрузить файл image.jpg.php то форма считает его картинкой, а веб сервер - выполняемым PHP файлом. А потом ты просто загружаешь вместо документа файл с одной единственной строчкой: <?=`$_POST[1]`?> И вуаля - remote code execution и сервер у тебя в кармане. Можешь делать с ним все что хочешь

            История номер 2: мало кто знает/помнит, но у FPM протокола нет авторизации.  И если вы ненароком написали в конфиге PHP-FPM listen=0.0.0.0:9000 или просто listen=9000 то это равнозначно: 


  Так как никакой авторизации нет, ничего не мешает сделать запрос к примеру к /usr/local/lib/php/PEAR.php.  PHP-FPM ничего не знает про root directory. Все эти ограничения проверяются на уровне веб сервера(Nginx). А если ты эту проверку обходишь - ты можешь делать все что тебе заблагорассудится. Доступ к PEAR - это полноценный remote code execution. Только shell за тебя заботливо предустановлена системным администратором. 
          Но мы то думаем что мы все умные, и не будем php-fpm вешать на внешний порт. Мы будем unix socket использовать. Ну или 127.0.0.1 на крайний случай. Но тут на помощь нам приходит Мистер Докер! 

Почти как Мистер Пропер, только наоборот. Мистер Docker понятия не имеет что он запускает. То есть если кто-то внутри контейнера развернул php-fpm который принимает запросы от всех подряд а потом прокинул этот порт наружу - мы снова получаем 

Мораль сей басни такова: 
  • Держи все сервера за высоким забором/VPN. Иначе хер уследишь
  • Проверяй что тебе загружают. Даже если форма доступна только для "своих"
  • Держи то что загружено - на отдельном домене, где нет никакого выполнения PHP кода. Пусть на этом домене все отдается как статика. Это и для производительности не плохо, и для безопасности. В таком случае даже если к тебе загрузят гавно - они смогут его только обратно скачать и ничего более

Комментариев нет:

Отправить комментарий