# Занятие 1. SQL injection.
###### tags: `Intro to Web Security`

#### Материалы и описание для самостоятельного изучения:
- язык 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-инъекции, чтобы скомпрометировать базовый сервер или другую внутреннюю инфраструктуру, или выполнить атаку с отказом в обслуживании.

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

## Типы SQL инъекций
Существует большое разнообразие уязвимостей, атак и методов внедрения SQL, которые возникают в различных ситуациях. Некоторые распространенные примеры внедрения SQL включают:
- Извлечение скрытых данных, где вы можете изменить SQL-запрос, чтобы вернуть дополнительные результаты.
- Подрыв логики приложения, где вы можете изменить запрос, чтобы вмешаться в логику приложения.
- Атаки объединения (UNION attacks), в которых вы можете извлекать данные из разных таблиц базы данных.
- Изучение базы данных, в которых можно извлечь информацию о версии и структуре базы данных.
- Слепая SQL инъекция, при которой результаты управляемого вами запроса не возвращаются в ответах приложения.

### Извлечение скрытых данных
Рассмотрим приложение для покупок, которое отображает товары в разных категориях и сортирует товары посредством `released`. Tо есть товары с `released = 1` отображаются на главной странице, а с нулевым значением нет. Если мы хотим увидеть скрытые товары с `released = 0`, то нам нужно каким то образом избавиться от этого фильтра. Ключевым моментом здесь является то, что последовательность двойных тире - это индикатор комментариев в SQL и означает, что часть запроса после него интерпретируется как комментарий.

### Подрыв логики приложения
Рассмотрим приложение, которое позволяет пользователям входить в систему с именем пользователя и паролем.
Часто проверка входа осуществляется с помощью такого запроса
`SELECT * FROM table name WHERE username = username AND password = password`
Такой подход не является ошибкой, если присутствует проверка пользовательского ввода, но что если ее нет?

### UNION attacks
B случаях, когда результаты SQL-запроса возвращаются в ответах приложения, злоумышленник может использовать уязвимость внедрения SQL для извлечения данных из других таблиц базы данных. Это делается с помощью ключевого слова `UNION`, которое позволяет выполнить дополнительный запрос `SELECT` и добавить результаты к исходному запросу.
Например, если приложение выполняет следующий запрос, содержащий вводимые пользователем `"Gifts"`:
`SELECT name, description FROM products WHERE category = 'Gifts'`
Тогда злоумышленник может отправить входные данные:
`'UNION SELECT username, password FROM users-- `
Это приведет к тому, что приложение вернет все имена пользователей и пароли вместе с названиями и описаниями продуктов.

#### Определение количества столбцов, необходимых для атаки объединения с помощью SQL-инъекции
При выполнении атаки объединения с помощью SQL-инъекции существует два эффективных метода определения количества столбцов, возвращаемых из исходного запроса. Первый метод включает в себя введение ряда предложений `ORDER BY` и увеличение указанного индекса столбца до тех пор, пока не произойдет ошибка.
Эта серия полезных нагрузок изменяет исходный запрос, чтобы упорядочить результаты по разным столбцам в наборе результатов. Столбец в предложении `ORDER BY` может быть указан по его индексу, поэтому вам не нужно знать имена каких-либо столбцов. Когда указанный индекс столбца превышает количество фактических столбцов в результирующем наборе, база данных возвращает ошибку.
Второй метод включает отправку серии полезных нагрузок `UNION SELECT` с указанием другого количества `NULL` значений
Если количество нулей не совпадает с количеством столбцов, база данных так же возвращает ошибку.
Приложение может фактически вернуть ошибку базы данных в своем HTTP-ответе, или оно может вернуть общую ошибку, или просто не вернуть результатов. При условии, что вы можете обнаружить некоторую разницу в ответе приложения, вы можете определить, сколько столбцов возвращается из запроса.
#### Поиск столбцов с полезным типом данных в атаке объединения с помощью SQL-инъекции
Причина выполнения атаки объединения SQL-инъекций заключается в том, чтобы иметь возможность извлекать результаты из введенного запроса. Как правило, интересные данные, которые вы хотите получить, будут в строковой форме, поэтому вам нужно найти один или несколько столбцов в исходных результатах запроса, тип данных которых соответствует строковым данным или совместим с ними.
Уже определив количество требуемых столбцов, вы можете проверить каждый столбец, чтобы проверить, может ли он содержать строковые данные, отправив серию полезных нагрузок `UNION SELECT`, которые по очереди помещают строковое значение в каждый столбец.
Если тип данных столбца несовместим со строковыми данными, введенный запрос приведет к ошибке базы данных.

### Изучение базы данных
После первоначального выявления уязвимости внедрения SQL, как правило, полезно получить некоторую информацию о самой базе данных. Эта информация часто может проложить путь для дальнейшего использования.
Вы можете запросить сведения о версии базы данных. Способ, которым это делается, зависит от типа базы данных, поэтому вы можете определить тип базы данных, исходя из того, какой метод работает. Например, в Oracle вы можете выполнить:
`SELECT * FROM v$version`
Вы также можете определить, какие таблицы базы данных существуют и какие столбцы они содержат. Например, в большинстве баз данных вы можете выполнить следующий запрос, чтобы вывести список таблиц:
`SELECT * FROM information_schema.tables`

## Конец первой части
Мы узнали основные типы SQL инъекций, разобрали union атаки и способы извлечения данных из БД. Научились находить и использовать эти виды атак. И узнали чем же так опасны SQLi.
На следующей лекции разберем слепые SQL инъекции, научимся их выявлять и извлекать с помощью них информацию. Ну и разберем как же нам собственно не попасть в такую ситуацию и защититься от них.

В видео подробно разобраны первые 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)

Выбираете SQL injection и решаете. Как закончите присылайте скрин [Владу](https://vk.com/vavizh)
По вопросам прохождения ДЗ или Лабораторных тоже обращайтесь в ЛС.
> Пример скриншота

### 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