January 13, 2012 :

sqlsus 0.7.2 is out, bug fix release.

Starting with version 0.7, sqlsus now supports time-based blind injection and automatically detects web server / suhosin / etc.. lentgh restrictions.

Quite a lot of improvements for this release again, see CHANGELOG for more information.

Bug reports, feature requests, and greetings are as always more than welcome, drop me an email !


sqlsus is an open source MySQL injection and takeover tool, written in perl.

Via a command line interface, you can retrieve the database(s) structure, inject your own SQL queries (even complex ones), download files from the web server, crawl the website for writable directories, upload and control a backdoor, clone the database(s), and much more...
Whenever relevant, sqlsus will mimic a MySQL console output.

sqlsus focuses on speed and efficiency, optimising the available injection space, making the best use (I can think of) of MySQL functions.
It uses stacked subqueries and an powerful blind injection algorithm to maximise the data gathered per web server hit.

Using multithreading on top of that, sqlsus is an extremely fast database dumper, be it for inband or blind injection.

If the privileges are high enough, sqlsus will be a great help for uploading a backdoor through the injection point, and takeover the web server.

It uses SQLite as a backend, for an easier use of what has been dumped, and integrates a lot of usual features (see below) such as cookie support, socks/http proxying, https..



Both quoted and numeric injections are supported.

Databases names, tables names, columns names, count(*) per table, privileges... On MySQL > 5, the database structure can be grabbed in one command from within sqlsus.

Discovery of the exact injection space, going through all possible restrictions (web server, suhosin patch...), to inject as much as possible at once.

All quoted texts can be translated as their hex equivalent to bypass any quotes filtering (eg: magic_quotes_gpc) (eg : "sqlsus" will become 0x73716c737573).

sqlsus also supports these types of injection :

  • inband (UNION w/ stacked subqueries) : the result of the request will be in the HTML returned by the web server
  • blind (boolean-based or time-based) : when you can't see the result of the request directly

Support for GET and POST parameters injection vectors.

Support for HTTP proxy and HTTP simple authentication.

Support for HTTPS.

Support for socks proxy.

Support for cookies.

Support for binary data retrieving.

Full SQLite backend, storing queries / results as they come, databases structure, key variables. This allows you to recall a command and its cached answer, even in a later re-use of the session.

Possibility to clone a database / table / column, into a local SQLite database, and continue over different sessions.

If you can't access the information_schema database, or if it doesn't exist, sqlsus will help you bruteforce the names of the tables and columns.

Possibility to change the current database and still use all the commands transparently.

Auto-detection of the length restriction in place, be it the web server or the layer above (eg: suhosin).


If your query is likely to return more than one row, sqlsus will use as many subqueries it can use at a time (per query), staying under a configurable limit.

Therefore, it can grab up to thousands of records in just 1 server hit (depending on the available injection space) (cf inband demo)

Once you have found an inband injection, you need to find the correct number of columns for UNION. sqlsus will do the job for you, identifying the needed number of columns, and which of them are suitable for injection.

To speed things up, multithreading (actually, multiple processes (fork)) can be used.


Blind injection is supported, using conditional responses, and multithreading (actually, again, multiple processes (fork)).

The engine has been optimised in speed and server hit :

  • keep all the threads busy with small relevant tasks.
  • match each item against a few regular expressions, prior to bruteforcing, to determine the character space to use, reducing a lot the number of hits required.


If the database user has the FILE privilege, and if you can use quotes in your injection (mandatory for a SELECT INTO OUTFILE), then sqlsus will help you place a php backdoor on the remote system, recursively looking for writable directories.

You can use download <file> from sqlsus shell, to download an arbitrary (world readable) file from the remote server. The file will be stored in the local filesystem, rebuilding the path tree to the file in the data directory.

sqlsus has the ability to crawl the website at a configurable depth, looking for all the directories it can find, via hypertext links, img links, etc... Then, it tries to upload a tiny php uploader on each candidate directory until it finds one world writable, later used to upload the backdoor itself.

All sqlsus needs (besides what has been said above) is the document_root used server side. You can find it by downloading/reading the relevant files on the web server.

It ships with a PHP backdoor you can upload and a controller, to help you execute system commands, PHP commands, and SQL queries as if you were sitting on a normal direct MySQL connection.

Getting started

Generate a configuration file with sqlsus --genconf my.cfg, read the comments and adapt it to reflect your target.

Launch sqlsus, with your configuration as a parameter sqlsus my.cfg, you will get a shell.

Type help and follow your instincts :)


sqlsus expects the terminal to be in UTF-8.



sqlsus is released under the GNU GPL version 3 or later.


Use it at your own risk.

Just keep in mind that whatever you do with this tool, the author (aka me, not you) won't be held responsible for anything.


Jérémy Ruffet (sativouf) : sativouf <at> gmail -dot- com