31 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Как взломать базу данных

Атакуем БД сайта

Спецвыпуск: Хакер, номер #052, стр. 052-084-1

Что может сделать взломщик используя SQL injection

С каждым днем все больше скриптов используют базы данных, все больше хостингов доверяют пароли своих клиентов SQL-базам, все больше популярных сайтов переходит на публичные форумы и движки, работающие с MySQL. Но далеко не все ясно представляют себе, насколько опасным может быть непродуманное использование MySQL в скриптах.

Без знаний основ языка SQL трудно что-либо понять. Прежде всего разберемся, в чем заключается суть атаки типа SQL injection. К примеру, на атакуемом сервере стоит следующий PHP-скрипт, который на основе поля category_id делает выборку заголовков статей из таблицы articles и выводит их пользователю:

//подключаемся к MySQL

mysql_connect($dbhost, $dbuname, $dbpass) or die(mysql_error());

mysql_select_db($dbname) or die(mysql_error());

$result=mysql_query(“SELECT article_id, article_title FROM articles where category_id=$cid”); // = 4. Почему именно так? Число 40000 – версия MySQL, записанная без точек. Если версия, которая стоит на сервере, больше или равна этому числу, то заключенный в /**/ код выполнится как часть запроса. В результате ни одна запись не подойдет под запрос и скрипт не вернет ничего. Зная версию MySQL, хакер сделает вывод о том, сработает фишка с UNION или нет. В случае если MySQL третьей версии, фишка работать не будет. В нашем случае MySQL >= 4 и злоумышленник все-таки воспользуется UNION.

Для начала взломщик составит верный UNION-запрос, то есть подберет действительное количество указываемых столбцов, которое бы совпало с количеством указываемых столбцов левого запроса (вспоминай правила работы с UNION). Хакер не имеет в распоряжении исходников скрипта (если, конечно, скрипт не публичный) и поэтому не знает, какой именно запрос шлет скрипт к MySQL. Придется подбирать вручную – модифицировать запрос вот таким образом: http://serv.com/read.php?cid=1+UNION+SELECT+1. И тут о своем присутствии объявит ошибка, так как количество запрашиваемых столбцов не совпадает. Хакер увеличивает количество столбцов еще на единицу: http://serv.com/read.php?cid=1+UNION+SELECT+1,2 – получает список статей из категории 1, а также в самом конце две цифры: 1 и 2. Следовательно, он верно подобрал запрос.

Посмотрим на модифицированный запрос от PHP к MySQL: SELECT article_id, article_title FROM articles where category_id=1 UNION SELECT 1,2. В ответ MySQL возвращает результат первого SELECT (список статей) и результат второго SELECT – число “1” в первом столбце и “2” во втором столбце (SELECT+1,2). Другими словами, теперь, подставляя вместо ‘1’ и ‘2’ реальные имена столбцов из любой таблицы, можно будет заполучить их значения.

Составив верный SELECT+UNION запрос, хакер постарается подобрать название таблицы с нужными ему данными. Например, таблица с данными пользователей будет, скорее всего, называться users, Users, accounts, members, admins, а таблица с данными о кредитных картах – cc, orders, customers, orderlog и т.д. Для этого злоумышленник сделает следующий запрос: http://serv.com/read.php?cid=1+UNION+SELECT+1,2+FROM+users. И если таблица users существует, то PHP-скрипт выполнится без ошибок и выведет список статей плюс ‘1 2’, иначе – выдаст ошибку. Так можно подбирать имена таблиц до тех пор, пока не будет найдена нужная.

В нашем случае “нужная” таблица – это authors, в которой хранятся данные об авторе: имя автора, его логин и пароль. Теперь задача хакера – подобрать правильные имена столбцов с нужными ему данными, чаще всего с логином и паролем. Имена столбцов он станет подбирать по аналогии с именем таблицы, то есть для логина столбец, скорее всего, будет называться login или username, а для пароля – password, passw и т.д. Запрос будет выглядеть так: http://serv.com/read.php?cid=1+UNION+SELECT+1,login+from+authors.

Почему хакер не стал вставлять имя столбца вместо единицы? Ему нужна текстовая информация (логин, пароль), а в нашем случае в левом запросе SELECT на первом месте идет article_id, имеющий тип INT. Следовательно, в правом запросе хакер не может ставить на первое место имя столбца с текстовой информацией (правила UNION).

Итак, выполнив запрос http://serv.com/read.php?cid=1+UNION+SELECT+1,login+from+authors, взломщик находит список логинов всех авторов, а подставив поле password – список паролей. И получает желанные логины и пароли авторов, а админ сервера – подмоченную репутацию. Но это только в нашем примере Фортуна улыбнулась злоумышленнику так широко: он быстро подобрал количество столбцов, а в реальной жизни количество столбцов может достигать 30-40.

Теперь рассмотрим некоторые ситуации, в которых использование UNION затруднено по тем или иным причинам.

Левый запрос возвращает лишь числовое значение. Что-то вроде SELECT code FROM artciles WHERE id = $id. Что будет делать хакер? Средства MySQL позволяют проводить различные действия над строками, к примеру, выделение подстроки, склеивание нескольких строк в одну, перевод из CHAR в INT и т.п. Благодаря этим функциям хакер имеет возможность выудить интересующую его информацию по одному символу. К примеру, требуется достать пароль из таблицы admins, используя приведенный выше запрос. Чтобы получить ASCII-код первого символа пароля, сделаем следующий запрос к скрипту: http://127.0.0.1/read.php?cid=1+union+select+ASCII(SUBSTRING(password,1,1))+from+admins. Функция SUBSTRING(name,$a,$b) в MySQL выделяет $b символов из значения столбца name начиная с символа под номером $a. Функция ASCII($x) возвращает ASCII-код символа $x. Для получения последующих символов следует просто менять второй параметр функции SUBSTRING до тех пор, пока ответом не будет 0. Подобный способ был использован в эксплойте для одной из версий phpBB.

SQL Injection находится в середине SQL-запроса. Например: SELECT code FROM artciles WHERE id = $id AND blah=’NO’ AND active=’Y’ LIMIT 10. Для правильной эксплуатации хакер просто откомментирует идущий следом за Injection код, то есть к вставляемому коду добавит /* или –. Пробелы в запросе взломщик может заменить на /**/, что полезно в случае если скрипт фильтрует пробелы.

Случается и такое, что в PHP-коде подряд идет несколько SQL-запросов, подверженных Injection. И все они используют переменную, в которую злоумышленник вставляет SQL-код. Например (опускаю PHP):

$result=mysql_query(“SELECT article_id, article_title FROM articles where category_id=$cid”);

$result=mysql_query(“SELECT article_name FROM articles where category_id=$cid”);

//тут вывод результата

Это довольно неприятно для хакера, так как для первого запроса SQL Injection пройдет нормально, а для второго UNION – уже нет, так как количество запрашиваемых столбцов отличается. И если программист, писавший код, предусмотрел остановку скрипта в случае ошибки типа “. or die(“Database error!”)”, то эксплуатация обычными методами невозможна, так как скрипт остановится раньше, чем будет выведет результат.

Скрипт выводит не весь результат запроса, а, например, только первую запись. И если хакер будет прямо пользоваться UNION, то скрипт выдаст только первую запись из ответа MySQL, а остальное отбросит, в том числе результат SQL Injection. Для того чтоб преодолеть все препятствия и на этом этапе, хакер передаст левому запросу такой параметр для WHERE, чтобы в ответ на него MySQL не вернул ни одной записи.

Например, есть такой запрос: SELECT name FROM authors WHERE id=$id. После SQL Injection он будет выглядеть следующим образом: (..) id=1 UNION SELECT password FROM authors. Но PHP-скрипт выведет только первую запись, поэтому вставляемый код следует модифицировать: (..) id=-12345 UNION SELECT (..). Теперь в ответ на левый запрос MySQL не вернет ничего, а в ответ на правый – желанные для хакера данные.

Скрипт не выводит результат запроса. Например, есть скрипт, который выводит какие-либо статистические данные, например, количество авторов, принадлежащих к определенной группе. Причем количество записей он считает не с помощью MySQL-функции COUNT, а в самом скрипте. Скрипт шлет MySQL такой запрос: SELECT id FROM authors where category_id=$cid.

Допустим, скрипт возвращает что-то вроде “Найдено десять авторов в данной категории”. В этом случае злоумышленник будет эксплуатировать SQL injection, конечно же, методом перебора символов! Например, хакеру надо получить пароль автора с id = 1, для чего потребуется перебирать каждый символ пароля. Но как получить символ, если PHP не выводит ничего из того, что возвратил MySQL?

Рассмотрим такой запрос: SELECT id FROM authors where category_id=-1 UNION SELECT 1,2 FROM authors WHERE id=1 AND ASCII(SUBSTRING(password,1,1))>109. Результатом запроса будет одна запись, если ASCII-код первого символа пароля больше 109, и ноль записей, если больше, либо равна. Итак, методом бинарного поиска нетрудно найти нужный символ. Почему хакер использует знаки “больше/меньше”, а не “равно”? Если взломщику надо получить 32-символьный хэш пароля, ему придется делать примерно 32*25 запросов! Метод бинарного поиска позволяет сократить это число в два раза. Само собой, делать запросы хакер будет уже не руками, а с помощью скрипта, автоматизирующего перебор.

Читать еще:  Что есть при ангине

Несмотря на отсутствие в третьей версии оператора UNION, и из нее хакер сможет вытащить то, чем интересуется. В осуществлении этого замысла помогут подзапросы и перебор символов, но описание этого метода займет еще пару листов (которых мне не дали). Поэтому ищи статьи на эту тему на www.rst.void.ru (автор 1dt.w0lf) и www.securitylab.ru (автор Phoenix).

Правило №1. Фильтруй входные данные. Кавычку заменяй на слеш-кавычку(‘), слеш – на слеш-слеш. В PHP это делается или включением magic_quotes_gpc в php.ini, или функцией addslashes(). В Perl: $id=

s/([‘])/$1/g;. И на всякий случай: $id=

s/[a-zA-z]//g; – для числовых параметров.

Правило №2. Не дай кому не надо внедрить SQL-код! Заключай в кавычки все переменные в запросе. Например, SELECT * FROM users WHERE id=’$id’.

Правило №3. Отключи вывод сообщений об ошибках. Некоторые программисты, наоборот, делают так, что при ошибке скрипт выводит сообщение самого MySQL, или, еще ужасней, – ВЕСЬ SQL-запрос. Это предоставляет злодею дополнительную информацию о структуре базы и существенно облегчает эксплуатацию.

Правило №4. Никогда не разрешай скриптам работать с MySQL от root. Ничего хорошего не выйдет, если хакер получит доступ ко всей базе.

Правило №5. Запускай публичные скрипты от отдельного пользователя с отдельной базой. Неприятно будет, если какой-нибудь кидди, воспользовавшись 0day-дырой в форуме, получит доступ к базе с СС твоих клиентов.

Правило №6. Отключи MySQL-пользователю привилегию FILE – не дай хакеру записать в файл что-то вроде через MySQL.

Правило №7. Не называй таблицы и базы данных в соответствии с их назначением, чтоб утаить от чужих глаз настоящие названия. В публичных скриптах часто предоставляют возможность установить prefix для названия таблиц – устанавливай самый сложный. Если кто-нибудь и найдет SQL injection, то не сможет ее эксплуатировать.

Чаще всего уязвимости оставляют в тех запросах, параметры которых передаются через hidden формы в HTML и через cookies, видимо, из-за того, что они не видны пользователю и не так привлекают внимание злодеев.

Часто забывают про SQL Injection в функции Reply, о поиске сообщений пользователя в форумах, в репортах различных сервисов. В 80% WAP-сервисов SQL injection находят по десять штук в каждом скрипте (наверное, админы думают, что туда только через сотовые ходят). На самом деле многие недооценивают SQL Injection. Известен случай, когда обычная SQL injection в скрипте репорта привела к реальному руту на трех серверах и дампу гиговой базы. А всего-то SQL Injection…

inattack.ru/group_article/34.html
www.rst.void.ru/papers/sql-inj.txt
www.securitylab.ru/49424.html
www.securitylab.ru/49660.html

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

Защитить свою базу от хакеров можно – нужно только грамотно следовать определенным правилам по нейтрализации подобных атак.

С помощью UNION хакер может легко узнать пользователя, базу данных и версию MySQL, для чего используются функции user(), database() и version() соответственно. Взломщик просто сделает запрос типа SELECT user().

Даже если в обороне есть брешь, можно дезинформировать противника присваивая переменным нелогичные названия. Тогда их будет просто невозможно подобрать.

Чем ты больше знаешь о том, как ломают, тем проще предотвратить взлом.

Регулярно просматривай новостные сайты по безопасности, чтобы быть в курсе вновь изобретенных способов взлома и не допускать утечек ценной информации.

Конкурс Самый главный хакер в мире [ Массовый взлом mysql ]

Перейти к странице

explorer

И кто же это такой крутой хакер? Кто же этот легендарный неуловимый Джо?
Скажите как его зовут.

БУ -РА -ТИ-НО! Почти угадали )

Да-да друзья, всем известный поисковик, и есть самый главный и крутой хакер )
Большинство из вас уже давно знают про такую вещь как гугл хакинг.

Гугл может, Гугл может все, что угодно,
Плавать брассом, спорить басом, дрова рубить!
Гугл может, Гугл может все, что угодно,
Ломать сайты, сливать базы – не может быть!?

Может-может, ещё как может! А что он может? Многое – Более 40 000 уязвимостей для поиска через Гугл находится в

Но сегодня мы не будем перебирать все эксплойты, а остановимся на том, в чём Гугл прославился больше всего – это дорки.
Google Dork – это запрос для выявления разных дыр в безопасности сайтов, роутеров, камер и пр. Дорки могут быть разными – поиск паролей, документов, FTP и т.д., но мы будем рассматривать SQL Injection.
SQL Injection – Уязвимость, которая позволяет хакеру получить доступ к базе данных.

Как выглядят эти запросы:

inurl:index.php?id=
inurl ageid=
inurl:channel_id=

И многие тысячи других, списки которых без труда ищутся в интернете. Но конечно большая часть известных запросов по много раз пройдена юными и не очень любителями покопаться в самом сердце сайта. Соответственно, выудить какую-то актуальную информацию, используя дорки из паблика не так-то просто.

Получается дорки потеряли актуальность? Вовсе нет, всего лишь нужно использовать запросы, которых нет в сети. А где же их тогда взять? Ну вот мы и подошли к самому интересному…

Ну раз их нет, значит их нужно сочинить самим Сказано – сделано, приступим!

Способ №1 – самый долгий

Для этого нам понадобится

от Яндекса
Этот сервис ищет ключевые слова. Сначала нужно определиться, что будем искать – например сайты с тематикой онлайн игр.

Вводим запрос – game online (взял «от балды», придумайте получше). Запросы должны быть написаны латиницей! Подобранные слова выделяем и копируем.

На следующем этапе нужно отделить ключевики от ненужного нам мусора. Для этого скопированный текст вставляем в EXCEL, выделяем ненужную колонку и удаляем.

Оставшуюся колонку копируем в новый файл txt, будем пользоваться Notepad++. Теперь нам нужно избавиться от символов ‘+’ и пробелов. Делать это будем в 2 приёма. Сначала заходим Поиск –>Замена. В появившемся окне в поле поиска пишем + и жмём «Заменить всё».

Во второй заход вместо + ставим пробел, а в поле «Заменить на:» символ нижнего подчёркивания. Также жмём «Заменить всё» и сохраняем.

Несмотря на то, что в Яндексе мы подбирали ключевики латиницей, в списке попадаются иногда и русские слова. Чтобы ничего не искать и не править вручную, обратимся к носатому парнишке идём в Гугл-переводчик. Вставляем наш список как русский текст и переводим на английский.

Копируем перевод и сохраняем обратно в наш файл, например game.txt Но это ещё не всё – выделяем весь текст, снова заходим Поиск–>Замена. В появившемся окне в поле поиска пишем $ , а в поле «Заменить на:» .php? меняем режим поиска на «Регулярные выражения», и жмём «Заменить всё». Сохраняем. Первый подготовительный этап закончен.

«Хвосты», то бишь тип, можно использовать разные – .php? .asp? .htm? .html? .txt? .cgi? .aspx? .xml То что у нас получилось, ещё не является дорками – это лишь заготовки для создания оных, хотя даже в таком виде какой-то результат уже будет. Далее скопированые заготовки вставляем в программу SQLi Dumper и запускаем старт.

В нижнем поле URL будут появляться ссылки. Для примера, трёх ссылок будет достаточно, которые мы сохраняем в текстовый файл. Это файл открываем в следующей программе – DorkCombine. Пользоваться ей очень просто – тыкаете по всем клавишам подряд сверху донизу

В нижнем окошке и появятся наконец-то наши дорки. Будут конечно встречаться и уже известные, ведь комбинация идёт из «запчастей». Поскольку здесь просто пример из трёх ссылок, то и выхлоп дорок небольшой. Из скриншота наглядно видно как работает эта программа, из ссылок идёт выборка в 3 колонки – имена, тип и параметы.

Способ №2 – самый быстрый

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

В программе Dork Combine открываем текстовый файл со списком из trash через кнопку Load URLs , или просто копируем список в верхнее окно. Очень большой список не берите, а то я сгенерил как-то 1.5 миллиона дорок, а прога не смогла их сохранить и вылетела ))) Хотя до 700 тыс вполне справлялась.

В этом примере я взял ровно 100 ссылок, после валидации (кнопка Validate), осталось 96. И как мы видим, из них комбайн нагенерил аж 18000 дорок.

Читать еще:  Что изобрел томас адамс

Способ №3 – самый правильный

Первый способ был весьма долгий, второй очень быстрый, но куча сгенерированных дорок из мусора очень разношёрстная. Чтобы сделать гораздо более конкретные дорки, под определённую тематику, есть другой метод. Вкратце – в 3 средних окна набить вручную «хвостов», и сгенерить дорки.

Разберём чуть подробнее:

* В центральном окне Page type пишутся расширения, их не так уж много, упоминал в 1 способе – .php? .asp? .htm? .html? .txt? .cgi? .aspx? .xml и другие.
* В окно Parametrs вставляем параметры типа mod= s= t= cid= doc_id= id= page= serials= name= view= Параметров может быть довольно большое количество.
* И в окне Page names указываются имена страниц типа online_game online_gameg их количество исчисляется миллионами.

Все эти запчасти берутся из тематических URL. Например хост www,gamepark.eu/en/ FlashGames.asp?kat=

Расширение будет .asp? параметр kat= и имя FlashGames А чтобы долго не вылавливать имена, в первое окно Page type можно вставить список полученный первым способом в вордстате.
Даже небольшое количество записей в колонках позволило сгенерировать 3860 тематических дорок.

Получаем уязвимые сайты

Каким бы способом дорки не были получены, следующим этапом будет поиск уязвимых сайтов. Копируем наши дорки и вставляем всё в тот же Sql Dumper, стартуем. В поле с URL появились сайты. После окончания сканирования, идём во вкладку «Exploitables» и жмём «Start Exploiter» . Количество потоков только не делайте как на скрине ) Чем их меньше, тем меньше пропусков будет, максимум 10 ставьте.

Далее переходим во вкладку «Injectables» , жмём «Start Analiser» . Потом внизу программы ставим все галочки (email, admin, password, user) и жмём «Start».
Открывается ещё одно окно, в котором мы можем видеть количество записей в разных базах. Прокручиваем окошко, и ищем самые интересные варианты. Как видно база весьма приличная – почти 28 500 паролей.

Следующий шаг – жмём Go To Dumper –>New Dumper Instance

В появившемся отдельном окне жмём Get Databases и ждём окончания процесса обработки базы.

Затем, чтобы получить таблицы БД, жмём Get Tables . Далее опять выбираем, то что нас интересует (я выбрал members), и жмём Get Columns – получаем колонки. Ну вот мы и добрались до самого интересного – отмечаем passwd и email , жмём Dump Data.

С большой базой процесс не быстрый, так что можно пока курить бамбук.

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

Теперь жмём Export Data, выбираем Custom, чтобы было двоеточие.

Нам только осталось нажать Start , и сохранить результаты.

Всё, золотой ключик наш!

Конечно описанный способ слива баз не идеальный, есть гораздо более быстрые инструменты. Целью статьи не был обзор дампера, поэтому я не рассказывал о его дополнительных настройках и возможностях. Тем более использовался старичок v 8.0, который уже почти не работает. Но это простое руководство, поможет разобраться как рандомно и массово вскрываются mysql базы данных через дорки.

Внимание! Команда Codeby предупреждает – не используйте данный материал для неправомерных действий! Весь материал представлен только для ознакомления!

Ссылки на программы кому надо сам найдёт, понятное дело где – у Буратино, чего только он не сделает для любимого Папы Карло

Методы и средства взлома баз данных MySQL

Содержание статьи

MySQL — одна из самых распространенных СУБД. Ее можно встретить повсюду, но наиболее часто она используется многочисленными сайтами. Именно поэтому безопасность базы данных — очень важный вопрос, ибо если злоумышленник получил доступ к базе, то есть большая вероятность, что он скомпрометирует не только ресурс, но и всю локальную сеть. Поэтому я решил собрать всю полезную инфу по взлому и постэксплуатации MySQL, все трюки и приемы, которые используются при проведении пентестов, чтобы ты смог проверить свою СУБД. 0day-техник тут не будет: кто-то еще раз повторит теорию, а кто-то почерпнет что-то новое. Итак, поехали!

Вместо предисловия

Начнем с определения. MySQL — это реляционная система управления базами данных, которая обладает разными движками хранения данных: MyISAM, InnoDB, Archive и другими. Как и у большинства open source проектов, у нее существуют свои ответвления, например MariaDB. Забегая вперед, скажу, что большинство рассмотренных векторов/техник/багов распространяется на различные движки и на ответвления, правда не всегда.

Различные версии MySQL под разные платформы можно взять тут

Поиск жертв

Но перейдем непосредственно к делу. Для того чтобы кого-нибудь поломать, нужно его для начала найти. Допустим, что мы уже знаем, кто наша жертва, знаем его IP либо находимся в его локальной сети. Нам нужно просканировать его адрес (сеть) на наличие открытых портов. По стандарту MySQL использует порт 3306, его мы и будем искать. В арсенале каждого хакера должен присутствовать сканер Nmap, который позволяет находить различные сервисы, порты на целевых машинах. Пример команды для сканирования выглядит следующим образом:

  • -PN — очень полезная вещь, указывающая программе пропускать этап обнаружения хоста и сразу переходить к сканированию портов. Это нужно в том случае, если машина не отвечает на ping-сканирование, но при этом у машины могут быть открыты порты. В таком случае без данного флага Nmap пропустит данный хост;
  • -sV исследует открытые порты с целью получения информации о службе.

Для UDP-сканирования должен присутствовать флаг -sU.

SHODAN

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

Хакер #195. Атаки на Oracle DB

GitHub

Одна из крутейших фишек легкого доступа к базам данных — поиск исходников каких-либо проектов на GitHub. Прежде чем искать и раскручивать SQL Inj на сайте, что может занять достаточно длительное время (если таковые вообще присутствуют), достаточно просто зайти на всеми любимый сайт для совместной разработки, вписать пару слов и при должном везении получить доступ к сорцам. Многие разработчики в силу непонятных причин заливают свои проекты в общий доступ — может, по глупости, может, им жалко денег на приватный репозиторий, а может, они хотят поделиться со всем миром своим великолепным кодом, но на GitHub лежит огромная куча исходников, от маленьких сайтиков до больших проектов. Это зачастую сильно упрощает работу. Допустим, если мы введем такой поисковый запрос username mysql password database , то можно просто потерять сознание от количества результатов. Особенно много сладких PHP-файлов, в которых прописывается коннект к базе данных.

Рис. 2. Наглядные результаты по поиску кредов MySQL на GitHub

Поэтому первым делом на пентестах мы бежим и проверяем GitHub на наличие исходников клиента. Если что-то находится, то можно смело коннектиться к базе данных, после чего, отталкиваясь от прав, извлекать нужные нам данные. Но если уж получилось так, что мы не смогли найти заветных строчек username/password, не стоит отчаиваться — можно порыться в исходниках сайтов, если они присутствуют, и проводить аудит уже не вслепую, а с исходным кодом сервиса. Он значительно облегчает задачу поиска уязвимостей: теперь мы будем не просто фазить наобум, а проверять определенные векторы, выстроенные на основе исходников. Например, смотреть, в каких местах производится обращение в базу, используется ли фильтрация данных от клиента и так далее.

Инструментарий

Для поиска инъекций существуют разные способы: автоматически или вручную вставлять везде кавычку (фаззинг); использовать фишку с Гитхабом, уповая на неосторожность разработчиков исследуемого сервиса. И наконец настал момент истины: мы нашли нашу долгожданную инъекцию и готовы внедряться по полной. Но вот беда, у нас появились неотложные дела (друзья зовут попить пива), или нас одолела ужасная необоримая лень. Не стоит расстраиваться, на помощь придет отличная тулза sqlmap, которая автоматизирует процесс поиска и эксплуатации SQL-инъекций, и не просто найдет дыру в безопасности, а проэксплуатирует ее по полной программе. Поддерживает все виды инъекций. Функционал sqlmap позволяет: дампить базы, автоматически искать в базе, извлекать и расшифровывать логины и пароли, запускать cmd shell, запускать интерактивный sql shell, в котором тебе нужно только писать SQL-запросы в базу, а sqlmap сам составит payload для инъекции. Существует отличный Cheet Sheet, который в двух страничках показывает все возможности данной тулзы.

Читать еще:  Как пережить зиму

Есть еще несколько инструментов, которые пригодятся тебе в нелегком деле покорения MySQL. В особенном представлении они не нуждаются, так как наверняка ты о них уже не раз (не одну тысячу раз) слышал. Первый — Metasploit, одна из ключевых программ для хакинга, позволяющая создавать эксплойты, проводить их отладку. Второй — сканер Nmap, про который в журнале тоже не раз писали.

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

Сбор информации

Нужно начать с самого простого — сбора информации. В Metasploit для этого служит auxiliary/scanner/mysql/mysql_version , просто сканер версий, который может сканировать целый пул адресов:

В Nmap также существует модуль, который подключается к серверу и выводит разную полезную информацию: протокол, номер версии, состояние и соль.

Брутфорс

Среди основных вещей, которые приходится часто выполнять, конечно, брутфорс — проверка на слабые или стандартные пароли пользователей. Но прежде чем приступать к подбору паролей, можно провести атаку user enumeration (перечисление пользователей). Ее можно провести против серверов версии 5.x, которые поддерживают старые механизмы аутентификации (CVE-2012-5615). После сканирования мы будем знать, какие пользователи существуют в базе, что значительно сокращает пул пользователей для бруторса.

Составив наш пул имен и паролей, приступаем к бруту:

Nmap использует стандартные списки паролей и пользователей, но всегда можно взять свои:

Кстати говоря, вот тебе отличный репозиторий, где можно найти самые популярные логины, пароли и не только. Ну и обычно при брутфорсе выполняется еще одна простая, но довольно важная проверка на пустой пароль для пользователя root или anonymous:

Постэксплуатация

Следующий важный шаг, который наступает после получения логина/пароля (через инъекцию или полным перебором), — это постэксплуатация. Я перечислю различные модули для Nmap’а и их предназначение. Итак, модуль, который производит вывод баз данных:

Модуль, который производит вывод пользователей:

Модуль, который производит вывод переменных:

Модуль, который производит вывод пользователей и их хешей в виде, удобном для брутфорса:

Модуль, который заменяет клиент MySQL и отправляет запросы в удаленную базу:

Сканирование на CVE-2012-2122

Отдельно стоит упомянуть про один интересный модуль, который присутствует как в Metasploit, так и в Nmap, — модуль проверки на CVE-2012-2122. Данная уязвимость позволяет удаленным пользователям обходить аутентификацию из-за ненадлежащей проверки возвращаемых значений. Существует возможность авторизации с неправильным паролем с вероятностью 1/256, так как MySQL считает, что пришедший токен от пользователя и ожидаемое значение равны. Используя известное имя пользователя (например, root, который присутствует практически всегда) с любым паролем, можно подключиться к базе, повторяя подключение порядка 300 раз. После чего можно сдампить все пароли пользователей, сбрутфорсить их и коннектиться уже с легитимным паролем. Но не все так хорошо, как кажется, — данной уязвимости подвержены только сборки, где функция memcmp() возвращает значения за пределами диапазона от –128 до 127, то есть это достаточно ограниченное число систем:

  • Ubuntu Linux 64-bit (10.04, 10.10, 11.04, 11.10, 12.04);
  • OpenSuSE 12.1 64-bit MySQL 5.5.23-log;
  • Debian Unstable 64-bit 5.5.23-2;
  • Fedora;
  • Arch Linux.

Но если есть даже самая незначительная возможность попасть в базу, то стоит попробовать:

Для Nmap при сканировании нужно использовать скрипт mysql-vuln-cve2012-2122 :

Бородатый UDF

В далекие-далекие времена, когда еще во вселенной MySQL не было введено триггеров и хранимых процедур, существовала поддержка User-Defined Function (определенные пользователем функции). Но в современном мире данная фишка тоже имеет место быть и поддерживается до сих пор в качестве внешних хранимых функций. Данные функции не просто комбинируют разные SQL-операторы в какой-то определенный запрос, а еще и сильно расширяют функциональность самой базы. Так как, в отличие от Oracle Database, в MySQL не существует наикрутейшей Java-машины, с помощью которой можно крушить все и вся в базе, одним из немногочисленных способов выполнять команды на сервере через базу остается UDF. Во времена 4-й версии MySQL это был эксплойт Raptor, но он имел ряд ограничений, в том числе несовместимость с MySQL 5.0 и выше.
В данный момент существует легальная библиотека, которую можно скачать с легального сайта. Она содержит в себе четыре функции:

  1. sys_eval(arg1) — выполняет произвольную команду и возвращает вывод внешней команды.
  2. sys_exec(arg1) — выполняет произвольную команду и возвращает код возврата.
  3. sys_get(arg1) — позволяет получить переменную окружения или NULL, если таковой нет.
  4. sys_set(arg1, arg2) — позволяет задать переменную окружения (параметры: имя переменной, значение), возвращает 0 в случае успеха.

Библиотека устанавливается в один из путей /usr/lib/mysql , /usr/lib/mysql/plugin/ или другие в зависимости от системы. После чего приходит время исполнять команды в базе. Но сначала надо создать функцию:

А затем можно уже и выполнять с ее помощью различные команды:

Чтобы создавать и удалять функции, необходимо обладать привилегиями INSERT и DELETE . Поэтому проэксплуатировать данную багу можно, только если у пользователя, к которому у тебя есть доступ, выставлена привилегия FILE , позволяющая читать и записывать файлы на сервер с помощью операторов LOAD DATA INFILE и SELECT . INTO OUTFILE . Данный вариант всегда стоит проверить, ведь нерадивые админы еще существуют. Зачастую очень многие работают с базой от имени root’а, поэтому даже инъекции может хватить, чтобы заполучить полный контроль над машиной. Просмотреть привилегии можно в таблице user , db , host , tables_priv и columns_priv в базе mysql . set mysql; — для смены базы, select * from user; — для вывода таблицы.
Второе условие — функция lib_mysqludf_sys уже установлена в MySQL. Дальше все просто — создаешь функцию, исполняешь команды.
Еще один вариант — это собственноручная установка в качестве бэкдора в системе. Если тебе нужен удаленный, скрытый доступ к системе, то вариант прокачки базы с помощью легитимной, собственноручной установки lib_mysqludf_sys выглядит хорошим способом.

Техника эта не нова, и поэтому все до нас уже сделано и автоматизировано, так что не придется самому устанавливать функцию, если под рукой есть Metasploit:

То же самое умеет делать и sqlmap, так что, если ты нашел инъекцию, дальше можешь смело отдавать бразды правления ему.

Сценарий использования UDF

Один из возможных сценариев заливки шелла / повышения привилегий может выглядеть таким образом. Для начала нужно получить доступ к самой базе (пользователю root либо другому, обладающему привилегией FILE ) через инъекцию, брутфорс или иначе. После чего нам нужно получить копию библиотеки UDF на атакуемой машине, учитывая операционную систему и ее битность. Можно воспользоваться вариантами, входящими в состав sqlmap, которые можно взять тут. Кстати, в данном репозитории присутствуют библиотеки и для Windows. Закинуть копию библиотеки на сервер можно по-разному:

  • используя функционал сайта по загрузке картинок, файлов и прочего;
  • через открытый или взломанный FTP-сервер.

Следующим шагом является выполнение SQL-запросов для того, чтобы загрузить наш шелл в таблицу, после чего извлечь его в нужную нам папку ( /usr/lib для Linux, c:windowssystem32 для Windows). Далее мы создаем новую функцию в MySQL, теперь у нас есть рабочий шелл и возможность RCE на сервере.

Пример для Windows с созданием пользователя:

Как вариант, можно подключить RDP:

Заключение

Точек вхождения в чужую базу MySQL не так уж и много по сравнению с другими СУБД: SQL Injection, поиск логинов и паролей на GitHub, брутфорс, уязвимость к багам из паблика. К методам постэксплуатации можно еще дополнительно отнести повышение привилегий, DoS-атаки, применение триггеров и хранимых процедур. Правда, отдельные из них относятся к частным случаям, которые нечасто можно встретить либо для которых нужны очень специфичные условия.

Я же хотел показать тебе, как можно быстро и без особых усилий проверить нужную базу. Как видишь, в данный момент все стало автоматизированным, что позволяет проводить проверку в фоне, занимаясь своими делами. На этом все. И помни, что большая сила накладывает большую ответственность :).

Источники:

http://bozza.ru/art-108.html
http://codeby.net/threads/samyj-glavnyj-xaker-v-mire-massovyj-vzlom-mysql.65501/
http://xakep.ru/2015/04/16/195-mysql/

голоса
Рейтинг статьи
Ссылка на основную публикацию
Статьи c упоминанием слов: