---
# System prepended metadata

title: Занятие 1. SQL injection.
tags: [Intro to Web Security]

---

# Занятие 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