# 0x02 - Injections I
**OWASP Top 10:2017 - A1. Инъекции**
Знакомство с первыми уязвимостями инъекции на примере **инъекций команд** и **конструкций SQL**
Содержание:
- Уязвимости инъекции
- Инъекции команд ОС
- Что такое инъекции команд?
- Как возникают инъекции команд?
- Как предотвратить инъекции команд?
- Инъекции управляющих конструкций SQL
- Что такое SQL инъекция?
- Какой ущерб несут уязвимости к инъекции
- Примеры SQL инъекций
- Как предотвращать SQL инъекции?
## Уязвимости инъекции
Уязвимости, связанные, например, с внедрением SQL, NoSQL, OS и LDAP, возникают, когда непроверенные данные отправляются интерпретатору в составе команды или запроса. Вредоносные данные могут заставить интерпретатор выполнить непредусмотренные команды или обратиться к данным без прохождения соответствующей авторизации.
Внедрения особенно распространены в старом коде. Уязвимости часто встречаются в SQL- LDAP-, XPathили NoSQL-запросах, системных командах, XMLобработчиках, SMTP-заголовках, языках выражений и ORM-запросах. Внедрения легко обнаружить при анализе кода. Сканеры и фаззеры могут помочь злоумышленникам найти подобные уязвимости.
## Инъекции команд ОС
### Что такое инъекции команд?
Инъекция команд ОС (также известная как shell инъекция) является уязвимостью веб-приложений, которая позволяет злоумышленнику выполнять произвольные команды операционной системы (ОС) на сервере, на котором запущено приложение, и, как правило, дает возможность полностью скомпрометировать приложение и все его данные. Очень часто злоумышленник может использовать уязвимость внедрения команд ОС для компрометации других частей инфраструктуры, используя доверительные отношения для перенаправления атаки на другие системы в организации.
### Как возникают инъекции команд?
Пример уязвимости инъекции команд:
```php=
$command = 'convert -pointsize 72 label:Hello ' . $_FILES['userfile']['name'];
system($command);
```
Пример эксплуатации для уязвимости выше:
```http=
------WebKitFormBoundaryePkpFF7tjBAqx29L
Content-Disposition: form-data; name="userfile"; filename="check | ls -la;"
Content-Type: application/x-object
... contents of file goes here ...
```
### Как предотвратить инъекции команд?
На сегодняшний день наиболее эффективным способом предотвращения уязвимостей инъекции команд ОС является никогда не вызывать команды ОС из кода прикладного уровня. Практически в каждом случае существуют альтернативные способы реализации требуемой функциональности с использованием более безопасных платформенных API.
1. **Избегать прямого выполнения команд ОС**. Для огромного количества различных функций реализованы библиотеки.
2. Использовать функции языка для **вызова других программ без обращения к оболочке ОС** (proc_open в PHP)
3. **Не передавать пользовательский ввод** в командную оболочку.
4. В крайнем случае **используйте специальные функции для экранирования** (escapeshellargs в PHP)
5. https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/overview (для .Net)
Если считается неизбежным вызывать команды ОС с пользовательским вводом, то должна быть выполнена серьезная проверка вводимых данных:
1. Соответствие типу данных
2. Корректность формата
3. Регулярные выражения
4. Разрешенный набор символов
## Инъекции управляющих конструкций SQL
### Что такое SQL инъекция?
SQL-инъекция - это уязвимость веб-приложений, позволяющая злоумышленнику вмешиваться в запросы, которые приложение делает к своей базе данных. Как правило, она позволяет злоумышленнику просматривать данные, которые он, как правило, не может получить. Сюда могут входить данные, принадлежащие другим пользователям, или любые другие данные, к которым само приложение может получить доступ. Во многих случаях злоумышленник может изменять или удалять эти данные, вызывая постоянные изменения содержимого или поведения приложения.
В некоторых ситуациях злоумышленник может эскалировать атаку SQL-инъекции, чтобы скомпрометировать сервер или другую внутреннюю инфраструктуру, или выполнить атаку типа "отказа в обслуживании".
### Какой ущерб несут уязвимости к инъекции SQL?
Успешная атака SQL-инъекции может привести к несанкционированному доступу к конфиденциальным данным, таким как пароли, данные кредитной карты или личная информация пользователя. Многие громкие утечки данных в последние годы стали результатом атак SQL-инъекции, что привело к репутационному ущербу и штрафам со стороны регулирующих органов. В некоторых случаях злоумышленник может получить постоянный черный ход в системы организации, что приводит к долгосрочному закреплению злоумышленника в инфраструктуре, которое может оставаться незамеченным длительный период времени.
В частности, уязвимости SQL-инъекций могут приводить к:
- Извлечению данных и возможности исследования базы данных
- Модификации информации в базе данных (удалению, добавлению, изменению)
- Обходу логики
- Обходу механизмов авторизации и аутентификации
- Чтению файлов ОС
- Выполнению команд ОС
- Отказу в обслуживании
### Примеры SQL инъекций
**Сценарий №1** Приложение использует недоверенные данные при создании следующего уязвимого SQL-вызова:
```sql=
String query = "SELECT * FROM accounts WHERE custID='" + request.getParameter("id") + "'";
```
**Сценарий №2** Безоговорочное доверие приложений к фреймворкам может привести к появлению уязвимых запросов (например, в языке запросов HQL):
```sql=
Query HQLQuery = session.createQuery("FROM accounts WHERE custID='" + request.getParameter("id") + "'");
```
В обоих случаях злоумышленник изменяет в своем браузере значение параметра "id" для отправки `' or '1'='1`.
Например:
`http://example.com/app/accountView?id='+or+'1'='1`
Изменение обоих запросов позволяет получить все записи из таблицы учетных данных. Более серьезные атаки позволяют изменить или удалить.
**Сценарий №3** Использование фреймворков, кажущееся безопасным, может быть обманчивым (Пример использования фреймворка Ruby On Rails и Active Records):
```sql=
User.order("#{params[:sortby]} ASC")
```
Кажущийся безопасным вызов `.order()` на самом деле не экранирует управляющих конструкций получаемых от приложения, что приводит к возможности проведения атак на базу данных, через такой вектор как:
```sql=
(CASE SUBSTR(password, 1, 1) WHEN 's' THEN 0 else 1 END)
```
#### О техниках атак
Существует широкий спектр уязвимостей, атак и методов SQL инъекции, которые возникают в различных ситуациях. К числу наиболее распространенных примеров SQL-инъекций относятся:
- SQL Injection Bypass
- Stacked queries
- Union-based
- Error-based
- Boolean blind
- Time-base
- Out of band
### Как предотвращать SQL инъекции?
Большинство случаев SQL-инъекции можно предотвратить, используя параметризованные запросы (также известные как "prepared statements") вместо конкатенации строк внутри запроса.
Также, от SQL-инъекций спасает концепция ORM (Object-Relational Mapping), но не следует ей слепо доверять.
## Дополнительные материалы
:::success
- [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/)
- https://en.wikipedia.org/wiki/List_of_object–relational_mapping_software
:::
### Примеры из Тинькофф Банка
:::danger
- https://jira.tcsbank.ru/browse/IBUL-5866
- https://jira.tcsbank.ru/browse/INFDEV-3156
- https://jira.tcsbank.ru/browse/IBUL-6509
- https://jira.tcsbank.ru/browse/FOCRM-164
:::
## Упражнения
### Упражнение 1
Инъекция команды ОС, простой случай - https://portswigger.net/web-security/os-command-injection/lab-simple (Сложность: Низкая)
### Упражнение 2
UNION-based атака SQL инъекции, на извлечение данных из других таблиц - https://portswigger.net/web-security/sql-injection/union-attacks/lab-retrieve-data-from-other-tables (Сложность: Низкая)