# 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 (Сложность: Низкая)