Материал просмотрен 881 раз(а)

Здравствуйте друзья. Сегодня хотелось бы рассказать о небольшом эксперименте, который вылился в необычный квест. А может и не квест, но уж точно было не скучно. В целях безопасности все реальные адреса будут изменены.

Проблемы с почтовиком

Всё началось с проблемы с почтовым сервером. Оказывается, слал спам. Ну точнее, один из сайтов-мониторингов подсказал мне это. Проверяю. Спам слал не мой сервак, а находящийся в том же диапазоне (поэтому всю подсеть поднагнули). Поняв, что проблема не в моём почтовике, немного успокоился, ну и решил я обратить внимание на данный сайтик.

Исследование сайта

Пробежавшись по ссылкам на сайте я нашел любопытный параметр, передаваемый в GET-запросе выборки данных из базы. Приписал кавычку. Ничего, казалось бы, не изменилось. Но чутьё вело в эту сторону. Изменил номер позиции на “-1 OR 1=1”, фактически, лишив запрос смысла. Иначе говоря, всё выглядело как

Выбрать все элементы, где id = 1 (показывался нужный элемент)

Выбрать все элементы, где id = -1 OR 1=1 (так как -1 ни у кого нет, то выполнялось условие “или 1=1”, которое всегда истинно, иначе говоря просто выбрать все элементы).

И весь каталог товаров отдался. Хм.. Классическая SQL-Инъекция, т.е. внедрение произвольного кода в SQL-запрос.

Выборка базы

Для удобства использования SQL-инъекций есть специальные скрипты sqlmap, написанные на Python. Надо сказать, скрипты великолепные. Позволяют быстро исследовать нужный URL на возможность инъекции и использовать её.

Качнул версию под Windows, чтобы проверить механизм.

Быстрее всего работает версия под Linux, входящая в дистрибутив Kali Linux (сборка для нужд админов/хакеров/тестеров).

Синтаксис прост:

# sqlmap -u <URL сайта, включая параметр> --dbs

Отображает базы данных.

Затем

# sqlmap -u <URL...> -D <нужная база данных> --tables

Отображает таблицы в базе данных.

Затем

# sqlmap -u <URL...> -D <нужная база данных> -T <нужная таблица> --columns

Отображает колонки таблицы. Ну и потом уже можно сделать –dump, чтобы слить таблицу на диск.

SQLMAP

SQLMAP

Полученный файл CSV немного разобрал текстовым редактором:

потроха

потроха

Стало ясно, что на борту CMS (известно какая), а пароль представляет собой солёный MD5. Расколоть его не получится так просто, только перебором. Но всё равно возможно.

Что такое солёный MD5?

Как вам наверняка известно, MD5 представляет собой простой алгоритм вычисления хеш-суммы (некая функция), принимающая на вход текст или файл, а выдающая обратно строку длиной 32 символа. Функция есть во многих языках программирования и системах. Прелесть состоит в том, что будь на входе 1 символ или 100000, на выходе всегда будем получать 32 символа хеш. Ещё одна прелесть в том, что изменение даже одного входного бита изменяет результирующий хеш просто до невозможности сильно.

Это свойство используется для удостоверения целостности. У определенного сообщения (текста, файла) вычисляется контрольная сумма, затем файл посылается адресату вместе с этой контрольной суммой. Получатель вычисляет контрольную сумму полученного сообщения и сравнивает её с эталонной. Если они совпадают, значит и исходное сообщение получено без ошибок. Гениально!

Ещё одно из свойств хеша в том, что это не шифр. Т.е. зная строку (пароль) – легко получить его хеш. Но вот зная хеш – получить пароль невозможно! Обратной функции нет. Есть возможность подобрать хеш, т.е. методом перебора составляются слова (а, аа, ааа, ааб, аав, ааг……) до тех пор, пока хеш от этого слова не совпадет с эталонным хешем. Это и будет означать, что мы нашли пароль.

Именно поэтому хранить пароль в базе – очень опасно. Взломщик может с легкостью получить доступ к ресурсам, если завладеет базой данных. Но если он завладеет хешами – ничего он сделать не сможет. Только пытаться подобрать пароль.

Как происходит проверка пароля? Да очень просто. При регистрации вы указали пароль, хеш которого заносится в базу данных. А при аутентификации вычисляется хеш введенного вами пароля и посылается на сервер. (Пароль при этом не посылается. А хеш, даже если его перехватят, ничего не даст). Сервер, получив хеш, просто сравнивает его с базой и говорит “да, это вы!” или “нет, хеш другой! Пароль не тот”… Гениально, правда?

Но есть ещё один нюанс. Так называемые “радужные таблицы”. Это заранее рассчитанные хешы всех слов и буквосочетаний. Например, мы взяли словарь на 100.000 слов и рассчитали их суммы, занеся в базу данных. Потом мы утащили чей-нибудь хеш. Потом просто ищем в базе данных этот хеш, и если находим, можем утверждать, что знаем пароль. Ничего вычислять уже не надо! Всё вычислено заранее. И размер таких таблиц не 100.000 слов, а гораздо больше. Уже сейчас, насколько мне известно, есть таблицы на сотни терабайт размером. Любые пароли вида fh&!d22df там уже есть, поверьте. Поиск займёт секунды.

Выход найден. Наконец мы подошли к “соли”. “Соль” – добавочный текст, который добавляется к паролю в произвольном месте. И соль известна и серверу и клиенту. Может даже генерироваться в реальном времени. Или быть открытой. Сейчас поясню. Допустим, в качестве соли мы выбрали случайную последовательность символов “HCS$@$!!23872!844728dsdfsfsf”. Записали её себе в файлик и всё.

При регистрации на сайте мы получили от пользователя пароль “qwerty” и прибавили к нему нашу соль “qwertyHCS$@$!!23872!844728dsdfsfsf” и уже от неё вычислили хеш и записали его в базу. В принципе можно сказать с большой долей уверенности, что такого пароля ещё нет в радужных таблицах. А проверка займёт доли секунды. Пользователь ввёл пароль. Веб-сервер получил его, прибавил соль, вычислил хеш, сравнил с базой и понял, что пароль верен. Но так как просто не хватит места физически вычислить все хешы для всех солей, то идея радужных таблиц теряет смысл.

Тем более, что алгоритмы засаливания могут быть разные:

хеш(пароль+соль), хеш(соль+пароль), хеш(хеш(пароль)+соль), хеш(хеш(соль)+хеш(пароль)).

Операция взятия хеша довольно быстра. А вот подбор – это перебор всех вариантов пароля для определенного варианта соли – очень долгая задача. А в случае компрометации системы можно изменить 1 бит в соли и всё, все предыдущие созданные радужки будут бесполезны (так как они рассчитаны для другой соли), и придется перебирать всё заново. Вот так это работает.

P.S. О баге, кстати, я написал администратору ресурса. Использовать её я не стану, нехорошо это. Но помочь коллеге, считаю, нужно. Если надумете исследовать уязвимости – позаботьтесь об анонимности. Начать нужно с безопасного выхода в Интернет и телефонной связи. См sip телефония тарифы, где можно приобрести себе виртуальный телефонный номер.