diff --git a/extra/esperanto/handler.py b/extra/esperanto/handler.py index 4979e54a8..37561fcb5 100644 --- a/extra/esperanto/handler.py +++ b/extra/esperanto/handler.py @@ -31,6 +31,7 @@ def buildHandler(): from lib.core.enums import CHARSET_TYPE from lib.core.enums import EXPECTED from lib.core.exception import SqlmapDataException + from lib.core.exception import SqlmapUnsupportedFeatureException from lib.request.inject import checkBooleanExpression from lib.request.inject import getValue from plugins.generic.enumeration import Enumeration @@ -53,6 +54,15 @@ def buildHandler(): # reuses what --columns already enumerated self._scopeCache = {} # table -> resolved schema (see _scopeFor) + def __getattr__(self, name): + # this handler only mixes in Enumeration/Miscellaneous (read-only, boolean-oracle + # extraction); any DBMS-specific capability (--os-*/--file-*/--sql-shell/--udf-*/--reg-*/ + # --cleanup) has no generic equivalent - fail cleanly instead of an AttributeError deep + # in action(). Leading underscore excluded so internal/dunder lookups behave normally. + if name.startswith("_"): + raise AttributeError(name) + raise SqlmapUnsupportedFeatureException("Esperanto does not support '%s' (DBMS-agnostic engine covers enumeration/dump only)" % name) + def _engine(self): if self._esp is None: # esperanto is a PURE boolean-oracle engine: every probe is one true/false diff --git a/lib/core/settings.py b/lib/core/settings.py index 657b03a88..8e5be5374 100644 --- a/lib/core/settings.py +++ b/lib/core/settings.py @@ -20,7 +20,7 @@ from lib.core.enums import OS from thirdparty import six # sqlmap version (...) -VERSION = "1.10.9.6" +VERSION = "1.10.9.7" TYPE = "dev" if VERSION.count('.') > 2 and VERSION.split('.')[-1] != '0' else "stable" TYPE_COLORS = {"dev": 33, "stable": 90, "pip": 34} VERSION_STRING = "sqlmap/%s#%s" % ('.'.join(VERSION.split('.')[:-1]) if VERSION.count('.') > 2 and VERSION.split('.')[-1] == '0' else VERSION, TYPE)