A05:2025 Injection 
Background.
Injection falls two spots from #3 to #5 in the ranking, maintaining its position relative to A04:2025-Cryptographic Failures and A06:2025-Insecure Design. Injection is one of the most tested categories with 100% of applications tested for some form of injection. It had the greatest number of CVEs for any category, with 37 CWEs in this category. Injection includes Cross-site Scripting (high frequency/low impact) with more than 30k CVEs and SQL Injection (low frequency/high impact) with more than 14k CVEs. The massive number of reported CVEs for CWE-79 Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting') brings down the average weighted impact of this category.
Score table.
| CWEs Mapped | Max Incidence Rate | Avg Incidence Rate | Max Coverage | Avg Coverage | Avg Weighted Exploit | Avg Weighted Impact | Total Occurrences | Total CVEs |
| 37 | 13.77% | 3.08% | 100.00% | 42.93% | 7.15 | 4.32 | 1,404,249 | 62,445 |
Description.
An injection vulnerability is a system flaw that allows an attacker to insert malicious code or commands (such as SQL or shell code) into a program’s input fields, tricking the system into executing the code or commands as if it were part of the system. This can lead to truly dire consequences.
An application is vulnerable to attack when:
- User-supplied data is not validated, filtered, or sanitized by the application.
- Dynamic queries or non-parameterized calls without context-aware escaping are used directly in the interpreter.
- Unsanitized data is used within object-relational mapping (ORM) search parameters to extract additional, sensitive records.
- Potentially hostile data is directly used or concatenated. The SQL or command contains the structure and malicious data in dynamic queries, commands, or stored procedures.
Some of the more common injections are SQL, NoSQL, OS command, Object Relational Mapping (ORM), LDAP, and Expression Language (EL) or Object Graph Navigation Library (OGNL) injection. The concept is identical among all interpreters. Detection is best achieved by a combinatino of source code review along with automated testing (including fuzzing) of all parameters, headers, URL, cookies, JSON, SOAP, and XML data inputs. The addition of static (SAST), dynamic (DAST), and interactive (IAST) application security testing tools into the CI/CD pipeline can also be helpful to identify injection flaws before production deployment.
A related class of injection vulnerabilities has become common in LLMs. These are discussed separately in the OWASP LLM Top 10, specifically LLM01:2025 Prompt Injection.
How to prevent.
The best means to prevent injection requires keeping data separate from commands and queries:
- The preferred option is to use a safe API, which avoids using the interpreter entirely, provides a parameterized interface, or migrates to Object Relational Mapping Tools (ORMs). Note: Even when parameterized, stored procedures can still introduce SQL injection if PL/SQL or T-SQL concatenates queries and data or executes hostile data with EXECUTE IMMEDIATE or exec().
When it is not possible to separate the data from commands, you can reduce threats using the following techniques.
- Use positive server-side input validation. This is not a complete defense as many applications require special characters, such as text areas or APIs for mobile applications.
- For any residual dynamic queries, escape special characters using the specific escape syntax for that interpreter. Note: SQL structures such as table names, column names, and so on cannot be escaped, and thus user-supplied structure names are dangerous. This is a common issue in report-writing software.
Warning these techniques involve parsing and escaping complex strings, making them error-prone and not robust in the face of minor changes to the underlying system.
Example attack scenarios.
Scenario #1: An application uses untrusted data in the construction of the following vulnerable SQL call:
String query = "SELECT \* FROM accounts WHERE custID='" + request.getParameter("id") + "'";
Scenario #2: Similarly, an application’s blind trust in frameworks may result in queries that are still vulnerable, (e.g., Hibernate Query Language (HQL)):
Query HQLQuery = session.createQuery("FROM accounts WHERE custID='" + request.getParameter("id") + "'");
In both cases, the attacker modifies the ‘id’ parameter value in their browser to send: ' UNION SLEEP(10);--. For example:
http://example.com/app/accountView?id=' UNION SELECT SLEEP(10);--
This changes the meaning of both queries to return all the records from the accounts table. More dangerous attacks could modify or delete data or even invoke stored procedures.
References.
- OWASP Proactive Controls: Secure Database Access
- OWASP ASVS: V5 Input Validation and Encoding
- OWASP Testing Guide: SQL Injection, Command Injection, and 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
List of Mapped CWEs
-
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