...
Suppose a system authenticates users by issuing the following query to a SQL database. If the query returns any results, authentication succeeds; otherwise, authentication fails.
Code Block | ||
---|---|---|
| ||
SELECT * FROM db_user WHERE username='<USERNAME>' AND password='<PASSWORD>' |
Suppose an attacker can substitute arbitrary strings for <USERNAME>
and <PASSWORD>
. In that case, the authentication mechanism can be bypassed by supplying the following <USERNAME>
with an arbitrary password:
Code Block | ||
---|---|---|
| ||
validuser' OR '1'='1 |
The authentication routine dynamically constructs the following query:
Code Block | ||
---|---|---|
| ||
SELECT * FROM db_user WHERE username='validuser' OR '1'='1' AND password='<PASSWORD>' |
...
Similarly, an attacker could supply the following string for <PASSWORD>
with an arbitrary username:
Code Block | ||
---|---|---|
| ||
' OR '1'='1 |
producing the following query:
Code Block | ||
---|---|---|
| ||
SELECT * FROM db_user WHERE username='<USERNAME>' AND password='' OR '1'='1' |
...
Failure to sanitize user input before processing or storing it can result in injection attacks.
Rule | Severity | Likelihood | Remediation Cost | Priority | Level |
---|---|---|---|---|---|
IDS00-J | High |
Likely | Medium |
P18 | L1 |
Automated Detection
Tool | Version | Checker | Description |
---|
The Checker Framework |
| Tainting Checker | Trust and security errors (see Chapter 8) |
CodeSonar |
|
JAVA. |
FB.SECURITY.SQL_NONCONSTANT_STRING_PASSED_TO_EXECUTEA prepared statement is generated from a nonconstant String
Nonconstant string passed to execute method on an SQL statement
IO.INJ.SQL | SQL Injection (Java) | ||
Coverity | 7.5 | SQLI | Implemented |
Findbugs | 1.0 | SQL_NONCONSTANT_STRING_PASSED_TO_EXECUTE | Implemented |
Fortify | 1.0 | HTTP_Response_Splitting | Implemented |
Klocwork |
| SV.DATA.DB |
SV.SQL
SQL |
SQL.DBSOURCE |
Implemented |
Parasoft Jtest |
| CERT.IDS00.TDSQL | Protect against SQL injection | |||||||
SonarQube |
|
|
| |||||||||
SpotBugs |
| SQL_NONCONSTANT_STRING_PASSED_TO_EXECUTE | Implemented |
Related Vulnerabilities
CVE-2008-2370 describes a vulnerability in Apache Tomcat 4.1.0 through 4.1.37, 5.5.0 through 5.5.26, and 6.0.0 through 6.0.16. When a RequestDispatcher
is used, Tomcat performs path normalization before removing the query string from the URI, which allows remote attackers to conduct directory traversal attacks and read arbitrary files via a ..
(dot dot) in a request parameter.
Related Guidelines
SEI CERT Perl Coding Standard | IDS33-PL. Sanitize untrusted data passed across a trust boundary |
Injection [RST] | |
CWE-116, Improper Encoding or Escaping of Output |
Android Implementation Details
This rule uses Microsoft SQL Server as an example to show a database connection. However, on Android, DatabaseHelper
from SQLite is used for a database connection. Because Android apps may receive untrusted data via network connections, the rule is applicable.
Bibliography
A Guide to Building Secure Web Applications and Web Services | |
[Seacord 2015] | |
[W3C 2008] | Section 4.4.3, "Included If Validating" |
...
...