2009-05-15 4 views
8

Достаточно ли иметь [System.Web.Configuration.HttpRuntimeSection.EnableHeaderChecking] (http://msdn.microsoft.com/en-us/library/system.web.configuration.httpruntimesection.enableheaderchecking(VS.85).aspx) набор для true (по умолчанию), чтобы полностью предотвратить заголовок HTTP-инъекций, как Response Расщепление и т.д.?Is EnableHeaderChecking = true, чтобы предотвратить атаки Http Header Injection?

Я спрашиваю, потому что инструмент белого тестирования на проникновение ящик (подкрепиться) отчеты эксплуатационные вопросы инъекции заголовка HTTP с HttpResponse.Redirect и печеньем, но я не нашел способ успешно выполнить атаку (редактировать: .. и у нас есть EnableHeaderChecking включено ..).

ответ

6

Я смотрел на это в течение некоторого времени, и сделать вывод о том, что установка EnableHeaderChecking к true фактически является достаточно хорошим, чтобы предотвратить атаки инъекционного заголовка HTTP.

Глядя на «отражение» ASP.NET код, я обнаружил, что:

  1. Существует только один способ добавить пользовательские заголовки HTTP в ответ HTTP, а именно с использованием HttpResponse.AppendHeader метода
  2. HttpResponse.AppendHeader либо
    • создает экземпляры HttpResponseHeader (внутренний)
    • или вызывает HttpResponseHeader.MaybeEncodeHeader (для IIS7WorkerRequests)
    • или присваивает свои соответствующие свойства (для известных заголовков, как RedirectLocation или ContentType)
  3. HttpResponseHeader экземпляры, созданные до известных заголовки, как RedirectLocation или ContentType посылаются (HttpResponse.GenerateResponseHeaders)
  4. HttpResponseHeader конструктор проверяет настройки EnableheaderChecking и вызывает HttpResponseHeader.MaybeEncodeHeader при установке на true
  5. HttpResponseHeader.MaybeEncodeHeader правильно кодирует символы новой строки что делает попытки HTTP-заголовка инъекций невозможными

Вот фрагмент, чтобы примерно показать, как я тестировал:

// simple http response splitting attack 
Response.AddHeader("foo", "bar\n" + 
    // injected http response, bad if user provided 
    "HTTP/1.1 200 OK\n" + 
    "Content-Length: 19\n" + 
    "Content-Type: text/html\n\n" + 
    "<html>danger</html>" 
); 

выше работает только если вы явно включить EnableHeaderChecking выключить:

<httpRuntime enableHeaderChecking="false"/>

Fortify просто не принимает во внимание конфигурацию (настройки EnableHeaderChecking явно не имеет эффекта), и поэтому всегда сообщает об этих типах проблем.

+0

Привет, Йозеф, код для тестирования инъекции, который вы написали выше Мне нужно, чтобы мы могли вставить этот код для тестирования моего приложения. Мне также нужно проверить приложение. Thnx – alice7

0

EnableHeaderChecking только для непроверенных данных. Если вы передаете данные непосредственно из файла cookie в Redirect, возможно, полученные заголовки являются co neded trusted и \ r \ n значения не экранируются.

1

AFAIK достаточно, и его следует включить по умолчанию.

Я думаю, Fortify просто думать об обороне в глубине, как если бы вы изменили конфигурацию в развертывании и т.д.

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

Лучший способ подтвердить эксплуатирует его :)

  • Просто получить копию стельку
  • перехватывают запрос
  • Try вводить новую линию
  • Смотрите, если новая линия вы только что введенный в HTTP-ответ или нет.
+0

(: Поверьте мне, я попытался использовать это. И есть более эффективные инструменты, чем скрипач, лично мне нравятся Чарльз и надстройка Firefox Tamper Data. –

0

Josef, HttpResponse.AppendHeader() - это не единственное место, где ненадежные данные могут вводить заголовки ответов HTTP.

Любые данные от злоумышленника, попадающего в файлы cookie или переадресации HTTP, могут записывать новые заголовки, если данные содержат возврат каретки (или все, что интерпретируется как возврат каретки).

В целом, это намного лучше использовать ваше время для проверки ваших данных, чем сидеть и пытаться выработать подвига. Скорее всего, хакеры будут лучше в этом, чем вы или я.

+0

Для известных заголовков, таких как Cookies или перенаправления, ASP.NET уже имеет проверки (например, посмотрите на отраженный 'HttpResponse.Redirect'), но * custom * headers все проходят через AppendHeader. Конечно, мы делаем все возможное, чтобы проверять данные, но поскольку Fortify показал атаки на ответные атаки и другие, мы посмотрели на' EnableHeaderChecking'. –