Перейти к основному содержанию
 

CTF — CRLF

CTF

Продолжаем решать задачки по информационной безопасности web-серверов. Сегодня задачка с портала root-me.org, называется "CRLF". За решение задачки дают 20 баллов, сложнее начального уровня.

ctf

CR — (carriage return) возврат каретки. LF — (line feed) перевод на строку. Последовательность CR+LF в программировании означает переход на новую строку и имеет специальный код в разных языках программирования:

  • CR — 0x0D, 13, '\r'.
  • LF — 0x0A, 10, '\n'.

По стандарту, любое совместимое с Юникодом приложение должно воспринимать как перевод строки каждый из нижеследующих символов:

  • LF (U+000A): line feed — подача строки;
  • CR (U+000D): carriage return — возврат каретки;
  • NEL (U+0085): next line — переход на следующую строку;
  • LS (U+2028): line separator — разделитель строк;
  • PS (U+2029): paragraph separator — разделитель абзацев.

Последовательность CR+LF надлежит воспринимать как один перевод строки, а не два.

Название задачки CRLF намекает нам на одноимённую уязвимость.

CRLF Injection (CRLF инъекция, Carriage Return Line Feed) — уязвимость , позволяющая злоумышленнику внедрить символы перевода строки в запрос, тем самым изменив логику работы программы.

Самый простой пример CRLF инъекции заключается в добавлении произвольных записей в лог-файлы. Это позволяет злоумышленникам маскировать свои действия в системе. В задании как раз требуется внедрить свои данные в лог аутентификации.

Ссылки

https://www.root-me.org

Решение

Переходим на страницу задания:

http://challenge01.root-me.org/web-serveur/ch14/

ctf

Присутствует форма с логином и паролем. Ниже для нашего удобства отображается лог аутентификации:

admin failed to authenticate.
admin authenticated.
guest failed to authenticate.

Видим что пользователь admin указал неверный пароль. Потом он успешно залогинился. После чего пользователь guest указал неверный пароль. Если попытаться залогиниться в форме с любым паролем (пусть будет "helloworld") под именем пользователя "internet-lab.ru", то в логе появится новая запись:

admin failed to authenticate.
admin authenticated.
guest failed to authenticate.
internet-lab.ru failed to authenticate.

При этом форма передаёт параметры в URL:

http://challenge01.root-me.org/web-serveur/ch14/?username=internet-lab.ru&password=helloworld

Пароль админа мы не знаем, но по заданию нам требуется подделать лог. Скорее всего от нас требуется дописать в лог строку, где говорится что admin успешно логинился:

admin authenticated.

Это можно сделать, если вставить символ перевода строки в имя пользователя, которое пишется в лог. Нам нужно сделать так, чтобы пользователя звали:

admin authenticated.
guest

Правим URL, перевод строки в URL пишется как "%0D%0A", имя пользователя получается "admin+authenticated.%0D%0Aguest". Формируем ссылку и переходим по ней:

http://challenge01.root-me.org/web-serveur/ch14/?username=admin+authenticated.%0D%0Aguest&password=helloworld

ctf

В лог удалось вставить нужный текст. А ниже нам на блюдечке подносят флаг: rFSP&G0p&5uAg1%

Валидируем.

ctf

Флаг подходит, зарабатываем 20 очков.

Безопасность

  • Здесь всё просто, нужно валидировать поля ввода и передаваемые пользователем переменные.
  • Проблема усугубляется тем, что символы перевода строки могут быть закодированы, например, в UTF-8.
  • Атака может быть скомбинирована с XSS.

Теги