безопасность для заголовков http - PullRequest
3 голосов
/ 22 ноября 2011

Мы бы хотели еще раз проверить наши http-заголовки на предмет безопасности, прежде чем отправлять их. Очевидно, что мы не можем допустить появления '\ r' или '\ n', так как это может позволить внедрение содержимого.

Я вижу только два варианта:

  1. Сократить значение символа новой строки.
  2. Убрать недопустимый символ из значения заголовка.

Кроме того, из чтения RFC2616 кажется, что только значения ascii-printable допустимы для значений заголовка http. Должен ли я следовать той же политике для других 154 возможных недействительных байтов?

Или, существует ли какой-либо авторитетный уровень техники по этому вопросу?

Ответы [ 3 ]

4 голосов
/ 22 ноября 2011

Эта атака называется «разбиение заголовка» или «разбиение ответа» .

Эта ссылка OWASP указывает на то, что удаления CRLF недостаточно.\n может быть столь же опасным.

Чтобы смонтировать успешный эксплойт, приложение должно разрешить ввод, содержащий CR (возврат каретки, также заданный 0x0D или \ r) и LF (перевод строки,также задается 0x0A или \ n) символами в заголовке.

(я не знаю, почему OWASP (и другие страницы) перечисляют \n как уязвимость или относится ли это только к фрагментам запроса до-decode.)

Обслуживание 500 при любой попытке установить заголовок, который содержит символ, недопустимый спецификацией в ключе или значении заголовка, вполне разумно и позволит вам идентифицировать оскорбительные запросы в ваших журналах.,Быстрый отказ, если вы знаете, что ваши фильтры выходят из строя, - это хорошая политика.

Если язык, на котором вы работаете, позволяет, вы можете заключить объект ответа HTTP в тот, который вызывает исключение, когда виден плохой заголовокили вы можете изменить объект ответа, чтобы ввести недопустимое состояние, установить код ответа 500 и закрыть поток тела ответа.

РЕДАКТИРОВАТЬ:

Должен ли я удалить не-Входные данные ASCII?

Я предпочитаю выполнять такую ​​нормализацию в слое, который получает доверенные входные данные, если, как в случае с экранированием сущностей для преобразования простого текста в экранирование HTML, нет явногопреобразование типов.Если это преобразование типов, я делаю это, когда требуется тип вывода, но если это не преобразование типов, я делаю это как можно раньше, чтобы все потребители данных этого типа увидели согласованное значение.Я считаю, что такой подход упрощает отладку и документирование, поскольку слоям ниже обработки ввода не нужно беспокоиться о ненормализованных входных данных.

При реализации обертки ответа HTTP я могу заставить ее работать на всех несимволы ascii (включая не ASCII-символы новой строки, такие как U + 85, U + 2028, U + 2029), а затем убедитесь, что мои тесты приложений включают тест для каждого стороннего ввода URL-адреса, чтобы убедиться, что все заголовки Location имеют правильные значения%-кодированный до того, как местоположение достигнет setHeader, и аналогично для других входов, которые могут достигать заголовков запроса.

Если ваши куки содержат такие вещи, как идентификатор пользователя или адрес электронной почты, я бы позаботился о том, чтобы фиктивные учетные записитесты включают фиктивную учетную запись с идентификатором пользователя или адресом электронной почты, содержащим не-ASCII-письмо.

3 голосов
/ 22 ноября 2011

Простое удаление новых строк \n предотвратит HTTP Response Splitting .Несмотря на то, что CRLF используется в качестве разделителя в RFC, только одна новая строка распознается всеми браузерами.

Вам все равно придется беспокоиться о пользовательском контенте в пределах set-cookie или content-type.Атрибуты в этих элементах ограничиваются с помощью ;, возможно, злоумышленник может изменить тип содержимого на UTF-7 и обойти защиту XSS для пользователей IE (и только пользователей IE).Злоумышленник также может создать новый файл cookie, который предоставляет возможность фиксации сеанса.

0 голосов
/ 22 ноября 2011

В полях заголовка разрешены не-ASCII символы, хотя в спецификации не совсем ясно, что они означают;так что отправитель и получатель должны согласовать их семантику.

Что заставило вас думать иначе?

...