# Занятие 1. SQL injection. ###### tags: `Intro to Web Security` ![](https://i.imgur.com/YUnYxQg.png) #### Материалы и описание для самостоятельного изучения: - язык SQL - [Что такое SQL и как он работает](https://gb.ru/posts/chto-takoe-sql-i-kak-on-rabotaet) - [w3schools](https://www.w3schools.com/sql/default.asp) - [sql-ex](https://sql-ex.ru) - инъекции SQL - [PortSwigger academy](https://portswigger.net/web-security/sql-injection) - [sqlinjection.net](https://www.sqlinjection.net/tutorial/) - [hacksplaining.com](https://www.hacksplaining.com/lessons) ## Подготовка к занятию. Настройка Burp Suite и FoxyProxy(браузер Firefox) #### [Видео настройки Burp Suite и FoxyProxy](https://www.youtube.com/watch?v=kqw3DlJDmx4) ## Что такое SQL Википедия гласит, что SQL — это декларативный язык программирования, применяемый для создания, модификации и управления данными в реляционной базе данных, управляемой соответствующей системой управления базами данных. Не самое удобоваримое определение. Чтобы понять, о чём вообще речь, разберём его. Декларативный язык программирования говорит, что должно быть сделано, а не как это необходимо сделать. Ещё один пример декларативного языка — HTML. Рассмотрим такой код: ```htmlmixed= <div class="className"> <input type="button" value="Ясно. Понятно."></input> </div> ``` С его помощью мы заявляем (declaration — заявление) браузеру, что хотим увидеть блок с классом className и кнопкой с текстом «Ясно. Понятно.» внутри. Для этого мы не создаём каких-либо переменных, циклов, условий. Мы знаем, что браузер нас понял, сам разберёт команду и вернёт результат или ошибку. Здесь смысл довольно прост: мы даём команду и получаем результат. Мы не описываем, как эту команду выполнять. Чтобы понять, что такое реляционная база данных читайте статью [Что такое SQL и как он работает.](https://gb.ru/posts/chto-takoe-sql-i-kak-on-rabotaet) ## Что такое SQL инъекция SQL инъекция - это уязвимость веб-безопасности, которая позволяет злоумышленнику вмешиваться в запросы, которые приложение делает к своей базе данных. Как правило, это позволяет злоумышленникам просматривать данные, которые они обычно не могут получить. Это может включать данные, принадлежащие другим пользователям, или любые другие данные, к которым может получить доступ само приложение. Во многих случаях злоумышленник может изменить или удалить эти данные, что приведет к постоянным изменениям содержимого или поведения приложения. B некоторых ситуациях злоумышленник может усилить атаку с использованием SQL-инъекции, чтобы скомпрометировать базовый сервер или другую внутреннюю инфраструктуру, или выполнить атаку с отказом в обслуживании. ![](https://i.imgur.com/cHMyqk8.png) ## Последствия успешной атаки с использованием SQL-инъекции Успешная атака с использованием SQL-инъекции может привести к несанкционированному доступу, к конфиденциальным данным, таким как пароли, данные кредитной карты или личная информация пользователя. Многие громкие утечки данных в последние годы стали результатом атак с использованием SQL-инъекций, что привело к ущербу репутации и штрафам регулирующих органов. ![](https://i.imgur.com/8SptKDh.png) ## Типы SQL инъекций Существует большое разнообразие уязвимостей, атак и методов внедрения SQL, которые возникают в различных ситуациях. Некоторые распространенные примеры внедрения SQL включают: - Извлечение скрытых данных, где вы можете изменить SQL-запрос, чтобы вернуть дополнительные результаты. - Подрыв логики приложения, где вы можете изменить запрос, чтобы вмешаться в логику приложения. - Атаки объединения (UNION attacks), в которых вы можете извлекать данные из разных таблиц базы данных. - Изучение базы данных, в которых можно извлечь информацию о версии и структуре базы данных. - Слепая SQL инъекция, при которой результаты управляемого вами запроса не возвращаются в ответах приложения. ![](https://i.imgur.com/pdpwiLH.png) ### Извлечение скрытых данных Рассмотрим приложение для покупок, которое отображает товары в разных категориях и сортирует товары посредством `released`. Tо есть товары с `released = 1` отображаются на главной странице, а с нулевым значением нет. Если мы хотим увидеть скрытые товары с `released = 0`, то нам нужно каким то образом избавиться от этого фильтра. Ключевым моментом здесь является то, что последовательность двойных тире - это индикатор комментариев в SQL и означает, что часть запроса после него интерпретируется как комментарий. ![](https://i.imgur.com/O13hDsx.png) ### Подрыв логики приложения Рассмотрим приложение, которое позволяет пользователям входить в систему с именем пользователя и паролем. Часто проверка входа осуществляется с помощью такого запроса `SELECT * FROM table name WHERE username = username AND password = password` Такой подход не является ошибкой, если присутствует проверка пользовательского ввода, но что если ее нет? ![](https://i.imgur.com/QGkzxMp.png) ### UNION attacks B случаях, когда результаты SQL-запроса возвращаются в ответах приложения, злоумышленник может использовать уязвимость внедрения SQL для извлечения данных из других таблиц базы данных. Это делается с помощью ключевого слова `UNION`, которое позволяет выполнить дополнительный запрос `SELECT` и добавить результаты к исходному запросу. Например, если приложение выполняет следующий запрос, содержащий вводимые пользователем `"Gifts"`: `SELECT name, description FROM products WHERE category = 'Gifts'` Тогда злоумышленник может отправить входные данные: `'UNION SELECT username, password FROM users-- ` Это приведет к тому, что приложение вернет все имена пользователей и пароли вместе с названиями и описаниями продуктов. ![](https://i.imgur.com/MEXV9Lr.png) #### Определение количества столбцов, необходимых для атаки объединения с помощью SQL-инъекции При выполнении атаки объединения с помощью SQL-инъекции существует два эффективных метода определения количества столбцов, возвращаемых из исходного запроса. Первый метод включает в себя введение ряда предложений `ORDER BY` и увеличение указанного индекса столбца до тех пор, пока не произойдет ошибка. Эта серия полезных нагрузок изменяет исходный запрос, чтобы упорядочить результаты по разным столбцам в наборе результатов. Столбец в предложении `ORDER BY` может быть указан по его индексу, поэтому вам не нужно знать имена каких-либо столбцов. Когда указанный индекс столбца превышает количество фактических столбцов в результирующем наборе, база данных возвращает ошибку. Второй метод включает отправку серии полезных нагрузок `UNION SELECT` с указанием другого количества `NULL` значений Если количество нулей не совпадает с количеством столбцов, база данных так же возвращает ошибку. Приложение может фактически вернуть ошибку базы данных в своем HTTP-ответе, или оно может вернуть общую ошибку, или просто не вернуть результатов. При условии, что вы можете обнаружить некоторую разницу в ответе приложения, вы можете определить, сколько столбцов возвращается из запроса. #### Поиск столбцов с полезным типом данных в атаке объединения с помощью SQL-инъекции Причина выполнения атаки объединения SQL-инъекций заключается в том, чтобы иметь возможность извлекать результаты из введенного запроса. Как правило, интересные данные, которые вы хотите получить, будут в строковой форме, поэтому вам нужно найти один или несколько столбцов в исходных результатах запроса, тип данных которых соответствует строковым данным или совместим с ними. Уже определив количество требуемых столбцов, вы можете проверить каждый столбец, чтобы проверить, может ли он содержать строковые данные, отправив серию полезных нагрузок `UNION SELECT`, которые по очереди помещают строковое значение в каждый столбец. Если тип данных столбца несовместим со строковыми данными, введенный запрос приведет к ошибке базы данных. ![](https://i.imgur.com/wNl7rHr.png) ### Изучение базы данных После первоначального выявления уязвимости внедрения SQL, как правило, полезно получить некоторую информацию о самой базе данных. Эта информация часто может проложить путь для дальнейшего использования. Вы можете запросить сведения о версии базы данных. Способ, которым это делается, зависит от типа базы данных, поэтому вы можете определить тип базы данных, исходя из того, какой метод работает. Например, в Oracle вы можете выполнить: `SELECT * FROM v$version` Вы также можете определить, какие таблицы базы данных существуют и какие столбцы они содержат. Например, в большинстве баз данных вы можете выполнить следующий запрос, чтобы вывести список таблиц: `SELECT * FROM information_schema.tables` ![](https://i.imgur.com/6AppON2.png) ## Конец первой части Мы узнали основные типы SQL инъекций, разобрали union атаки и способы извлечения данных из БД. Научились находить и использовать эти виды атак. И узнали чем же так опасны SQLi. На следующей лекции разберем слепые SQL инъекции, научимся их выявлять и извлекать с помощью них информацию. Ну и разберем как же нам собственно не попасть в такую ситуацию и защититься от них. ![](https://i.imgur.com/tdjGsNB.png) В видео подробно разобраны первые 5 лабораторных. Остальные будут разобраны на следующем занятии. Лаба 1 https://portswigger.net/web-security/sql-injection/lab-retrieve-hidden-data Лаба 2 https://portswigger.net/web-security/sql-injection/lab-login-bypass Лаба 3 https://portswigger.net/web-security/sql-injection/union-attacks/lab-determine-number-of-columns Лаба 4 https://portswigger.net/web-security/sql-injection/union-attacks/lab-find-column-containing-text Лаба 5 https://portswigger.net/web-security/sql-injection/union-attacks/lab-retrieve-data-from-other-tables ## Домашнее задание ### 1. Практика на HACKSPLAINING Сдавать преподавателю в лс ВКонтакте - [Влад Соколов](https://vk.com/vavizh) Заходите на ресурс -> [HACKSPLAINING](https://www.hacksplaining.com/lessons) ![](https://i.imgur.com/Z6M2jyy.png) Выбираете SQL injection и решаете. Как закончите присылайте скрин [Владу](https://vk.com/vavizh) По вопросам прохождения ДЗ или Лабораторных тоже обращайтесь в ЛС. > Пример скриншота ![](https://i.imgur.com/q0MoTdu.png) ### 2. Сделать любую следующую лабораторную (По желанию) Лаба 6 https://portswigger.net/web-security/sql-injection/union-attacks/lab-retrieve-multiple-values-in-single-column Лаба 7 https://portswigger.net/web-security/sql-injection/examining-the-database/lab-querying-database-version-oracle Лаба 8 https://portswigger.net/web-security/sql-injection/examining-the-database/lab-querying-database-version-mysql-microsoft Лаба 9 https://portswigger.net/web-security/sql-injection/examining-the-database/lab-querying-database-version-mysql-microsoft