Привет,
Хочу рассказать о поведении вебсерверов на не совсем обычные запросы и то, что код иногда обрабатывает их не так, как вы ожидаете на примере куска легаси кода.
Так же затрону очевидные прописные истины аналогичные "Почему вебсервер должен быть первой линией обороны" и "Почему вы должны знать все о вашей конфигурации".
Во время анализа кода одной CMS был обнаружен такой кусок кода. Что-то в нем сразу насторожило!
Как потом узнали у разработчиков, они считали что "Не может быть запроса" без метода. И поэтому оставили
Если что, правильный путь это проверять тип интерфейса через
И давайте посмотрим как можно оботи проверку, указанную выше.
Так как мофицировать код у нас нет прав, да и задачи такой нет, то будем смотреть на то, как это обрабатывается на стороне веб-сервера.
NGINX, lighttpd
Эти вебсерверы проверяют все согласно RFC (в основном
Apache
Но вот ребята из
Понимая это и зная что
Да, удивлению не было предела (если честно мы охренели). Действительно
Таким образом POC этого "0-Day" выглядит вот так
И так можно сбросить пароль главного админа, но это, как понимаете, только начало, если мы хотим что-то больше пенетратить
Обратившись к поиску, например по GitHub с запросом empty($_SERVER['REQUEST_METHOD, мы можем понять что так делают и количество упоминаний такой простой проверки 1M+.
И согласно февральского отчета 2018 года от Netcraft мы видим что у Apache подавляющее большинство серверов
Ах, да, про истины

Данная статья вполне может помочь в различных Bug Bounty программах и не только, так что дерзайте!
Фикс для конфигурации Apache простой и
Да, немного
P.S. Нашей инфраструкуре "повезло", так как Apache стоит за NGINX. Что и вам рекомендуем сделать, если вам приходится Apache поддерживать
Хочу рассказать о поведении вебсерверов на не совсем обычные запросы и то, что код иногда обрабатывает их не так, как вы ожидаете на примере куска легаси кода.
Так же затрону очевидные прописные истины аналогичные "Почему вебсервер должен быть первой линией обороны" и "Почему вы должны знать все о вашей конфигурации".
TL;DR; Apache из дефолтной конфигурации принимает все методы (Request method) и передает на сторону сервера приложения.
Во время анализа кода одной CMS был обнаружен такой кусок кода. Что-то в нем сразу насторожило!
Как потом узнали у разработчиков, они считали что "Не может быть запроса" без метода. И поэтому оставили
console mod
без авторизации, так как если у тебя есть доступ к SSH, то тебя уже мало что остановит. Соответсвенно все действия администратора можно провести без авторизации, если ты в console mode
.Если что, правильный путь это проверять тип интерфейса через
Ссылка скрыта от гостей
, но мы то знаем что каждый самый умный и знает как делать правильно 
Так как мофицировать код у нас нет прав, да и задачи такой нет, то будем смотреть на то, как это обрабатывается на стороне веб-сервера.
NGINX, lighttpd
Эти вебсерверы проверяют все согласно RFC (в основном
Ссылка скрыта от гостей
и
Ссылка скрыта от гостей
) и ничего лишнего не пропускают, выплевывая на запросы кроме тех, что разрешены ошибки. Как по мне -- использование white list в данной ситуации логично и правильно.



Apache
Но вот ребята из
Ссылка скрыта от гостей
решили иначе и из коробки пропускают все, что ты передашь как метод.
Понимая это и зная что
Ссылка скрыта от гостей
приступим к фаззингу. И после непродолжительной операции мы видим, что такую проверку можно забейпасить запросом curl -X0 ...
.Да, удивлению не было предела (если честно мы охренели). Действительно
0 (aka zero)
воспринимается Apache как пустой метод.Таким образом POC этого "0-Day" выглядит вот так
Bash:
curl -X 0 -v 'https://web.local/admin.php?...&user_id=1&user_data[password1]=NewP4ssw0rd&user_data[password2]=NewP4ssw0rd'

Обратившись к поиску, например по GitHub с запросом empty($_SERVER['REQUEST_METHOD, мы можем понять что так делают и количество упоминаний такой простой проверки 1M+.
И согласно февральского отчета 2018 года от Netcraft мы видим что у Apache подавляющее большинство серверов
Ссылка скрыта от гостей
.Ах, да, про истины
- "
вебсервер должен быть первой линией обороны
". Тут теперь надеюсь, стало еще понятнее после прочтения статьи. - "
вы должны знать все о вашей конфигурации
". А тут могу порекомендовать читать документации, следить за исследованиями, обновляться и не ставить "галку" автоматический режим. Описывайте вашу инфраструктуру в формате IaC (Infrastructure as Code), ведь хорошо что за окном 2k19 и есть множество инструментов для этого, подобных Salt/Ansible/Terraform.

Данная статья вполне может помочь в различных Bug Bounty программах и не только, так что дерзайте!
Фикс для конфигурации Apache простой и
Ссылка скрыта от гостей
как подсказывает
Ссылка скрыта от гостей
Apache-конфиг:
<LimitExcept GET POST HEAD>
Order deny,allow
Deny from all
</LimitExcept>
Ссылка скрыта от гостей
, но все-таки подавляющее большинство не конфигурируют сервера, а пользуются дефолтными конфигами.P.S. Нашей инфраструкуре "повезло", так как Apache стоит за NGINX. Что и вам рекомендуем сделать, если вам приходится Apache поддерживать

Последнее редактирование: