Skip to main content

Time-based SQL Injection


In a time-based attack, someone could inject a SQL command to the server with code to force a delay in the execution of the queries or with a heavy query that generates this time delay. Depending on the time response, it is possible to deduct some information and determine if a vulnerability is present to exploit it.


  • Allow an attacker to interfere with the queries that an application makes to its database.
  • Retrieve information from the database an even extract data.
  • Affect the authentication and authorization aspects of the application.
  • Steal sensitive information stored in databases.


  • Use of prepared statements (with parameterized queries).
  • Use of stored procedures.
  • Enforcing the least privilege.


Atacante anónimo desde intranet.

Expected Remediation Time

⌚ 60 minutes.


Default score using CVSS 3.1. It may change depending on the context of the vulnerability.


  • Attack vector: N
  • Attack complexity: L
  • Privileges required: N
  • User interaction: N
  • Scope: U
  • Confidentiality: L
  • Integrity: L
  • Availability: L


  • Exploit code madurity: X
  • Remediation level: X
  • Report confidence: X


  • Vector string: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:L/E:X/RL:X/RC:X
  • Score:
    • Base: 7.3
    • Temporal: 7.3
  • Severity:
    • Base: High
    • Temporal: High

Code Examples

Compliant code

The application performs queries using standardized and sanitized parameters

static void getQuery(param){
param =, ""UTF-8"");
//Clean User parameters
cleanParam = getCleanValue(param)
//Do Query with a standard sentence
String sql = ""INSERT INTO users (username, password) VALUES ('foo','""+ cleanParam + ""')"";

try {
java.sql.Statement statement = org.owasp.benchmark.helpers.DatabaseHelper.getSqlStatement();
org.owasp.benchmark.helpers.DatabaseHelper.outputUpdateComplete(sql, response);
} catch (java.sql.SQLException e) {
### Non compliant code

The application contains possible harmful time-delay query
static void getQuery(userSql){
try {
java.sql.Statement statement = org.owasp.benchmark.helpers.DatabaseHelper.getSqlStatement();

// make query without filtering user input
org.owasp.benchmark.helpers.DatabaseHelper.outputUpdateComplete(sql, response);
} catch (java.sql.SQLException e) {