Обойти аутентификацию или авторизацию

55

Многие веб-серверы имеют встроенные возможности разграничения доступа. Простейший пример — это ограничить доступ админке (к директории admin). А при обращении к ней требовать от пользователя аутентифицироваться, используя Basic-аутентификацию. Большой плюс в том, что разграничение доступа реализуется только за счет возможностей веб-сервера. И не надо париться со скриптами, писать код какой-то…
Кроме этого, опять-таки большинство браузеров позволяют еще внедрять контроль HTTP-методов (они же verb). То есть можно ограничить доступ к какому-то объекту только по методу GET, а POST — разрешить, например, смотреть фильмы онлайн бесплатно. Это добавляет еще больше возможностей с точки зрения конфигурации. Но, как это часто и бывает, порождает целую прослойку конфигурационных уязвимостей. Что интересно, проблемы с настройкой несколько варьируются в зависимости от веб-сервера, и потому несколько классических примеров.
Есть сервер приложений J2EE, а в нем — web.xml со следующим содержанием:
< security - constraint>
< web - resource - collection>
< url - pattern>/admin/< /url - pattern>
< http - method>GET< /http - method>
< http - method>POST< /http - method> < /web - resource - collection>
< auth - constraint>
< role - name>admin< /role - name> < /auth - constraint> < /security - constraint>
Здесь все просто. Мы указываем, что доступ к директории admin разрешен только админам (о чем нам и сообщает указанная роль).
Проблема, я думаю, ясна. Здесь также перечислены методы, которые запрещены (то есть используются blacklist-правила). Заметно, что методов «не хватает». Как минимум, админчик позабыл метод HEAD. Это метод, по сути, эквивалент GET’a. С той лишь разницей, что сервер отвечает на него по-другому. Обрабатывает, но в ответ не посылает тело, только заголовок.
Таким образом, мы имеем возможность обойти проверку веб-сервера и обращаться к сервлетам, используя метод HEAD. Конечно, нам еще требуется, чтобы в этой директории мы могли сделать что-то «страшное», используя только HEAD, но это уже совсем зависит от конкретного приложения. К тому же на нашей стороне еще и тот факт, что в яве ОЧЕНЬ часто сервлеты не различают GET и POST.
Пример номер два. Apeche + РНР. В нем валяется файл .htaccess с вроде бы нормальным ограничением на доступ только с определенного IP (предположим, что это админский IP). Остальные доступ получить не могут (см. пункт deny from all).
< Limit GET POST>
order deny,allow
deny from all
allow from 192.168.0.1
Конечно, ты можешь тут сразу отметить, что отсутствует метод HEAD. Но нет, это здесь не сработает, так как Apache по умолчанию блокирует HEAD, если GET запрещен.
Зато другие особенности нам помогут. Во-первых, Apache, когда в конфигурационных файлах используется директива Limit, обрабатывает только известные ему методы запросов (GET, HEAD, POST, TRACE, PUT и так далее, полный список смотри здесь :..- Iy/150z22). Неизвестные методы он переправляет на уровень выше — приложению, обрабатывающему запрашиваемый файл (например, РНР).
Таким образом, ограничения не действуют на эти кастомные методы. Но еще интересней второе. По умолчанию РНР, когда видит неизвестный ему метод, воспринимает и обрабатывает его как GET.
Обобщая сказанное, мы видим, что Apache и РНР создают смесь, которая дает нам простую возможность обойти ограничения эпача. Все, что требуется, так это обращаться напрямую к PHP-скриптам, используя нестандартный HTTP-метод. Webscarab или Burp отлично подойдут для автоматической подмены метода.
Логичный DOS
Маленькая задачка про атаку «из дедушкиного сундука». Она сверхпроста, но прикольна в своей идее — для обучения правильному ходу мышления. Название атаки — Land.
Суть ее в том, чтобы указать один и тот же адрес и порт (IP нашей жертвы) в пакете. Таким образом, когда данный пакет попадет к жертве, она на него ответит, но при этом ответит сама себе. Итог — пакеты, которые так и не могут обработаться сетевым стеком, приводят к DoS’y всего хоста.
Некогда эта проблема была во многих ОС и девайсах, включая Windows ХР и продукты Cisco. Хотя и сейчас, я думаю, можно найти такие косяки в каких-нибудь embedded — устройствах или промышленных контроллерах…