Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛабРаб.docx
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
2.87 Mб
Скачать

Лабораторная работа №10. Поиск уязвимостей в убд

Цель работы: используя методику «SQL инъекций» проверить разработанную удалённую базу данных на наиболее широко применимые уязвимости.

1. Теоретическая часть

Внедрение SQL-кода (англ. SQL injection) — один из распространённых способов взлома сайтов и программ, работающих с базами данных, основанный на внедрении в запрос произвольного SQL-кода.

Внедрение SQL, в зависимости от типа используемой СУБД и условий внедрения, может дать возможность атакующему выполнить произвольный запрос к базе данных (например, прочитать содержимое любых таблиц, удалить, изменить или добавить данные), получить возможность чтения и/или записи локальных файлов и выполнения произвольных команд на атакуемом сервере.

Атака типа внедрения SQL может быть возможна из-за некорректной обработки входных данных, используемых в SQL-запросах.

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

Принцип атаки внедрения SQL

Допустим, серверное ПО, получив входной параметр id, использует его для создания SQL-запроса. Рассмотрим следующий PHP-скрипт:

$id = $_REQUEST['id'];

$res = mysql_query("SELECT * FROM news WHERE id_news = $id");

Если на сервер передан параметр id, равный, то выполнится следующий SQL-запрос:

SELECT * FROM news WHERE id_news = 5

Но если злоумышленник передаст в качестве параметра id строку -1 OR 1=1, то выполнится запрос:

SELECT * FROM news WHERE id_news = -1 OR 1=1

Таким образом, изменение входных параметров путём добавления в них конструкций языка SQL вызывает изменение в логике выполнения SQL-запроса (в данном примере вместо новости с заданным идентификатором будут выбраны все имеющиеся в базе новости, поскольку выражение 1=1 всегда истинно).

Защита от атак типа внедрение SQL-кода

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

Фильтрация строковых параметров:

Чтобы внедрение кода было невозможно, для некоторых СУБД, в том числе, для MySQL, требуется брать в кавычки все строковые параметры. В самом параметре заменяют кавычки на \", апостроф на \', обратную косую черту на \\ (это называется «экранировать спецсимволы»).

Для внесения изменений в логику выполнения SQL-запроса требуется внедрение достаточно длинных строк. Так, минимальная длина внедряемой строки в вышеприведённых примерах составляет 8 символов («1 OR 1=1»). Если максимальная длина корректного значения параметра невелика, то одним из методов защиты может быть максимальное усечение значений входных параметров.

Например, если известно, что поле id в вышеприведённых примерах может принимать значения не более 9999, можно «отрезать лишние» символы, оставив не более четырёх:

statement := 'SELECT * FROM users WHERE id = ' + LeftStr(id, 4) + ';';

2. Пример выполнения практической части

ПРЕДУПРЕЖДЕНИЕ! Категорически запрещается запускать sqlmap на внешние интернет адреса.

Используя типичный набор SQL инъекций проверим сервер XAMPP на уязвимости. Для этого запустим любой браузер и будем формировать запросы к серверу. Воспользуемся программой Sqlmap — сканером sql уязвимостей. Программа обладает огромным функционалом, который поможет не только найти уязвимость, но и при совокупности некоторых факторов заполучить полный контроль над целевой машиной.

В самом простом варианте sqlmap можно запустить так:

sqlmap.py -u «адрес целевого сервера»

Этого будет достаточно для того, чтобы sqlmap начал свою работу. Как можно легко догадаться, ключ -u задает адрес нашей цели. Сканер произведет запрос по заданному URL и будет анализировать все параметры, которые мы указали в ссылке.

Протестируем настроенный на предыдущих лабораторных работах виртуальный сервер:

sqlmap –u http://localhost/phpmyadmin/

Где вместо localhost будем использовать IP адрес виртуального сервера. Вывод команды:

Рисунок 1 – Результат SQL инъекции

Как видим, сервер содержит уязвимость в параметре

[CRITICAL] all tested parameters appear to be not injectable. Try to increase '--level'/'

--risk' values to perform more tests. You can give it a go with the switch '--text-only' if the targ

et page has a low percentage of textual content (~4.65% of page content is text). Also, you can try

to rerun by providing either a valid value for option '--string' (or '--regexp')

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

3. Задания для самостоятельного выполнения

1. Протестируйте свои виртуальные серверы на предмет SQL инъекции, в случае обнаружения уязвимости предложите варианты её исправления.

4. Содержание отчёта

1. Тема и цель работы

2. Описание выполнения задания

3. Вывод о проделанной работе

5. Контрольные вопросы

1. Что такое SQL инъекция?

2. Как осуществляется защита от SQL инъекций?

3. Какого типа бывают уязвимости в БД?

4. Для чего нужна программа sqlmap?