mirror of
https://github.com/sqlmapproject/sqlmap.git
synced 2025-02-02 20:54:13 +03:00
added one new quick check for multiple target(s) mode
This commit is contained in:
parent
8e1927fe31
commit
8625494ff2
|
@ -15,6 +15,7 @@ from lib.core.agent import agent
|
||||||
from lib.core.common import beep
|
from lib.core.common import beep
|
||||||
from lib.core.common import extractRegexResult
|
from lib.core.common import extractRegexResult
|
||||||
from lib.core.common import findDynamicContent
|
from lib.core.common import findDynamicContent
|
||||||
|
from lib.core.common import getComparePageRatio
|
||||||
from lib.core.common import getCompiledRegex
|
from lib.core.common import getCompiledRegex
|
||||||
from lib.core.common import getErrorParsedDBMSes
|
from lib.core.common import getErrorParsedDBMSes
|
||||||
from lib.core.common import getErrorParsedDBMSesFormatted
|
from lib.core.common import getErrorParsedDBMSesFormatted
|
||||||
|
@ -49,6 +50,7 @@ from lib.core.exception import sqlmapUserQuitException
|
||||||
from lib.core.session import setDynamicMarkings
|
from lib.core.session import setDynamicMarkings
|
||||||
from lib.core.session import setString
|
from lib.core.session import setString
|
||||||
from lib.core.session import setRegexp
|
from lib.core.session import setRegexp
|
||||||
|
from lib.core.settings import CONSTANT_RATIO
|
||||||
from lib.core.settings import UPPER_RATIO_BOUND
|
from lib.core.settings import UPPER_RATIO_BOUND
|
||||||
from lib.core.unescaper import unescaper
|
from lib.core.unescaper import unescaper
|
||||||
from lib.request.connect import Connect as Request
|
from lib.request.connect import Connect as Request
|
||||||
|
@ -466,7 +468,7 @@ def heuristicCheckSqlInjection(place, parameter, value):
|
||||||
|
|
||||||
payload = "%s%s%s%s" % (value, prefix, randomStr(length=10, alphabet=['"', '\'', ')', '(']), suffix)
|
payload = "%s%s%s%s" % (value, prefix, randomStr(length=10, alphabet=['"', '\'', ')', '(']), suffix)
|
||||||
payload = agent.payload(place, parameter, value, payload)
|
payload = agent.payload(place, parameter, value, payload)
|
||||||
Request.queryPage(payload, place, content=False, raise404=False)
|
Request.queryPage(payload, place, content=True, raise404=False)
|
||||||
|
|
||||||
result = wasLastRequestDBMSError()
|
result = wasLastRequestDBMSError()
|
||||||
|
|
||||||
|
@ -482,6 +484,37 @@ def heuristicCheckSqlInjection(place, parameter, value):
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
def simpletonCheckSqlInjection(place, parameter, value):
|
||||||
|
"""
|
||||||
|
This is a function for the quickest and simplest
|
||||||
|
sql injection check (e.g. AND 1=1)
|
||||||
|
"""
|
||||||
|
|
||||||
|
result = False
|
||||||
|
randInt = randomInt()
|
||||||
|
payload = "%s OR %d>%d" % (value, randInt, randInt+1)
|
||||||
|
payload = agent.payload(place, parameter, value, payload)
|
||||||
|
firstPage, _ = Request.queryPage(payload, place, content=True, raise404=False)
|
||||||
|
|
||||||
|
if not (wasLastRequestDBMSError() or wasLastRequestHTTPError()):
|
||||||
|
if getComparePageRatio(kb.originalPage, firstPage) > CONSTANT_RATIO:
|
||||||
|
payload = "%s AND %d>%d" % (value, randInt, randInt+1)
|
||||||
|
payload = agent.payload(place, parameter, value, payload)
|
||||||
|
secondPage, _ = Request.queryPage(payload, place, content=True, raise404=False)
|
||||||
|
result = getComparePageRatio(firstPage, secondPage) <= CONSTANT_RATIO
|
||||||
|
|
||||||
|
infoMsg = "simpleton test shows that %s " % place
|
||||||
|
infoMsg += "parameter '%s' might " % parameter
|
||||||
|
|
||||||
|
if result:
|
||||||
|
infoMsg += "be injectable"
|
||||||
|
logger.info(infoMsg)
|
||||||
|
else:
|
||||||
|
infoMsg += "not be injectable"
|
||||||
|
logger.warn(infoMsg)
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
def checkDynParam(place, parameter, value):
|
def checkDynParam(place, parameter, value):
|
||||||
"""
|
"""
|
||||||
This function checks if the url parameter is dynamic. If it is
|
This function checks if the url parameter is dynamic. If it is
|
||||||
|
|
|
@ -11,13 +11,14 @@ import re
|
||||||
|
|
||||||
from lib.controller.action import action
|
from lib.controller.action import action
|
||||||
from lib.controller.checks import checkSqlInjection
|
from lib.controller.checks import checkSqlInjection
|
||||||
from lib.controller.checks import heuristicCheckSqlInjection
|
|
||||||
from lib.controller.checks import checkDynParam
|
from lib.controller.checks import checkDynParam
|
||||||
from lib.controller.checks import checkStability
|
from lib.controller.checks import checkStability
|
||||||
from lib.controller.checks import checkString
|
from lib.controller.checks import checkString
|
||||||
from lib.controller.checks import checkRegexp
|
from lib.controller.checks import checkRegexp
|
||||||
from lib.controller.checks import checkConnection
|
from lib.controller.checks import checkConnection
|
||||||
from lib.controller.checks import checkNullConnection
|
from lib.controller.checks import checkNullConnection
|
||||||
|
from lib.controller.checks import heuristicCheckSqlInjection
|
||||||
|
from lib.controller.checks import simpletonCheckSqlInjection
|
||||||
from lib.core.agent import agent
|
from lib.core.agent import agent
|
||||||
from lib.core.common import getUnicode
|
from lib.core.common import getUnicode
|
||||||
from lib.core.common import paramToDict
|
from lib.core.common import paramToDict
|
||||||
|
@ -343,7 +344,8 @@ def start():
|
||||||
|
|
||||||
if testSqlInj:
|
if testSqlInj:
|
||||||
check = heuristicCheckSqlInjection(place, parameter, value)
|
check = heuristicCheckSqlInjection(place, parameter, value)
|
||||||
if not check and conf.realTest:
|
if not check and conf.realTest and\
|
||||||
|
not simpletonCheckSqlInjection(place, parameter, value):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
logMsg = "testing sql injection on %s " % place
|
logMsg = "testing sql injection on %s " % place
|
||||||
|
|
|
@ -1963,3 +1963,8 @@ def showHttpErrorCodes():
|
||||||
if code in httplib.responses else '?', count)\
|
if code in httplib.responses else '?', count)\
|
||||||
for code, count in kb.httpErrorCodes.items())
|
for code, count in kb.httpErrorCodes.items())
|
||||||
logger.warn(warnMsg)
|
logger.warn(warnMsg)
|
||||||
|
|
||||||
|
def getComparePageRatio(firstPage, secondPage):
|
||||||
|
conf.seqMatcher.set_seq1(firstPage)
|
||||||
|
conf.seqMatcher.set_seq2(secondPage)
|
||||||
|
return conf.seqMatcher.quick_ratio()
|
||||||
|
|
|
@ -25,6 +25,10 @@ SITE = "http://sqlmap.sourceforge.net"
|
||||||
DIFF_TOLERANCE = 0.05
|
DIFF_TOLERANCE = 0.05
|
||||||
CONSTANT_RATIO = 0.9
|
CONSTANT_RATIO = 0.9
|
||||||
|
|
||||||
|
# lower and upper values for match ratio in case of stable page
|
||||||
|
LOWER_RATIO_BOUND = 0.02
|
||||||
|
UPPER_RATIO_BOUND = 0.98
|
||||||
|
|
||||||
# sqlmap logger
|
# sqlmap logger
|
||||||
logging.addLevelName(9, "PAYLOAD")
|
logging.addLevelName(9, "PAYLOAD")
|
||||||
logging.addLevelName(8, "TRAFFIC OUT")
|
logging.addLevelName(8, "TRAFFIC OUT")
|
||||||
|
@ -67,10 +71,6 @@ INFERENCE_BLANK_BREAK = 10
|
||||||
# string used for representation of unknown dbms version
|
# string used for representation of unknown dbms version
|
||||||
UNKNOWN_DBMS_VERSION = "Unknown"
|
UNKNOWN_DBMS_VERSION = "Unknown"
|
||||||
|
|
||||||
# lower and upper values for match ratio in case of stable page
|
|
||||||
LOWER_RATIO_BOUND = 0.02
|
|
||||||
UPPER_RATIO_BOUND = 0.98
|
|
||||||
|
|
||||||
# dynamicity mark length used in dynamicity removal engine
|
# dynamicity mark length used in dynamicity removal engine
|
||||||
DYNAMICITY_MARK_LENGTH = 32
|
DYNAMICITY_MARK_LENGTH = 32
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user