Здравствуйте. В этой статье я рассмотрю площадку для тренировок в области web-хакинга “Practical Website Hacking”. 

Ссылка на площадку: http://ctf.infosecinstitute.com/ctf2/

Имеется 13 уровней (в списке можно выбрать любой), на каждом уровне дано задание. Отображается название уязвимости и её номер в OWASP-TOP10. Есть кнопка с подсказками.

Задания разные: XSS, LFI, CSRF, инъекции, работа с php, обход фильтров, blacklist и прочее. В общем, хорошо подойдёт тем, кто представляет, что такое уязвимости, но не имеет достаточно практики.

Level 1:

У нас есть форма для составления списка сайтов. С помощью XSS-уязвимости нужно вывести сообщение «Ex1». Ну что ж, начнём. Сначала введём корректные данные. Составляется список с названием и адресом. В одну из этих форм нужно подсунуть скрипт

Вставляем его в обе формы и отправляем, но увы, формат не подходит. Значит, есть проверка. открываем html-код сайта (правая кнопка мыши > исследовать элемент). Видим, что в названии сайта стоят разрешённые символы и максимальный размер, а в адресе сайта — тип url и тоже максимальный размер.

Есть несколько вариантов решения. Браузеры позволяют редактировать html «на лету» (на стороне клиента), чем мы и воспользуемся. Например, можно просто в атрибут pattern дописать символы <>, maxsize увеличить. или просто удалить эти атрибуты. И изменить тип url на text. Но мне больше нравится такой вариант: в основную форму можно добавить атрибут novalidate=»». Он отключает внутренние проверки на корректность данных.

Отправляем, ура. Скрипт висит на стене, но не обработан. Значит, html проверку преодолели, но есть ещё проверка. Изучаем html-код, видим ex1.js. В нём находим функцию замены спец.символов.

Chrome позволяет «на лету» редактировать и javascript, а в firefox можно скопировать весь скрипт и всунуть его в консоль, изменив «&gt;» и «&lt;» на «>» «<» соответственно. В итоге нажимаем кнопку, и наш скрипт срабатывает. После чего нас перебрасывает на след. уровень.

Кстати, xss срабатывает и в поле для названия, и для адреса.

Level 2:

Здесь у нас есть самодельный калькулятор. Нужно узнать версию php, и прочую информацию о сервере. Это можно сделать функцией phpinfo(). Приступим. Подставляем нормальные числа, потом пробуем буквы. Вроде бы работает правильно. Смотрим html, обращаем внимание на блок с арифметическими действиями. Помимо текста в них есть реальный оператор. Скорее всего, он передаётся в функцию на сервер (как говорит подсказка, там выполняется eval). В неё мы и будем внедряться. Переписываем операцию сложения.

Нажимаем — всё сработало. Отправляемся на третий уровень.

Level 3:

Форма для регистрации. Вбиваем, логинимся — видем строчку role: normal. По заданию мы должны зарегистрироваться, при этом с правами admin. Мы знаем, что данные о пользователе хранятся в файле, и используется некоторый разделитель. Это может быть , | || # и т.д. При этом порядок данных тоже может быть любой. Ну, будем перебирать в формате userXXX | admin

Сразу замечаем, что стоит ограничитель длины в полях username и password. Удаляем атрибут maxlength (или увеличиваем). Вбиваем поля, отправляем….и ошибка. Оказывается, проверка на длину стоит ещё и у них на сервере. Значит, остались только поля last name и email. Тыкаем, тыкаем, до, после, запятую, палку, слеш. Не срабатывает. Тогда открываю подсказку. И чёрт, подсказка говорит, что всё лежит в разных строчках. Ну, и опять несколько вариантов. Первый — удалить поле ввода и встроить новое (в которое можно вставлять несколько строчек).

Другой вариант, написать в строчку и перехватить Burp’ом, поставить ентер уже в нём. Далее регистрируемся, заходим и видим слово admin. Но ничего не случается. Тогда вспоминаем что вид был role:normal, поэтому делаем ещё одну попытку, уже добавляя role:admin. Попадаем в новый уровень.

P.S. пытался поставить просто в одну строчку символ переноса (%0A) — не сработало.

Level 4:

Текстовый файл подключается GET-параметром. Нужно «загрузить файл PHP, расположенный в корне infosecinstitute.com. Файл не должен существовать, но вы должны загрузить его без ошибок, и он должен иметь расширение .php».

Потыкав по формам, видим параметр file=file1.txt Пытаемся воткнуть php — выдаёт ошибку. ну, ладно. Сначала в корень надо попасть. ну, делаем запрос http://ctf.infosecinstitute.com/ctf2/exercises/ex4.php?file=http://infosecinstitute.com/file.txt

Выдаёт ошибку, что мы указываем на url. В таких фильтрах часто делают ошибку в регистрах. Посылаем такой запрос:

http://ctf.infosecinstitute.com/ctf2/exercises/ex4.php?file=htTp://infosecinstitute.com/file.txt

на .php стоит фильтрация, на .txt её нет. Тогда file.txt.php даёт нам победу.

Level 5:

Страница для авторизированных пользователей. Нам нужно с помощью «магии» залогиниться. Первая мысль — найти в куках параметр авторизации. Увы, мимо… Ладно. Видим, что Login выглядит как кнопка, но не нажимается. Открывает html. Это действительно кнопка с атрибутом disable. указывает на ссылку login.html. Пытаемся пройти по адресу — вновь провал. Тогда возвращаемся на наш пятый уровень, просто заменяя в Headers предшествующую ссылку на Referer: http://ctf.infosecinstitute.com/ctf2/exercises/login.html и всё сработало.

P.S. Для Firefox есть удобный плагин Modify Headers. Просто там пишешь, что такой-то заголовок постоянно изменять, добавлять, удалять.

Level 6:

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

Level 7:

Вновь XSS. Дана страничка для входа. На этот раз надо засунуть на страницу

Пробуем ввести что-нибудь — срабатывает действие. Смотрим html-код. Видим строчку

Сюда передаётся значение адресной строки. Попробуем в адресную строку прописать такие адреса:

Двойная кавычка не прошла, а вот одинарная выпадает за тег <input>. Осталось просто после ‘> использовать XSS

Level 8:

Есть форма для загрузки картинки и форма показа картинок. Нужно с помощью загруженного файла запустить JS-скрипт с окном alert(). Создаём файл 8.html:

Вот его-то мы и будем загружать на сервер. При попытке залить его вылезает ошибка, расширение плохое. Переименовываем в 8.jpg.html — проходит. Осталось этот файл запустить. Так, у нас есть форма с картинками. Смотрим код — видим строку с ссылкой на картинку

Заходим по этому адресу, и у нас открывается картинка. Значит, сюда залился и наш файл. Открываем

http://ctf.infosecinstitute.com/ctf2/ex8_assets/img/8.jgp.html

Level 9:

Мы авторизованы под одним человеком, надо зайти под другого. Никаких активных форм нет.

Идём копаться в куки. Видем в них параметр user=Sk9ITitET0U%3D

%3D это символ «=» . Sk9ITitET0U= похоже на код base64. Идём на сайт base64.ru и расшифровываем. Получаем JOHN+DOE. Значит, зашифровываем MARY+JANE и подставляем в куки. Можно сделать с помощью Burpsuite, или с помощью Modify Headers прям в браузере.

Level 10:

Есть игра, задание — получить 9999 очков и пройти на максимальном уровне сложности. Ну, ради интереса сыграли пару раз =) . Далее в коде страницы натыкаемся на js-код игры.

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

P.S. Как и в первой задаче, здесь можно было «на лету» править файл в Chrome с помощью Developer Tools, я же в FF просто удалил этот код из страницы сайта, и вставил заново в консоли Firebug.

Level 11:

К сожалению, мы забанены. Нужно это исправить. Хм… ну, лезем в куки, видим там параметр welcome=no и меняем его на yes. Подставляем новые куки в Modify Headers и готово.

Level 12:

Нужно подобрать пароль к пользователю admin. В условии нам сказано нагуглить пароль по фразе filetype:lst password

На первой же ссылке висит список паролей (их там 3545). Можно скопировать и вставить в текстовый документ, а можно так:

Словарь есть, давайте брутить. Да, не забудьте подправить файлик, стереть комментарии.

Использую гидру:

А вот для любителей медузы:

Пароль подобрался — princess. Заходим и попадаем на последний уровень.

Level 13:

И последний уровень, нам нужно сделать редирект на другой сайт.

Смотрим пакет при обновлении страницы

http://ctf.infosecinstitute.com/ctf2/exercises/ex13.php?redirect=

Пробуем подставить сайт Яндекса http://www.yandex.ru/ Фильтрует. Заглавные тоже фильтрует. WWW и HTTP фильтруются. Тогда делаем так: