
- •Http Request smuggling (Часть 2)
- •1. Двойной заголовок Content-Length
- •Техника hrs (Content-Length) №1
- •Техника hrs (Content-Length) №2
- •Техника hrs (Content-Length) №3
- •2. Запрос с заголовками “Transfer-Encoding: chunked” и “Content-Length:…”
- •Ibm WebSphere 5.1 и WebSphere 5.0
- •3. Техника “Двойной cr в http заголовке” (и техника “Заголовок sp”)
- •4. Запрос get с заголовком Content-Length (backward snuggling)
- •A. Прямая атака
- •B. Вариант атаки, требующий дополнительной вставки:
- •6. Преждевременное завершение запросов, чья длина тела превышает 48 kb
Техника 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, но, тем не менее, многое из рассказанного может быть применено в атаках на другие пары программ.