CWE-89: Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection')

What is CWE-89?

CWE-89 is Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection'). The flaw arises when The product builds all or part of an SQL command from externally influenced input but fails to neutralize, or incorrectly neutralizes, special elements that can alter the intended command. The database currently holds 2,400 vulnerabilities mapped to CWE-89 and 8 of them are in the CISA Known Exploited Vulnerabilities catalog.

OWASP TOP 10:2025 RANK5 — A05:2025 — Injection
Related CVES (365 days)2,400
AbstractionBase
Likelihood of exploitHigh

Vulnerabilities mapped to CWE-89

2,400 vulnerabilities122% increase year over year

Vulnerabilities in CISA KEV for CWE-89

8 vulnerabilities300% increase year over year

Official definition

ByMitre CWE

The product constructs all or part of an SQL command using externally-influenced input from an upstream component, but it does not neutralize or incorrectly neutralizes special elements that could modify the intended SQL command when it is sent to a downstream component. Without sufficient removal or quoting of SQL syntax in user-controllable inputs, the generated SQL query can cause those inputs to be interpreted as SQL instead of ordinary user data.

Detailed description

The product receives externally influenced data through an upstream component and uses it to construct an SQL command sent to a downstream component. If control syntax is not separated from data through an appropriate mechanism, SQL characters or structures in the input can change the meaning of the original query. The weakness commonly results from dynamic query-string construction, incorrect quoting or escaping, and can occur even when the input is expected to be a numeric identifier, username, password, or other business field.

Characteristics

This weakness is introduced during implementation and commonly appears in data-rich applications that store user input in databases. It is not specific to one programming language, but is associated with SQL and database servers when data from an upstream component is incorporated into a command for a downstream component without preserving the boundary between data and syntax. SQL injection can occur through many input types, including fields expected to contain numbers, and can affect an application directly or through an intermediary library or API.

Common consequences

Potential consequences span confidentiality, integrity, availability, authentication, and access control. An attacker may read sensitive application data, modify or delete database contents, bypass authentication or authorization, gain another user's identity or privileges, and in some environments execute unauthorized commands by redirecting SQL output to an executable file. The actual impact depends on the database capabilities, the application's account privileges, the affected queries, and the sensitivity of the accessible data.

ImpactScopeExplanation
Execute Unauthorized Code or CommandsConfidentiality, Integrity, AvailabilityAdversaries could execute system commands, typically by changing the SQL statement to redirect output to a file that can then be executed.
Read Application DataConfidentialitySince SQL databases generally hold sensitive data, loss of confidentiality is a frequent problem with SQL injection vulnerabilities.
Gain Privileges or Assume Identity, Bypass Protection MechanismAuthenticationIf poor SQL commands are used to check user names and passwords or perform other kinds of authentication, it may be possible to connect to the product as another user with no previous knowledge of the password.
Bypass Protection MechanismAccess ControlIf authorization information is held in a SQL database, it may be possible to change this information through the successful exploitation of a SQL injection vulnerability.
Modify Application DataIntegrityJust as it may be possible to read sensitive information, it is also possible to modify or even delete this information with a SQL injection attack.

Risk mitigations

Prevent code and data mixing. Prefer vetted persistence libraries or frameworks that provide safe database constructs, such as Hibernate or Enterprise Java Beans when used correctly. Process SQL with prepared statements, parameterized queries, or strongly typed stored procedures, and do not dynamically build and execute query strings inside them using exec or similar functionality.

Constrain inputs and mappings. Treat all external input as malicious and apply strict allowlists covering the expected type, length, syntax, range, related-field consistency, and business rules. Input validation is defense in depth rather than a replacement for correct encoding, escaping, and quoting, especially for free-form text. Where acceptable objects are known, map fixed input values such as numeric IDs to those objects and reject other values. Duplicate client-side security checks on the server.

Protect unavoidable dynamic construction. If dynamic query construction cannot be avoided, properly quote arguments and escape special characters. Use the strictest practical allowlist, and use database or language facilities such as Oracle DBMS_ASSERT or the MySQL mysql_real_escape_string API where applicable. This approach remains risky and must also consider argument injection.

Reduce impact and information disclosure. Run database accounts with least privilege, preferably isolated accounts limited to one task, and grant only the minimum permissions on database objects. Do not run ordinary database applications as an administrator; restrict access to the caller's permitted data and use the strictest stored-procedure permissions possible. Keep error messages minimal and avoid exposing SQL query structure or inconsistent internal state; retain necessary detail in carefully protected logs and never log passwords. In PHP, do not use register_globals and do not emulate it in a way that introduces related weaknesses.

Add operational defense in depth. An application firewall can detect and block attacks when code cannot immediately be fixed, or provide emergency protection while stronger assurance measures are applied. Its coverage is limited, and it may be bypassed, interfere with legitimate requests, or require customization.

  1. Libraries or Frameworks · Architecture and DesignUse a vetted library or framework that does not allow this weakness to occur or provides constructs that make this weakness easier to avoid [REF-1482]. For example, consider using persistence layers such as Hibernate or Enterprise Java Beans, which can provide significant protection against SQL injection if used properly.
  2. Parameterization · Architecture and DesignIf available, use structured mechanisms that automatically enforce the separation between data and code. These mechanisms may be able to provide the relevant quoting, encoding, and validation automatically, instead of relying on the developer to provide this capability at every point where output is generated. Process SQL queries using prepared statements, parameterized queries, or stored procedures. These features should accept parameters or variables and support strong typing. Do not dynamically construct and execute query strings within these features using "exec" or similar functionality, since this may re-introduce the possibility of SQL injection. [REF-867]
  3. Environment Hardening · Architecture and Design, OperationRun your code using the lowest privileges that are required to accomplish the necessary tasks [REF-76]. If possible, create isolated accounts with limited privileges that are only used for a single task. That way, a successful attack will not immediately give the attacker access to the rest of the software or its environment. For example, database applications rarely need to run as the database administrator, especially in day-to-day operations. Specifically, follow the principle of least privilege when creating user accounts to a SQL database. The database users should only have the minimum privileges necessary to use their account. If the requirements of the system indicate that a user can read and modify their own data, then limit their privileges so they cannot read/write others' data. Use the strictest permissions possible on all database objects, such as execute-only for stored procedures.
  4. Architecture and DesignFor any security checks that are performed on the client side, ensure that these checks are duplicated on the server side, in order to avoid CWE-602. Attackers can bypass the client-side checks by modifying values after the checks have been performed, or by changing the client to remove the client-side checks entirely. Then, these modified values would be submitted to the server.
  5. Output Encoding · ImplementationWhile it is risky to use dynamically-generated query strings, code, or commands that mix control and data together, sometimes it may be unavoidable. Properly quote arguments and escape any special characters within those arguments. The most conservative approach is to escape or filter all characters that do not pass an extremely strict allowlist (such as everything that is not alphanumeric or white space). If some special characters are still needed, such as white space, wrap each argument in quotes after the escaping/filtering step. Be careful of argument injection (CWE-88). Instead of building a new implementation, such features may be available in the database or programming language. For example, the Oracle DBMS_ASSERT package can check or enforce that parameters have certain properties that make them less vulnerable to SQL injection. For MySQL, the mysql_real_escape_string() API function is available in both C and PHP.
  6. Input Validation · ImplementationAssume all input is malicious. Use an "accept known good" input validation strategy, i.e., use a list of acceptable inputs that strictly conform to specifications. Reject any input that does not strictly conform to specifications, or transform it into something that does. When performing input validation, consider all potentially relevant properties, including length, type of input, the full range of acceptable values, missing or extra inputs, syntax, consistency across related fields, and conformance to business rules. As an example of business rule logic, "boat" may be syntactically valid because it only contains alphanumeric characters, but it is not valid if the input is only expected to contain colors such as "red" or "blue." Do not rely exclusively on looking for malicious or malformed inputs. This is likely to miss at least one undesirable input, especially if the code's environment changes. This can give attackers enough room to bypass the intended validation. However, denylists can be useful for detecting potential attacks or determining which inputs are so malformed that they should be rejected outright. When constructing SQL query strings, use stringent allowlists that limit the character set based on the expected value of the parameter in the request. This will indirectly limit the scope of an attack, but this technique is less important than proper output encoding and escaping. Note that proper output encoding, escaping, and quoting is the most effective solution for preventing SQL injection, although input validation may provide some defense-in-depth. This is because it effectively limits what will appear in output. Input validation will not always prevent SQL injection, especially if you are required to support free-form text fields that could contain arbitrary characters. For example, the name "O'Reilly" would likely pass the validation step, since it is a common last name in the English language. However, it cannot be directly inserted into the database because it contains the "'" apostrophe character, which would need to be escaped or otherwise handled. In this case, stripping the apostrophe might reduce the risk of SQL injection, but it would produce incorrect behavior because the wrong name would be recorded. When feasible, it may be safest to disallow meta-characters entirely, instead of escaping them. This will provide some defense in depth. After the data is entered into the database, later processes may neglect to escape meta-characters before use, and you may not have control over those processes.
  7. Enforcement by Conversion · Architecture and DesignWhen the set of acceptable objects, such as filenames or URLs, is limited or known, create a mapping from a set of fixed input values (such as numeric IDs) to the actual filenames or URLs, and reject all other inputs.
  8. ImplementationEnsure that error messages only contain minimal details that are useful to the intended audience and no one else. The messages need to strike the balance between being too cryptic (which can confuse users) or being too detailed (which may reveal more than intended). The messages should not reveal the methods that were used to determine the error. Attackers can use detailed information to refine or optimize their original attack, thereby increasing their chances of success. If errors must be captured in some detail, record them in log messages, but consider what could occur if the log messages can be viewed by attackers. Highly sensitive information such as passwords should never be saved to log files. Avoid inconsistent messaging that might accidentally tip off an attacker about internal state, such as whether a user account exists or not. In the context of SQL Injection, error messages revealing the structure of a SQL query can help attackers tailor successful attack strings.
  9. Firewall · Operation · Effectiveness: ModerateUse an application firewall that can detect attacks against this weakness. It can be beneficial in cases in which the code cannot be fixed (because it is controlled by a third party), as an emergency prevention measure while more comprehensive software assurance measures are applied, or to provide defense in depth [REF-1481.An application firewall might not cover all possible input vectors. In addition, attack techniques might be available to bypass the protection mechanism, such as using malformed inputs that can still be processed by the component that receives those inputs. Depending on functionality, an application firewall might inadvertently reject or modify legitimate requests. Finally, some manual effort may be required for customization.
  10. Environment Hardening · Operation, ImplementationWhen using PHP, configure the application so that it does not use register_globals. During implementation, develop the application so that it does not rely on this feature, but be wary of implementing a register_globals emulation that is subject to weaknesses such as CWE-95, CWE-621, and similar issues.

Detection methods

Detection can use automated static analysis on source code, bytecode, or binaries; automated dynamic analysis with fuzzing, robustness testing, fault injection, database scanners, web application scanners, and web services scanners; manual source-code or design analysis; and manual interpretation of results from fuzz testers and framework-based fuzzers. Static analysis may produce false positives when it cannot recognize valid input handling, or false negatives when custom APIs and third-party libraries indirectly invoke SQL; no method provides perfect accuracy or coverage, and manual analysis may be constrained by time and attack-surface size. The record rates source-code weakness analysis, bytecode or binary analysis, database scanners, manual source review, and architecture or design review as highly cost effective; fuzzing and some application or service scanners may provide only partial coverage.

MethodApproachEffectiveness
Automated Static AnalysisThis weakness can often be detected using automated static analysis tools. Many modern tools use data flow analysis or constraint-based techniques to minimize the number of false positives. Automated static analysis might not be able to recognize when proper input validation is being performed, leading to false positives - i.e., warnings that do not have any security consequences or do not require any code changes. Automated static analysis might not be able to detect the usage of custom API functions or third-party libraries that indirectly invoke SQL commands, leading to false negatives - especially if the API/library code is not available for analysis.This is not a perfect solution, since 100% accuracy and coverage are not feasible.-
Automated Dynamic AnalysisThis weakness can be detected using dynamic tools and techniques that interact with the software using large test suites with many diverse inputs, such as fuzz testing (fuzzing), robustness testing, and fault injection. The software's operation may slow down, but it should not become unstable, crash, or generate incorrect results.Moderate
Manual AnalysisManual analysis can be useful for finding this weakness, but it might not achieve desired code coverage within limited time constraints. This becomes difficult for weaknesses that must be considered for all inputs, since the attack surface can be too large.-
Automated Static Analysis - Binary or BytecodeAccording to SOAR [REF-1479], the following detection techniques may be useful: ``` Highly cost effective: ``` Bytecode Weakness Analysis - including disassembler + source code weakness analysis Binary Weakness Analysis - including disassembler + source code weakness analysisHigh
Dynamic Analysis with Automated Results InterpretationAccording to SOAR [REF-1479], the following detection techniques may be useful: ``` Highly cost effective: ``` Database Scanners ``` Cost effective for partial coverage: ``` Web Application Scanner Web Services ScannerHigh
Dynamic Analysis with Manual Results InterpretationAccording to SOAR [REF-1479], the following detection techniques may be useful: ``` Cost effective for partial coverage: ``` Fuzz Tester Framework-based FuzzerSOAR Partial
Manual Static Analysis - Source CodeAccording to SOAR [REF-1479], the following detection techniques may be useful: ``` Highly cost effective: ``` Manual Source Code Review (not inspections) ``` Cost effective for partial coverage: ``` Focused Manual Spotcheck - Focused manual analysis of sourceHigh
Automated Static Analysis - Source CodeAccording to SOAR [REF-1479], the following detection techniques may be useful: ``` Highly cost effective: ``` Source code Weakness Analyzer Context-configured Source Code Weakness AnalyzerHigh
Architecture or Design ReviewAccording to SOAR [REF-1479], the following detection techniques may be useful: ``` Highly cost effective: ``` Formal Methods / Correct-By-Construction ``` Cost effective for partial coverage: ``` Inspection (IEEE 1028 standard) (can apply to requirements, design, source code, etc.)High

Representative vulnerabilities

The following are representative examples recorded by the entry, not an exhaustive list:

  • CVE-2024-6847: SQL injection in an AI chatbot through a conversation message.
  • CVE-2025-26794: SQL injection in an email agent through SQLite integration.
  • CVE-2023-32530: SQL injection in a security product dashboard through crafted certificate fields.
  • CVE-2021-42258, CVE-2021-27101, and CVE-2020-12271: cases in time and billing software, a file-transfer system, and a firewall product's administrative interface or user portal; the record notes exploitation in the wild for these cases.
  • CVE-2019-3792: an API in a Go automation system allowed an attacker to read privileged data.
  • CVE-2004-0366: a chain involving a database-authentication library led to SQL injection and authentication bypass.
  • CVE-2008-2790 and CVE-2008-2223: SQL injection through identifiers expected to be numeric.
  • CVE-2007-6602 and CVE-2008-5817: SQL injection through username, or username and password, fields.
  • CVE-2003-0377, CVE-2008-2380, and CVE-2017-11508: cases in a security product, an authentication library, and a vulnerability-management and reporting tool, involving crafted group names, an authentication library, and a crafted password respectively.
Sources (2)

CWE™ Program, operated by The MITRE Corporation. Copyright © 2006–2026, The MITRE Corporation. The MITRE Corporation hereby grants you a non-exclusive, royalty-free license to use CWE for research, development, and commercial purposes. CWE Terms of Use.

Learn more

Run an in-depth assessment with complete web risk management

CyStack VulnScan continuously discovers assets, validates vulnerabilities, and helps security teams prioritize remediation across the organization.