Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
HTTP Request smugglin2.docx
Скачиваний:
10
Добавлен:
08.07.2019
Размер:
34.7 Кб
Скачать

Техника hrs (Content-Length) №3

Кеш сервер использует первый заголовок Content-Length, в то время как веб-сервер использует второй заголовок Content-Length. Следующие кеш серверы, которые мы исследовали, используют первый заголовок Content-Length:

  • Squid 2.5stable4 (Unix)

  • Squid 2.5stable5(порт NT)

  • Oracle WebCache 9.0.2

Следующие из исследованных нами веб-серверов используют последний заголовок Content-Length:

  • BEA Systems WebLogic 8.1 SP1

Все три комбинации были проверены и показали свою уязвимость атакам HRS.

2. Запрос с заголовками “Transfer-Encoding: chunked” и “Content-Length:…”

Разбираясь с Apache 2.0.45, мы обнаружили, что он довольно интересно реагирует на такое сочетание заголовков. Запрос, полученный с обоими заголовками, воспринимается как имеющий блочное (chunked) тело.

[HTTP/1.1 не позволяет запросу иметь одновременно два заголовка: “Content-Length” и “Content-Encoding:chunked”].

Apache полностью прочитывает тело такого запроса и переделывает его в нормальный (не разбитый на блоки) запрос. По непонятным причинам Apache не добавляет собственный заголовок Content-Length и не удаляет существующий. В результате запрос направляется с первоначальным заголовкомContent-Length и без заголовка “Transfer-Encoded:chunked” и с телом, включающим все части первоначального запроса. Очевидно, что, используя этот феномен, можно скрыть запрос, отослав заголовок “Content-Length: 0″ и закодированное блоками тело со спрятанным запросом.

Данная атака проходит на Apache 2.0.45 и на следующих веб-серверах:

  • Microsoft IIS/6.0 и 5.0

  • Apache 2.0.45 (как веб-сервер) и Apache 1.3.29

  • Jakarta Tomcat 5.0.45 (Coyote/1.1), Tomcat 4.1.24 (Coyote /1.0)

  • Ibm WebSphere 5.1 и WebSphere 5.0

  • BEA Systems WebLogic 8.1 SP1

  • Oracle9iAS 9.0.2

  • Sun Microsystems SunONE web server 6.1 SP1

Необходимо отметить, что поведение Apache в этом случае очень странное, так как запросы, которые он создает по умолчанию, не имеют заголовка Content-Length и поэтому они могут вызывать проблемы при обработке на многих веб-серверах (которые в этом случае принимают значение Content-Length за 0). А когда нормальный запрос с заголовком Transfer-Encoded: chunked посылается через Apache, он доставляется веб-серверу как запрос с нормальным телом, но без Content-Length, что приводит к полному игнорированию тела запроса на большинстве веб-серверов.

3. Техника “Двойной cr в http заголовке” (и техника “Заголовок sp”)

[Прим. CR - возврат каретки. SP - пробел.]

Эта техника использует ошибку в обработке HTTP запроса. Строка заголовка с единственным символом CR, следующая за последовательностью CRLF, обрабатывается некоторыми программами как строка HTTP заголовка, а другими как маркер конца заголовков.

[Прим. HTTP/1.1 не позволяет использовать такие строки в HTTP запросах.]

Чтобы использовать данную технику атаки нам необходимо применить еще одну технику. Эта техника использует ошибку под названием “Заголовок SP”. Техника “Заголовок SP” применяется, когда разные программы по-разному обрабатывают HTTP заголовки, имеющие пробелы между именем заголовков и символом “:”.

Некоторые программы воспринимают “foo SP:” как заголовок с именем “foo”, тогда как другие - как заголовок с именем “foo “ (”foo” с добавленным пробелом). Атака, которую мы опишем ниже, использует обе эти техники.

Позвольте начать с техники использования запроса с двойным CR в строке заголовка:

PCCA рассматривает этот запрос как имеющий заголовок “CR” и поэтому не заканчивает блок заголовков. IIS/5.0 же завершает блок заголовков, но при определенных условиях, которые мы обсудим позже.

Техника “Заголовок SP” нужна для того, чтобы обойти желание PCCA отправлять запросы с телом через новое TCP соединение, а также, чтобы IIS не отклонял запросы с двумя заголовками Content-Length.

Основная идея атаки заключается в следующем:

1 GET http://SITE/foobar.html HTTP/1.0 2 Connection: keep-alive 3 [CR] 4 GET /poison.html?aaaa … aaa [2048 times] HTTP/1.0 5 Content-Length: N 6 Content-Length : 0 7 8 GET http://SITE/page_to_poison.html HTTP/1.0 9

Где N - это длина запроса на URL “http://SITE/page_to_poison.html” (строки 8-9), отправленного PCCA веб-серверу как проверенный запрос.

PCCA воспринимает строки 1-7 как первый запрос. Это GET запрос с Content-Length равным 0 (запомните, что PCCA обрабатывает два заголовка Content-Length: один в строке 5, а второй в строке 6. Заголовок строки 6, содержащий технику “Заголовок SP”, нестандартный, потому что содержит дополнительный пробел после имени заголовка. Тем не менее, PCCA все также обрабатывает эту строку как заголовок Content-Length. Так как PCCA использует последнее значение заголовка, то в данном случае он использует значение 0). Следовательно PCCA отправляет строки 1-7 веб-серверу как единый HTTP запрос.

Заметьте, что PCCA заменяет CR CRLF на CR CR CRLF. Но это не влияет на нашу атаку. IIS/5.0 обрабатывает полученные данные как первый запрос (строки 1-3), а остальные данные как второй запрос, но уже незавершенный (строки 4-7). Первый запрос заканчивается CRLF CR CR CRLF. Интересное поведение IIS/5.0 заключается в том, что он следующие полученные данные TCP соединения пытается обработать как HTTP заголовок. Таким образом, если в следующих 2048 байтах он найдет символ “:”, тогда последовательность CRLF CR CR CRLF не будет рассматриваться как маркер конца заголовков. Вот почему нам необходимо 2048 символов “a”. А так как IIS не находит двоеточие, то обрабатывает строки 4-7 как новый HTTP запрос (и конечно отсылает обратно ответ на первый запрос). Строки 4-7 представляются в виде GET запроса с Content-Length N (строка 6 игнорируется, так как IIS не воспринимает Content-Length с пробелом). И теперь IIS ожидает, когда данный запрос будет завершен.

Возвращаемся к PCCA. Он получил ответ на первый GET запрос, и поэтому PCCA направляет следующий запрос (на страницу page_to_poison.html) - строки 8-9. Теперь IIS получает недостающие N символов тела второго запроса (на poison.html), и теперь запрос может быть полностью обработан. PCCA получает контент страницы /poison.html на запрос страницы /page_to_poison.html. Отравление кеша успешно завершено.

Эта техника была нами протестирована на PCCA и ISS/5.0, но, тем не менее, многое из рассказанного может быть применено в атаках на другие пары программ.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]