A05:2025 Инъекции 
Общие сведения.
Инъекции опустились на две позиции — с 3-го на 5-е место, сохранив своё положение относительно A04:2025-Криптографические сбои и A06:2025-Небезопасное проектирование. Инъекции — одна из наиболее тестируемых категорий: 100% приложений проверяются на тот или иной вид инъекций. Категория имеет наибольшее число CVE среди всех — 37 CWE. Инъекции включают Cross-site Scripting (высокая частота/низкое воздействие) с более чем 30 тыс. CVE и SQL-инъекции (низкая частота/высокое воздействие) с более чем 14 тыс. CVE. Огромное количество CVE для CWE-79 снижает средневзвешенное воздействие данной категории.
Таблица оценок.
| Число CWE | Макс. частота встречаемости | Ср. частота встречаемости | Макс. охват | Ср. охват | Ср. взвешенная эксплуатируемость | Ср. взвешенное воздействие | Общее число встречаемостей | Общее число CVE |
| 37 | 13,77% | 3,08% | 100,00% | 42,93% | 7,15 | 4,32 | 1 404 249 | 62 445 |
Описание.
Уязвимость инъекции — это дефект приложения, позволяющий ненадёжным пользовательским данным передаваться интерпретатору (браузеру, базе данных, командной строке и т.д.) и вынуждающий интерпретатор выполнять части этих данных как команды.
Приложение уязвимо к атакам, когда:
- Пользовательские данные не проверяются, не фильтруются и не очищаются приложением.
- Динамические запросы или непараметризованные вызовы без контекстно-зависимого экранирования используются непосредственно в интерпретаторе.
- Неочищенные данные используются в параметрах поиска ORM для извлечения дополнительных конфиденциальных записей.
- Потенциально враждебные данные используются напрямую или конкатенируются. SQL или команда содержит структуру и вредоносные данные в динамических запросах, командах или хранимых процедурах.
К наиболее распространённым инъекциям относятся SQL, NoSQL, команды ОС, ORM, LDAP и Expression Language (EL) или OGNL. Обнаружение лучше всего достигается сочетанием ревью исходного кода и автоматизированного тестирования (включая фаззинг) всех параметров, заголовков, URL, cookies, JSON, SOAP и XML. Добавление инструментов SAST, DAST и IAST в CI/CD-конвейер также может помочь выявить уязвимости инъекций до выпуска в производство.
Смежный класс уязвимостей инъекций стал распространённым в LLM. Они отдельно рассматриваются в OWASP LLM Top 10, в частности LLM01:2025 Prompt Injection.
Как предотвратить.
Лучший способ предотвращения инъекций — разделение данных и команд/запросов:
- Предпочтительный вариант — использовать безопасный API, полностью исключающий использование интерпретатора, предоставляющий параметризованный интерфейс или выполняющий переход на ORM. Примечание: Даже при использовании параметризации хранимые процедуры могут содержать SQL-инъекцию, если PL/SQL или T-SQL конкатенирует запросы и данные или выполняет враждебные данные с помощью EXECUTE IMMEDIATE или exec().
Если разделить данные и команды невозможно, можно снизить угрозы следующими методами.
- Используйте позитивную проверку входных данных на стороне сервера. Это не является исчерпывающей защитой, так как многие приложения требуют специальных символов, например текстовые поля или API для мобильных приложений.
- Для оставшихся динамических запросов экранируйте специальные символы, используя синтаксис экранирования, специфичный для данного интерпретатора. Примечание: Структуры SQL, такие как имена таблиц, столбцов и т.д., не могут быть экранированы, поэтому предоставленные пользователем имена структур опасны. Это распространённая проблема в программах для создания отчётов.
Предупреждение: Эти методы включают разбор и экранирование сложных строк, что делает их подверженными ошибкам и ненадёжными при незначительных изменениях базовой системы.
Примеры сценариев атак.
Сценарий №1: Приложение использует ненадёжные данные при формировании следующего уязвимого SQL-запроса:
String query = "SELECT * FROM accounts WHERE custID='" + request.getParameter("id") + "'";
Злоумышленник изменяет значение параметра 'id' в браузере: ' OR '1'='1. Например:
http://example.com/app/accountView?id=' OR '1'='1
Это изменяет смысл запроса, возвращая все записи из таблицы accounts. Более опасные атаки могут изменять или удалять данные или даже вызывать хранимые процедуры.
Сценарий №2: Чрезмерное доверие приложения к фреймворкам может привести к уязвимым запросам. Например, Hibernate Query Language (HQL):
Query HQLQuery = session.createQuery("FROM accounts WHERE custID='" + request.getParameter("id") + "'");
Злоумышленник передаёт: ' OR custID IS NOT NULL OR custID='. Это обходит фильтр и возвращает все учётные записи. Хотя HQL имеет меньше опасных функций, чем обычный SQL, он всё равно допускает несанкционированный доступ к данным при конкатенации ввода.
Сценарий №3: Приложение передаёт пользовательский ввод напрямую в команду ОС:
String cmd = "nslookup " + request.getParameter("domain");
Runtime.getRuntime().exec(cmd);
Злоумышленник передаёт example.com; cat /etc/passwd для выполнения произвольных команд на сервере.
Ссылки.
- OWASP Proactive Controls: Secure Database Access
- OWASP ASVS: V5 Input Validation and Encoding
- OWASP Testing Guide: SQL Injection, Command Injection, и ORM Injection
- OWASP Cheat Sheet: Injection Prevention
- OWASP Cheat Sheet: SQL Injection Prevention
- OWASP Cheat Sheet: Injection Prevention in Java
- OWASP Cheat Sheet: Query Parameterization
- OWASP Automated Threats to Web Applications – OAT-014
- PortSwigger: Server-side template injection
- Awesome Fuzzing: a list of fuzzing resources
Список связанных CWE
-
CWE-76 Improper Neutralization of Equivalent Special Elements
-
CWE-77 Improper Neutralization of Special Elements used in a Command ('Command Injection')
-
CWE-78 Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection')
-
CWE-79 Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')
-
CWE-80 Improper Neutralization of Script-Related HTML Tags in a Web Page (Basic XSS)
-
CWE-83 Improper Neutralization of Script in Attributes in a Web Page
-
CWE-86 Improper Neutralization of Invalid Characters in Identifiers in Web Pages
-
CWE-88 Improper Neutralization of Argument Delimiters in a Command ('Argument Injection')
-
CWE-89 Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection')
-
CWE-90 Improper Neutralization of Special Elements used in an LDAP Query ('LDAP Injection')
-
CWE-93 Improper Neutralization of CRLF Sequences ('CRLF Injection')
-
CWE-94 Improper Control of Generation of Code ('Code Injection')
-
CWE-95 Improper Neutralization of Directives in Dynamically Evaluated Code ('Eval Injection')
-
CWE-96 Improper Neutralization of Directives in Statically Saved Code ('Static Code Injection')
-
CWE-97 Improper Neutralization of Server-Side Includes (SSI) Within a Web Page
-
CWE-99 Improper Control of Resource Identifiers ('Resource Injection')
-
CWE-113 Improper Neutralization of CRLF Sequences in HTTP Headers ('HTTP Response Splitting')
-
CWE-159 Improper Handling of Invalid Use of Special Elements
-
CWE-470 Use of Externally-Controlled Input to Select Classes or Code ('Unsafe Reflection')
-
CWE-610 Externally Controlled Reference to a Resource in Another Sphere
-
CWE-643 Improper Neutralization of Data within XPath Expressions ('XPath Injection')
-
CWE-644 Improper Neutralization of HTTP Headers for Scripting Syntax