Скучная история про первый взлом с картинками
Как и было обещан пост про первый взлом. Те, кто ждут эпических событий, и прочие фантазии - здесь вы этого не найдете. На дворе год эдак 2009-й я создал несколько сайтов (занимался бизнесом). Потом случаем наткнулся на описание атак на сайты... Взломанный сайт - угроза репутации, а значит нужно изучить врага, чтобы знать, как с ним бороться.
Итак, первым делом я засел изучать поле деятельности. В итоге прочитав и логически обработав данные я пришел к классификации угроз. Следует отметить, что обычные действия пользователя и атака зачастую отличаются лишь тем, что атаку проводит взломщик, а не авторизированный пользователь. Итак, цели атак (может быть от одной до всех):
1. Добавление информации. Атаки данного типа добавляют на атакуемый ресурс что-то, чего там не должно быть. Это и спам, и реклама и XSS атаки (с которой я и начал).
2. Изменение информации. Атака вносит изменения в существующий контент или данные сайта.
3. Получение информации. Атака имеет целью получить данные обычно не доступные пользователям.
4. Удаление информации. Атака имеет целью уничтожение информации.
5. Отказ в обслуживании. Атака имеет целью предотвратить доступ пользователей к атакуемому ресурсу.
Способы осуществления атак:
1. Социальная инженерия. Данные вносятся, изменяются, получаются, удаляются путем обмана специалиста, имеющего легальный доступ к данным.
2. "Пятая колонна". Атаку производит легальный пользователь, который имеет доступ к оборудованию из-за корысти или из личных побуждений.
3. "Один-к-одному". Атаку на целевую систему проводит один аппаратно-программный комплекс.
4. "Много-к-одному". Атаку на целевую систему проводит множество аппаратно-программных комплексов (ботнет).
5. "Зевок". Атака является следствием нарушений правил информационной безопасности (простые пароли, открытые порты).
6. "Рикошет". Атака на целевую систему производится сторонней системой в результате эксплуатации уязвимости на ней.
7. "Троян". Система атакуется после регистрации путем повышения привилегий от гостевого доступа к администратору.
8. "Человек посередине". Атака идет на прослушивание канала связи.
9. "Спамер". Атака на ресурс путем заваливания его различной информацией. В основном DDoS.
10. "Хамелеон". Атака, когда компьютер ломщика пытается прикинуться легальной машиной.
Вообще их много, так что на этом остановимся.
Итак, перейдем к основным концепциям атаки. Изучив разные типы атак, я решил начать с элементарного - XSS. Если бы не каскадные таблицы стилей она называлась бы CSS - Cros-Site-Scripting - межсайтовый скриптинг. Это атака с целью добавления информации. Сперва немного теории. Сейчас Вы все читаете данный пост просматривая сайт Пикабу. Технически сайт - каталог не сервере (или нескольких серверах) в котором расположены обычные файлы. В результате работы интерпретатора PHP на языке HTML создается веб-страница, которая дополняется сторонней информацией из различных сторонних файлов. В числе прочих там же могут быть и JavaScript, это встраиваемый в браузер интерпретируемый язык программирования, который может делать со страницей все, в т.ч. похищать информацию об авторизации и любые данные видимые пользователю.
Итак, была выбрана самая простая в реализации атака XSS. Если открыть сайт в режиме просмотра кода Ctrl+U, то мы увидим, что начинку сайта представляет собой примерно такую картину:
Для того, чтобы атаковать нам нужна "точка входа", это те данные, которые может принять атакуемая система от нас. Атаковать я решил одну из самых больных тем - имя пользователя. Смысл в том, что атака на имя пользователя будет распространятся по всему сайту т.к. везде, где отображается имя пользователя будет выполнятся вредоносный код.
Эмулируем атаку. Нажимаем Shift+Ctrl+I (я работаю в Firefox) и попадаем в Инструменты разработчика. Вкладка "Инспектор". Нажимаем на значок выбора объекта, выделяем и нажимаем на нужный (атакуемый) элемент.
Как видим имя автора поста заключено в тег "а" содержит параметры class, href и в теле тега содержит имя пользователя. Как браузер определяет окончание тела тега? Он ищет знак обрамляющий открывающий и закрывающий тег - знак меньше. Закроем тег и добавим скрипт.
Это простой скрипт выводит окошко с приветствием. Если нам удалось зарегистрироваться с таким "странным" ником и он заработал (вывел сообщение) - значит сайт уязвим. Проверяем, что данный код работает, для этого сохраняем локально исправленный HTML и открываем его в браузере:
Обратите внимание, что окно появилось сразу после отображения логина. Данный "взлом" (хотя это и не взлом, а демонстрация работы XSS) - "ручной" т.е. мы руками попробовали взломать что-то и это крайне не продуктивный путь. В реале берется атакуемая система, вручную производится атака и пишется приложение, называемое эксплойтом, которое проводит выявленную атаку на заданный список целей. Поскольку сегодня за реальную атаку можно получить реальный срок, то искать уязвимые сайты мы не будем. А самая первая атака заключалась в том, что я просто пытался зарегистрироваться на сайте используя логин + XSS вставку и на 5 попытке мне это удалось. После успешной регистрации я написал админу сайта о выявленной уязвимости. Уязвимым может быть все к чему имеет доступ пользователь и даже то, доступа к чему он не имеет ;-)
Теперь о том, что я вынес для себя из этой атаки:
1. "Точки входа" == "векторы атак". Код нужно писать исходя из тезиса, что любые запрошенные данные будут использоваться для взлома. Следовательно, архитектура приложения и запрос данных исключительно на основании "белых списков" возможных значений.
2. Невозможно написать идеальный код, обязательно будут ошибки. Как следствие - кода нужно писать как можно меньше, чтобы он оставался читаемым и понимаемым.
3. Фреймворки можно использовать только в самых крайних случаях т.к. используя фреймворк можно самому включить уязвимости в проект. Безусловно, что использование фреймворков ускоряет и облегчает разработку, но и опасность таит немалую.
После этого я еще много раз занимался взломом, но уже не в сети, а на специально созданном полигоне - создавал/скачивал приложения и взламывал их, правда меня хватило меньше чем на год. Вообще взлом - отдельный мир. Приложения, которые мы используем, это узкие тропинки на бескрайнем поле возможностей.
Сам по себе успешный взлом - изучение массы литературы, часы иногда десятки, бывает и сотни часов попыток и только потом результат. Именно поэтому взломщики делятся на две категории: "за деньги", которые атакуют исключительно распространенные приложения и сервисы и "за идею", которые атакуют все подряд. Тем, кто зарабатывает на взломе не интересно сидеть сутками ради взлома сервиса с которого ничего не поиметь или поиметь мало.
В БМ дичь.