mirror of
https://github.com/sqlmapproject/sqlmap.git
synced 2024-11-22 01:26:42 +03:00
Update related to the last commit
This commit is contained in:
parent
7672b9a0a2
commit
db3bed3f44
|
@ -7,6 +7,8 @@ Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
|
|||
See the file 'LICENSE' for copying permission
|
||||
"""
|
||||
|
||||
from __future__ import print_function
|
||||
|
||||
import os
|
||||
import sys
|
||||
import zlib
|
||||
|
@ -38,7 +40,7 @@ def decloak(inputFile=None, data=None):
|
|||
try:
|
||||
data = zlib.decompress(hideAscii(data))
|
||||
except:
|
||||
print 'ERROR: the provided input file \'%s\' does not contain valid cloaked content' % inputFile
|
||||
print('ERROR: the provided input file \'%s\' does not contain valid cloaked content' % inputFile)
|
||||
sys.exit(1)
|
||||
finally:
|
||||
f.close()
|
||||
|
@ -63,7 +65,7 @@ def main():
|
|||
parser.error(e)
|
||||
|
||||
if not os.path.isfile(args.inputFile):
|
||||
print 'ERROR: the provided input file \'%s\' is non existent' % args.inputFile
|
||||
print('ERROR: the provided input file \'%s\' is non existent' % args.inputFile)
|
||||
sys.exit(1)
|
||||
|
||||
if not args.decrypt:
|
||||
|
|
|
@ -7,6 +7,8 @@ Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
|
|||
See the file 'LICENSE' for copying permission
|
||||
"""
|
||||
|
||||
from __future__ import print_function
|
||||
|
||||
import os
|
||||
import sys
|
||||
import struct
|
||||
|
@ -19,7 +21,7 @@ def convert(inputFile):
|
|||
fileSize = fileStat.st_size
|
||||
|
||||
if fileSize > 65280:
|
||||
print "ERROR: the provided input file '%s' is too big for debug.exe" % inputFile
|
||||
print("ERROR: the provided input file '%s' is too big for debug.exe" % inputFile)
|
||||
sys.exit(1)
|
||||
|
||||
script = "n %s\nr cx\n" % os.path.basename(inputFile.replace(".", "_"))
|
||||
|
@ -59,7 +61,7 @@ def convert(inputFile):
|
|||
|
||||
def main(inputFile, outputFile):
|
||||
if not os.path.isfile(inputFile):
|
||||
print "ERROR: the provided input file '%s' is not a regular file" % inputFile
|
||||
print("ERROR: the provided input file '%s' is not a regular file" % inputFile)
|
||||
sys.exit(1)
|
||||
|
||||
script = convert(inputFile)
|
||||
|
@ -70,7 +72,7 @@ def main(inputFile, outputFile):
|
|||
sys.stdout.write(script)
|
||||
sys.stdout.close()
|
||||
else:
|
||||
print script
|
||||
print(script)
|
||||
|
||||
if __name__ == "__main__":
|
||||
usage = "%s -i <input file> [-o <output file>]" % sys.argv[0]
|
||||
|
|
|
@ -7,6 +7,8 @@ Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
|
|||
See the file 'LICENSE' for copying permission
|
||||
"""
|
||||
|
||||
from __future__ import print_function
|
||||
|
||||
import binascii
|
||||
import re
|
||||
import string
|
||||
|
@ -112,7 +114,7 @@ def main():
|
|||
parser.error(e)
|
||||
|
||||
if not os.path.isfile(args.inputFile):
|
||||
print 'ERROR: the provided input file \'%s\' is not a regular file' % args.inputFile
|
||||
print('ERROR: the provided input file \'%s\' is not a regular file' % args.inputFile)
|
||||
sys.exit(1)
|
||||
|
||||
f = open(args.inputFile, 'r')
|
||||
|
|
|
@ -5,6 +5,8 @@
|
|||
|
||||
# Removes duplicate entries in wordlist like files
|
||||
|
||||
from __future__ import print_function
|
||||
|
||||
import sys
|
||||
|
||||
if len(sys.argv) > 0:
|
||||
|
@ -17,7 +19,7 @@ if len(sys.argv) > 0:
|
|||
str.encode(item)
|
||||
if item in items:
|
||||
if item:
|
||||
print item
|
||||
print(item)
|
||||
else:
|
||||
items.append(item)
|
||||
except:
|
||||
|
|
|
@ -3,6 +3,8 @@
|
|||
# Runs pylint on all python scripts found in a directory tree
|
||||
# Reference: http://rowinggolfer.blogspot.com/2009/08/pylint-recursively.html
|
||||
|
||||
from __future__ import print_function
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
|
@ -12,16 +14,16 @@ def check(filepath):
|
|||
|
||||
if "\n\n\n" in content:
|
||||
index = content.find("\n\n\n")
|
||||
print filepath, repr(content[index - 30:index + 30])
|
||||
print(filepath, repr(content[index - 30:index + 30]))
|
||||
|
||||
if __name__ == "__main__":
|
||||
try:
|
||||
BASE_DIRECTORY = sys.argv[1]
|
||||
except IndexError:
|
||||
print "no directory specified, defaulting to current working directory"
|
||||
print("no directory specified, defaulting to current working directory")
|
||||
BASE_DIRECTORY = os.getcwd()
|
||||
|
||||
print "looking for *.py scripts in subdirectories of ", BASE_DIRECTORY
|
||||
print("looking for *.py scripts in subdirectories of '%s'" % BASE_DIRECTORY)
|
||||
for root, dirs, files in os.walk(BASE_DIRECTORY):
|
||||
if any(_ in root for _ in ("extra", "thirdparty")):
|
||||
continue
|
||||
|
|
|
@ -3,6 +3,8 @@
|
|||
# Runs pylint on all python scripts found in a directory tree
|
||||
# Reference: http://rowinggolfer.blogspot.com/2009/08/pylint-recursively.html
|
||||
|
||||
from __future__ import print_function
|
||||
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
|
@ -17,26 +19,26 @@ def check(module):
|
|||
|
||||
if module[-3:] == ".py":
|
||||
|
||||
print "CHECKING ", module
|
||||
print("CHECKING ", module)
|
||||
pout = os.popen("pylint --rcfile=/dev/null %s" % module, 'r')
|
||||
for line in pout:
|
||||
if re.match(r"\AE:", line):
|
||||
print line.strip()
|
||||
print(line.strip())
|
||||
if __RATING__ and "Your code has been rated at" in line:
|
||||
print line
|
||||
print(line)
|
||||
score = re.findall(r"\d.\d\d", line)[0]
|
||||
total += float(score)
|
||||
count += 1
|
||||
|
||||
if __name__ == "__main__":
|
||||
try:
|
||||
print sys.argv
|
||||
print(sys.argv)
|
||||
BASE_DIRECTORY = sys.argv[1]
|
||||
except IndexError:
|
||||
print "no directory specified, defaulting to current working directory"
|
||||
print("no directory specified, defaulting to current working directory")
|
||||
BASE_DIRECTORY = os.getcwd()
|
||||
|
||||
print "looking for *.py scripts in subdirectories of ", BASE_DIRECTORY
|
||||
print("looking for *.py scripts in subdirectories of ", BASE_DIRECTORY)
|
||||
for root, dirs, files in os.walk(BASE_DIRECTORY):
|
||||
if any(_ in root for _ in ("extra", "thirdparty")):
|
||||
continue
|
||||
|
@ -45,6 +47,6 @@ if __name__ == "__main__":
|
|||
check(filepath)
|
||||
|
||||
if __RATING__:
|
||||
print "==" * 50
|
||||
print "%d modules found" % count
|
||||
print "AVERAGE SCORE = %.02f" % (total / count)
|
||||
print("==" * 50)
|
||||
print("%d modules found" % count)
|
||||
print("AVERAGE SCORE = %.02f" % (total / count))
|
||||
|
|
|
@ -3,6 +3,8 @@
|
|||
# Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
|
||||
# See the file 'LICENSE' for copying permission
|
||||
|
||||
from __future__ import print_function
|
||||
|
||||
import codecs
|
||||
import inspect
|
||||
import os
|
||||
|
@ -56,8 +58,8 @@ def send_email(msg):
|
|||
s.sendmail(FROM, TO, msg.as_string())
|
||||
s.quit()
|
||||
# Catch all for SMTP exceptions
|
||||
except smtplib.SMTPException, e:
|
||||
print "Failure to send email: %s" % str(e)
|
||||
except smtplib.SMTPException as ex:
|
||||
print("Failure to send email: '%s" % ex)
|
||||
|
||||
def failure_email(msg):
|
||||
msg = prepare_email(msg)
|
||||
|
@ -157,7 +159,7 @@ if __name__ == "__main__":
|
|||
|
||||
try:
|
||||
main()
|
||||
except Exception, e:
|
||||
except Exception:
|
||||
log_fd.write("An exception has occurred:\n%s" % str(traceback.format_exc()))
|
||||
|
||||
log_fd.write("Regression test finished at %s\n\n" % time.strftime("%H:%M:%S %d-%m-%Y", time.gmtime()))
|
||||
|
|
|
@ -5,6 +5,8 @@ Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
|
|||
See the file 'LICENSE' for copying permission
|
||||
"""
|
||||
|
||||
from __future__ import print_function
|
||||
|
||||
import cookielib
|
||||
import re
|
||||
import socket
|
||||
|
@ -75,8 +77,8 @@ def main():
|
|||
except KeyboardInterrupt:
|
||||
raise
|
||||
|
||||
except Exception, msg:
|
||||
print msg
|
||||
except Exception as ex:
|
||||
print(ex)
|
||||
|
||||
if abort:
|
||||
break
|
||||
|
@ -86,7 +88,7 @@ def main():
|
|||
sys.stdout.write("---------------\n")
|
||||
|
||||
for sqlfile in files:
|
||||
print sqlfile
|
||||
print(sqlfile)
|
||||
|
||||
try:
|
||||
req = urllib2.Request(sqlfile)
|
||||
|
@ -118,8 +120,8 @@ def main():
|
|||
except KeyboardInterrupt:
|
||||
raise
|
||||
|
||||
except Exception, msg:
|
||||
print msg
|
||||
except Exception as ex:
|
||||
print(ex)
|
||||
|
||||
else:
|
||||
i += 1
|
||||
|
|
|
@ -5,6 +5,8 @@ Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
|
|||
See the file 'LICENSE' for copying permission
|
||||
"""
|
||||
|
||||
from __future__ import print_function
|
||||
|
||||
import cookielib
|
||||
import glob
|
||||
import httplib
|
||||
|
@ -68,7 +70,7 @@ def colorize(message):
|
|||
def main():
|
||||
global WAF_FUNCTIONS
|
||||
|
||||
print colorize("%s #v%s\n by: %s\n" % (NAME, VERSION, AUTHOR))
|
||||
print(colorize("%s #v%s\n by: %s\n" % (NAME, VERSION, AUTHOR)))
|
||||
|
||||
if len(sys.argv) < 2:
|
||||
exit(colorize("[x] usage: python %s <hostname>" % os.path.split(__file__)[-1]))
|
||||
|
@ -104,13 +106,13 @@ def main():
|
|||
|
||||
WAF_FUNCTIONS = sorted(WAF_FUNCTIONS, key=lambda _: "generic" in _[1].lower())
|
||||
|
||||
print colorize("[i] checking '%s'..." % sys.argv[1])
|
||||
print(colorize("[i] checking '%s'..." % sys.argv[1]))
|
||||
|
||||
hostname = sys.argv[1].split("//")[-1].split('/')[0]
|
||||
try:
|
||||
socket.getaddrinfo(hostname, None)
|
||||
except socket.gaierror:
|
||||
print colorize("[x] host '%s' does not exist" % hostname)
|
||||
print(colorize("[x] host '%s' does not exist" % hostname))
|
||||
exit(1)
|
||||
|
||||
found = False
|
||||
|
@ -122,7 +124,7 @@ def main():
|
|||
exit(colorize("[!] WAF/IPS identified as '%s'" % product))
|
||||
|
||||
if not found:
|
||||
print colorize("[o] nothing found")
|
||||
print(colorize("[o] nothing found"))
|
||||
|
||||
print
|
||||
|
||||
|
|
|
@ -627,10 +627,10 @@ def checkSqlInjection(place, parameter, value):
|
|||
|
||||
injectable = True
|
||||
|
||||
except SqlmapConnectionException, msg:
|
||||
except SqlmapConnectionException as ex:
|
||||
debugMsg = "problem occurred most likely because the "
|
||||
debugMsg += "server hasn't recovered as expected from the "
|
||||
debugMsg += "error-based payload used ('%s')" % msg
|
||||
debugMsg += "error-based payload used ('%s')" % getSafeExString(ex)
|
||||
logger.debug(debugMsg)
|
||||
|
||||
# In case of time-based blind or stacked queries
|
||||
|
|
|
@ -4746,6 +4746,8 @@ def getSafeExString(ex, encoding=None):
|
|||
retVal = ex.msg
|
||||
elif isinstance(ex, (list, tuple)) and len(ex) > 1 and isinstance(ex[1], basestring):
|
||||
retVal = ex[1]
|
||||
elif isinstance(ex, (list, tuple)) and len(ex) > 0 and isinstance(ex[0], basestring):
|
||||
retVal = ex[0]
|
||||
|
||||
return getUnicode(retVal or "", encoding=encoding).strip()
|
||||
|
||||
|
|
|
@ -624,8 +624,8 @@ class Dump(object):
|
|||
with open(filepath, "wb") as f:
|
||||
_ = safechardecode(value, True)
|
||||
f.write(_)
|
||||
except magic.MagicException, err:
|
||||
logger.debug(str(err))
|
||||
except magic.MagicException as ex:
|
||||
logger.debug(getSafeExString(ex))
|
||||
|
||||
if conf.dumpFormat == DUMP_FORMAT.CSV:
|
||||
if field == fields:
|
||||
|
|
|
@ -19,7 +19,7 @@ from lib.core.enums import DBMS_DIRECTORY_NAME
|
|||
from lib.core.enums import OS
|
||||
|
||||
# sqlmap version (<major>.<minor>.<month>.<monthly commit>)
|
||||
VERSION = "1.3.1.60"
|
||||
VERSION = "1.3.1.61"
|
||||
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)
|
||||
|
|
|
@ -646,7 +646,7 @@ def _createTargetDirs():
|
|||
except (OSError, IOError) as ex:
|
||||
try:
|
||||
tempDir = tempfile.mkdtemp(prefix="sqlmap%s" % context)
|
||||
except Exception, _:
|
||||
except Exception as _:
|
||||
errMsg = "unable to write to the temporary directory ('%s'). " % _
|
||||
errMsg += "Please make sure that your disk is not full and "
|
||||
errMsg += "that you have sufficient write permissions to "
|
||||
|
@ -668,7 +668,7 @@ def _createTargetDirs():
|
|||
except (OSError, IOError, TypeError) as ex:
|
||||
try:
|
||||
tempDir = tempfile.mkdtemp(prefix="sqlmapoutput")
|
||||
except Exception, _:
|
||||
except Exception as _:
|
||||
errMsg = "unable to write to the temporary directory ('%s'). " % _
|
||||
errMsg += "Please make sure that your disk is not full and "
|
||||
errMsg += "that you have sufficient write permissions to "
|
||||
|
@ -767,4 +767,4 @@ def setupTargetEnv():
|
|||
_resumeHashDBValues()
|
||||
_setResultsFile()
|
||||
_setAuthCred()
|
||||
_setAuxOptions()
|
||||
_setAuxOptions()
|
||||
|
|
|
@ -75,10 +75,10 @@ def smokeTest():
|
|||
try:
|
||||
__import__(path)
|
||||
module = sys.modules[path]
|
||||
except Exception, msg:
|
||||
except Exception as ex:
|
||||
retVal = False
|
||||
dataToStdout("\r")
|
||||
errMsg = "smoke test failed at importing module '%s' (%s):\n%s" % (path, os.path.join(root, filename), msg)
|
||||
errMsg = "smoke test failed at importing module '%s' (%s):\n%s" % (path, os.path.join(root, filename), ex)
|
||||
logger.error(errMsg)
|
||||
else:
|
||||
# Run doc tests
|
||||
|
@ -275,10 +275,10 @@ def runCase(parse):
|
|||
result = start()
|
||||
except KeyboardInterrupt:
|
||||
pass
|
||||
except SqlmapBaseException, e:
|
||||
handled_exception = e
|
||||
except Exception, e:
|
||||
unhandled_exception = e
|
||||
except SqlmapBaseException as ex:
|
||||
handled_exception = ex
|
||||
except Exception as ex:
|
||||
unhandled_exception = ex
|
||||
finally:
|
||||
sys.stdout.seek(0)
|
||||
console = sys.stdout.read()
|
||||
|
|
|
@ -5,6 +5,8 @@ Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
|
|||
See the file 'LICENSE' for copying permission
|
||||
"""
|
||||
|
||||
from __future__ import print_function
|
||||
|
||||
import os
|
||||
import re
|
||||
import shlex
|
||||
|
@ -842,7 +844,7 @@ def cmdLineParser(argv=None):
|
|||
argv[i] = argv[i][:-1]
|
||||
conf.skipThreadCheck = True
|
||||
elif argv[i] == "--version":
|
||||
print VERSION_STRING.split('/')[-1]
|
||||
print(VERSION_STRING.split('/')[-1])
|
||||
raise SystemExit
|
||||
elif argv[i] in ("-h", "--help"):
|
||||
advancedHelp = False
|
||||
|
|
|
@ -17,6 +17,7 @@ from lib.core.common import Backend
|
|||
from lib.core.common import extractErrorMessage
|
||||
from lib.core.common import extractRegexResult
|
||||
from lib.core.common import getPublicTypeMembers
|
||||
from lib.core.common import getSafeExString
|
||||
from lib.core.common import getUnicode
|
||||
from lib.core.common import isListLike
|
||||
from lib.core.common import randomStr
|
||||
|
@ -280,10 +281,10 @@ def decodePage(page, contentEncoding, contentType):
|
|||
raise Exception("size too large")
|
||||
|
||||
page = data.read()
|
||||
except Exception, msg:
|
||||
except Exception as ex:
|
||||
if "<html" not in page: # in some cases, invalid "Content-Encoding" appears for plain HTML (should be ignored)
|
||||
errMsg = "detected invalid data for declared content "
|
||||
errMsg += "encoding '%s' ('%s')" % (contentEncoding, msg)
|
||||
errMsg += "encoding '%s' ('%s')" % (contentEncoding, getSafeExString(ex))
|
||||
singleTimeLogMessage(errMsg, logging.ERROR)
|
||||
|
||||
warnMsg = "turning off page compression"
|
||||
|
|
|
@ -5,6 +5,8 @@ Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
|
|||
See the file 'LICENSE' for copying permission
|
||||
"""
|
||||
|
||||
from __future__ import print_function
|
||||
|
||||
import os
|
||||
import re
|
||||
import socket
|
||||
|
@ -145,13 +147,13 @@ if __name__ == "__main__":
|
|||
if _ is None:
|
||||
break
|
||||
else:
|
||||
print "[i] %s" % _
|
||||
print("[i] %s" % _)
|
||||
|
||||
time.sleep(1)
|
||||
|
||||
except socket.error as ex:
|
||||
if 'Permission' in str(ex):
|
||||
print "[x] Please run with sudo/Administrator privileges"
|
||||
print("[x] Please run with sudo/Administrator privileges")
|
||||
else:
|
||||
raise
|
||||
except KeyboardInterrupt:
|
||||
|
|
|
@ -16,6 +16,7 @@ from lib.core.data import conf
|
|||
from lib.core.data import kb
|
||||
from lib.core.data import logger
|
||||
from lib.core.common import getHostHeader
|
||||
from lib.core.common import getSafeExString
|
||||
from lib.core.common import getUnicode
|
||||
from lib.core.common import logHTTPTraffic
|
||||
from lib.core.common import readInput
|
||||
|
@ -75,9 +76,9 @@ class SmartRedirectHandler(urllib2.HTTPRedirectHandler):
|
|||
|
||||
try:
|
||||
content = fp.read(MAX_CONNECTION_TOTAL_SIZE)
|
||||
except Exception, msg:
|
||||
except Exception as ex:
|
||||
dbgMsg = "there was a problem while retrieving "
|
||||
dbgMsg += "redirect response content (%s)" % msg
|
||||
dbgMsg += "redirect response content ('%s')" % getSafeExString(ex)
|
||||
logger.debug(dbgMsg)
|
||||
finally:
|
||||
if content:
|
||||
|
|
|
@ -770,8 +770,8 @@ def _bruteProcessVariantA(attack_info, hash_regex, suffix, retVal, proc_id, proc
|
|||
except (UnicodeEncodeError, UnicodeDecodeError):
|
||||
pass # ignore possible encoding problems caused by some words in custom dictionaries
|
||||
|
||||
except Exception, e:
|
||||
warnMsg = "there was a problem while hashing entry: %s (%s). " % (repr(word), e)
|
||||
except Exception as ex:
|
||||
warnMsg = "there was a problem while hashing entry: %s ('%s'). " % (repr(word), getSafeExString(ex))
|
||||
warnMsg += "Please report by e-mail to '%s'" % DEV_EMAIL_ADDRESS
|
||||
logger.critical(warnMsg)
|
||||
|
||||
|
@ -847,8 +847,8 @@ def _bruteProcessVariantB(user, hash_, kwargs, hash_regex, suffix, retVal, found
|
|||
except (UnicodeEncodeError, UnicodeDecodeError):
|
||||
pass # ignore possible encoding problems caused by some words in custom dictionaries
|
||||
|
||||
except Exception, e:
|
||||
warnMsg = "there was a problem while hashing entry: %s (%s). " % (repr(word), e)
|
||||
except Exception as ex:
|
||||
warnMsg = "there was a problem while hashing entry: %s ('%s'). " % (repr(word), getSafeExString(ex))
|
||||
warnMsg += "Please report by e-mail to '%s'" % DEV_EMAIL_ADDRESS
|
||||
logger.critical(warnMsg)
|
||||
|
||||
|
|
|
@ -76,8 +76,8 @@ class SQLAlchemy(GenericConnector):
|
|||
raise
|
||||
except SqlmapFilePathException:
|
||||
raise
|
||||
except Exception, msg:
|
||||
raise SqlmapConnectionException("SQLAlchemy connection issue ('%s')" % msg[0])
|
||||
except Exception as ex:
|
||||
raise SqlmapConnectionException("SQLAlchemy connection issue ('%s')" % ex[0])
|
||||
|
||||
self.printConnected()
|
||||
else:
|
||||
|
@ -89,17 +89,17 @@ class SQLAlchemy(GenericConnector):
|
|||
for row in self.cursor.fetchall():
|
||||
retVal.append(tuple(row))
|
||||
return retVal
|
||||
except _sqlalchemy.exc.ProgrammingError, msg:
|
||||
logger.log(logging.WARN if conf.dbmsHandler else logging.DEBUG, "(remote) %s" % msg.message if hasattr(msg, "message") else msg)
|
||||
except _sqlalchemy.exc.ProgrammingError as ex:
|
||||
logger.log(logging.WARN if conf.dbmsHandler else logging.DEBUG, "(remote) %s" % ex.message if hasattr(ex, "message") else ex)
|
||||
return None
|
||||
|
||||
def execute(self, query):
|
||||
try:
|
||||
self.cursor = self.connector.execute(query)
|
||||
except (_sqlalchemy.exc.OperationalError, _sqlalchemy.exc.ProgrammingError), msg:
|
||||
logger.log(logging.WARN if conf.dbmsHandler else logging.DEBUG, "(remote) %s" % msg.message if hasattr(msg, "message") else msg)
|
||||
except _sqlalchemy.exc.InternalError, msg:
|
||||
raise SqlmapConnectionException(msg[1])
|
||||
except (_sqlalchemy.exc.OperationalError, _sqlalchemy.exc.ProgrammingError) as ex:
|
||||
logger.log(logging.WARN if conf.dbmsHandler else logging.DEBUG, "(remote) %s" % ex.message if hasattr(ex, "message") else ex)
|
||||
except _sqlalchemy.exc.InternalError as ex:
|
||||
raise SqlmapConnectionException(ex[1])
|
||||
|
||||
def select(self, query):
|
||||
self.execute(query)
|
||||
|
|
|
@ -22,8 +22,8 @@ def timeout(func, args=(), kwargs={}, duration=1, default=None):
|
|||
try:
|
||||
self.result = func(*args, **kwargs)
|
||||
self.timeout_state = TIMEOUT_STATE.NORMAL
|
||||
except Exception, msg:
|
||||
logger.log(CUSTOM_LOGGING.TRAFFIC_IN, msg)
|
||||
except Exception as ex:
|
||||
logger.log(CUSTOM_LOGGING.TRAFFIC_IN, ex)
|
||||
self.result = default
|
||||
self.timeout_state = TIMEOUT_STATE.EXCEPTION
|
||||
|
||||
|
|
|
@ -42,8 +42,8 @@ class Connector(GenericConnector):
|
|||
try:
|
||||
# Reference: http://www.daniweb.com/forums/thread248499.html
|
||||
self.connector = kinterbasdb.connect(host=self.hostname.encode(UNICODE_ENCODING), database=self.db.encode(UNICODE_ENCODING), user=self.user.encode(UNICODE_ENCODING), password=self.password.encode(UNICODE_ENCODING), charset="UTF8")
|
||||
except kinterbasdb.OperationalError, msg:
|
||||
raise SqlmapConnectionException(getSafeExString(msg))
|
||||
except kinterbasdb.OperationalError as ex:
|
||||
raise SqlmapConnectionException(getSafeExString(ex))
|
||||
|
||||
self.initCursor()
|
||||
self.printConnected()
|
||||
|
@ -51,17 +51,17 @@ class Connector(GenericConnector):
|
|||
def fetchall(self):
|
||||
try:
|
||||
return self.cursor.fetchall()
|
||||
except kinterbasdb.OperationalError, msg:
|
||||
logger.log(logging.WARN if conf.dbmsHandler else logging.DEBUG, "(remote) %s" % getSafeExString(msg))
|
||||
except kinterbasdb.OperationalError as ex:
|
||||
logger.log(logging.WARN if conf.dbmsHandler else logging.DEBUG, "(remote) %s" % getSafeExString(ex))
|
||||
return None
|
||||
|
||||
def execute(self, query):
|
||||
try:
|
||||
self.cursor.execute(query)
|
||||
except kinterbasdb.OperationalError, msg:
|
||||
logger.log(logging.WARN if conf.dbmsHandler else logging.DEBUG, "(remote) %s" % getSafeExString(msg))
|
||||
except kinterbasdb.Error, msg:
|
||||
raise SqlmapConnectionException(getSafeExString(msg))
|
||||
except kinterbasdb.OperationalError as ex:
|
||||
logger.log(logging.WARN if conf.dbmsHandler else logging.DEBUG, "(remote) %s" % getSafeExString(ex))
|
||||
except kinterbasdb.Error as ex:
|
||||
raise SqlmapConnectionException(getSafeExString(ex))
|
||||
|
||||
self.connector.commit()
|
||||
|
||||
|
|
|
@ -14,6 +14,7 @@ except:
|
|||
import logging
|
||||
|
||||
from lib.core.common import checkFile
|
||||
from lib.core.common import getSafeExString
|
||||
from lib.core.common import readInput
|
||||
from lib.core.data import conf
|
||||
from lib.core.data import logger
|
||||
|
@ -41,15 +42,15 @@ class Connector(GenericConnector):
|
|||
args = "-Djava.class.path=%s" % jar
|
||||
jvm_path = jpype.getDefaultJVMPath()
|
||||
jpype.startJVM(jvm_path, args)
|
||||
except Exception, msg:
|
||||
raise SqlmapConnectionException(msg[0])
|
||||
except Exception as ex:
|
||||
raise SqlmapConnectionException(getSafeExString(ex))
|
||||
|
||||
try:
|
||||
driver = 'org.hsqldb.jdbc.JDBCDriver'
|
||||
connection_string = 'jdbc:hsqldb:mem:.' # 'jdbc:hsqldb:hsql://%s/%s' % (self.hostname, self.db)
|
||||
self.connector = jaydebeapi.connect(driver, connection_string, str(self.user), str(self.password))
|
||||
except Exception, msg:
|
||||
raise SqlmapConnectionException(msg[0])
|
||||
except Exception as ex:
|
||||
raise SqlmapConnectionException(getSafeExString(ex))
|
||||
|
||||
self.initCursor()
|
||||
self.printConnected()
|
||||
|
@ -57,8 +58,8 @@ class Connector(GenericConnector):
|
|||
def fetchall(self):
|
||||
try:
|
||||
return self.cursor.fetchall()
|
||||
except Exception, msg:
|
||||
logger.log(logging.WARN if conf.dbmsHandler else logging.DEBUG, "(remote) %s" % msg[1])
|
||||
except Exception as ex:
|
||||
logger.log(logging.WARN if conf.dbmsHandler else logging.DEBUG, "(remote) '%s'" % getSafeExString(ex))
|
||||
return None
|
||||
|
||||
def execute(self, query):
|
||||
|
@ -67,8 +68,8 @@ class Connector(GenericConnector):
|
|||
try:
|
||||
self.cursor.execute(query)
|
||||
retVal = True
|
||||
except Exception, msg: # TODO: fix with specific error
|
||||
logger.log(logging.WARN if conf.dbmsHandler else logging.DEBUG, "(remote) %s" % msg[1])
|
||||
except Exception as ex:
|
||||
logger.log(logging.WARN if conf.dbmsHandler else logging.DEBUG, "(remote) '%s'" % getSafeExString(ex))
|
||||
|
||||
self.connector.commit()
|
||||
|
||||
|
|
|
@ -41,7 +41,7 @@ class Connector(GenericConnector):
|
|||
|
||||
try:
|
||||
self.connector = pymssql.connect(host="%s:%d" % (self.hostname, self.port), user=self.user, password=self.password, database=self.db, login_timeout=conf.timeout, timeout=conf.timeout)
|
||||
except (pymssql2.Error, _mssql.MssqlDatabaseException), msg:
|
||||
except (pymssql.Error, _mssql.MssqlDatabaseException), msg:
|
||||
raise SqlmapConnectionException(msg)
|
||||
except ValueError:
|
||||
raise SqlmapConnectionException
|
||||
|
|
|
@ -52,8 +52,8 @@ class Connector:
|
|||
self.cursor.close()
|
||||
if self.connector:
|
||||
self.connector.close()
|
||||
except Exception, msg:
|
||||
logger.debug(msg)
|
||||
except Exception as ex:
|
||||
logger.debug(ex)
|
||||
finally:
|
||||
self.closed()
|
||||
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
3d37032b2bd62ee37bd61c5b7ad31ab4 extra/beep/beep.py
|
||||
fb6be55d21a70765e35549af2484f762 extra/beep/__init__.py
|
||||
ed51a485d1badc99267f0d136bfb2a12 extra/cloak/cloak.py
|
||||
03e8129f9ef4aea150266255a0cd06f4 extra/cloak/cloak.py
|
||||
fb6be55d21a70765e35549af2484f762 extra/cloak/__init__.py
|
||||
6baecbea87de0a56f99e59bfe982ebc5 extra/dbgtool/dbgtool.py
|
||||
c7da22bb04f5c42a523d04baebe8088c extra/dbgtool/dbgtool.py
|
||||
fb6be55d21a70765e35549af2484f762 extra/dbgtool/__init__.py
|
||||
acba8b5dc93db0fe6b2b04ff0138c33c extra/icmpsh/icmpsh.exe_
|
||||
216a0e04bef7053e6aa35ca98907007e extra/icmpsh/icmpsh_m.py
|
||||
|
@ -10,33 +10,33 @@ acba8b5dc93db0fe6b2b04ff0138c33c extra/icmpsh/icmpsh.exe_
|
|||
fb6be55d21a70765e35549af2484f762 extra/__init__.py
|
||||
ff90cb0366f7cefbdd6e573e27e6238c extra/runcmd/runcmd.exe_
|
||||
fb6be55d21a70765e35549af2484f762 extra/safe2bin/__init__.py
|
||||
f372fef397ba41ea54334c16ebe646b2 extra/safe2bin/safe2bin.py
|
||||
db2b5fce6e92d3a13cb62aea5ffcae2d extra/safe2bin/safe2bin.py
|
||||
d229479d02d21b29f209143cb0547780 extra/shellcodeexec/linux/shellcodeexec.x32_
|
||||
2fe2f94eebc62f7614f0391a8a90104f extra/shellcodeexec/linux/shellcodeexec.x64_
|
||||
c55b400b72acc43e0e59c87dd8bb8d75 extra/shellcodeexec/windows/shellcodeexec.x32.exe_
|
||||
d1bf28af13f1017f4007f29ea86afd25 extra/shutils/duplicates.py
|
||||
e4805169a081b834ca51a60a150c7247 extra/shutils/newlines.py
|
||||
71b9d4357c31db013ecda27433830090 extra/shutils/pylint.py
|
||||
11492e9b5f183c289b98442437675c1f extra/shutils/regressiontest.py
|
||||
a32e12410e0f86c1d035db6daae84680 extra/shutils/duplicates.py
|
||||
1cf0ecf81a0483c3de78ac683445ac7a extra/shutils/newlines.py
|
||||
9626f1f72dc96dbdecb1ea7404811902 extra/shutils/pylint.py
|
||||
80f989adc6d4fa999b414c0787a06c1b extra/shutils/regressiontest.py
|
||||
fb6be55d21a70765e35549af2484f762 extra/sqlharvest/__init__.py
|
||||
53d5dcba047f1285e32b9e88d2803ebf extra/sqlharvest/sqlharvest.py
|
||||
4f82e97b09cc530cb9a92472d0835cea extra/sqlharvest/sqlharvest.py
|
||||
fb6be55d21a70765e35549af2484f762 extra/wafdetectify/__init__.py
|
||||
d7e3aa3221c5ddb106a029720bf9fb5e extra/wafdetectify/wafdetectify.py
|
||||
e0581096d2890506878e9b424e4e1001 extra/wafdetectify/wafdetectify.py
|
||||
ec782b9cdb8d857a80b6ecf0f32db7f4 lib/controller/action.py
|
||||
d62df9d0d5643d67b75f836ea87827c7 lib/controller/checks.py
|
||||
d099724a49c5fd6b0dca8c777e82604e lib/controller/checks.py
|
||||
c4d559a98cfc62b401ef7e0bfab782f0 lib/controller/controller.py
|
||||
c1da277517c7ec4c23e953a51b51e203 lib/controller/handler.py
|
||||
fb6be55d21a70765e35549af2484f762 lib/controller/__init__.py
|
||||
ed7874be0d2d3802f3d20184f2b280d5 lib/core/agent.py
|
||||
44ac129c1b3b6130b4f1bc7b93036278 lib/core/bigarray.py
|
||||
5da00a381cc1847201ffbeb663653ecd lib/core/common.py
|
||||
34906c544d5c1060eecb2277b2c218d3 lib/core/common.py
|
||||
de8d27ae6241163ff9e97aa9e7c51a18 lib/core/convert.py
|
||||
abcb1121eb56d3401839d14e8ed06b6e lib/core/data.py
|
||||
db60c6ebb63b72ed119e304b359fc1a6 lib/core/datatype.py
|
||||
b7c912e2af7a3354f6d7c04f556a80b2 lib/core/decorators.py
|
||||
5f4680b769ae07f22157bd832c97cf8f lib/core/defaults.py
|
||||
9dfc69ba47209a4ceca494dde9ee8183 lib/core/dicts.py
|
||||
070e9439a18d2d9067e3a135b239fa3f lib/core/dump.py
|
||||
d9a9783b417a6c34f177272596904bdc lib/core/dump.py
|
||||
5c91145204092b995ed1ac641e9e291d lib/core/enums.py
|
||||
84ef8f32e4582fcc294dc14e1997131d lib/core/exception.py
|
||||
fb6be55d21a70765e35549af2484f762 lib/core/__init__.py
|
||||
|
@ -49,18 +49,18 @@ fe370021c6bc99daf44b2bfc0d1effb3 lib/core/patch.py
|
|||
7d8a22c582ad201f65b73225e4456170 lib/core/replication.py
|
||||
3179d34f371e0295dd4604568fb30bcd lib/core/revision.py
|
||||
d6269c55789f78cf707e09a0f5b45443 lib/core/session.py
|
||||
71bd4886e45f4d0f6d9f556c12a06c7f lib/core/settings.py
|
||||
1d9c5cc98c251357da6eb91902d75c4d lib/core/settings.py
|
||||
a8a7501d1e6b21669b858a62e921d191 lib/core/shell.py
|
||||
5dc606fdf0afefd4b305169c21ab2612 lib/core/subprocessng.py
|
||||
2d29cdb5e7bc612b2ade8e4ab0b1495e lib/core/target.py
|
||||
a71b23612f2f2c7be8a843858408fdcc lib/core/testing.py
|
||||
072c08d834d01b33e5f39320dcf67a0d lib/core/target.py
|
||||
7857b24b7865ccb4a05283faa596974d lib/core/testing.py
|
||||
bf4bdec9b247a999f877a5e5d7daeb70 lib/core/threads.py
|
||||
2c263c8610667fdc593c50a35ab20f57 lib/core/unescaper.py
|
||||
ff45c74515fecc95277f7b9ad945f17c lib/core/update.py
|
||||
b40f4c20a38729bb4933b8221665f106 lib/core/wordlist.py
|
||||
fb6be55d21a70765e35549af2484f762 lib/__init__.py
|
||||
4881480d0c1778053908904e04570dc3 lib/parse/banner.py
|
||||
80c67d8d0add0097fd0284f043eee939 lib/parse/cmdline.py
|
||||
ff78461bf084b700b35c51c758685917 lib/parse/cmdline.py
|
||||
06ccbccb63255c8f1c35950a4c8a6f6b lib/parse/configfile.py
|
||||
9b33e52f697d6e915c7a10153562ce89 lib/parse/handler.py
|
||||
43deb2400e269e602e916efaec7c0903 lib/parse/headers.py
|
||||
|
@ -69,18 +69,18 @@ fb6be55d21a70765e35549af2484f762 lib/parse/__init__.py
|
|||
adcecd2d6a8667b22872a563eb83eac0 lib/parse/payloads.py
|
||||
993104046c7d97120613409ef7780c76 lib/parse/sitemap.py
|
||||
e4ea70bcd461f5176867dcd89d372386 lib/request/basicauthhandler.py
|
||||
6076c01e84b589adb97cac421a7d5251 lib/request/basic.py
|
||||
88881f162a82325389c68a635723889b lib/request/basic.py
|
||||
fc25d951217077fe655ed2a3a81552ae lib/request/comparison.py
|
||||
2192d65f4a8ba15c081e12590b6e517f lib/request/connect.py
|
||||
7cba86090b02558f04c6692cef66e772 lib/request/direct.py
|
||||
4c7afe3d4be0c2d767b11df36b46bbcc lib/request/dns.py
|
||||
2b7509ba38a667c61cefff036ec4ca6f lib/request/dns.py
|
||||
ceac6b3bf1f726f8ff43c6814e9d7281 lib/request/httpshandler.py
|
||||
fb6be55d21a70765e35549af2484f762 lib/request/__init__.py
|
||||
00720f9eddf42f4fefa083fba40f69ed lib/request/inject.py
|
||||
52a067bd2fe91ea9395269a684380cbb lib/request/methodrequest.py
|
||||
ac482ec52227daf48f523827dd67078f lib/request/pkihandler.py
|
||||
16ff6e078819fe517b1fc0ae3cbc1aa8 lib/request/rangehandler.py
|
||||
e79048c2a08c1a47efd5652f59c4417d lib/request/redirecthandler.py
|
||||
db4dc98d03d1865cc6266a79cd5c81b7 lib/request/redirecthandler.py
|
||||
1e60edebdb3997055616d12f4a932375 lib/request/templates.py
|
||||
d0059dbb1e928871747a8893b41ce268 lib/takeover/abstraction.py
|
||||
ac9efea51eba120b667b4b73536d7f1c lib/takeover/icmpsh.py
|
||||
|
@ -108,15 +108,15 @@ da4bc159e6920f1f7e45c92c39941690 lib/utils/deps.py
|
|||
f7c64515a3e4fcfe8266ca2be77be565 lib/utils/getch.py
|
||||
0d497906b06eb82d14da676e9f9c98f5 lib/utils/har.py
|
||||
d11f7f208ccf3a7753ccc417b4b01901 lib/utils/hashdb.py
|
||||
3302ee15997023b20babaa7c67e6b0b8 lib/utils/hash.py
|
||||
9d9bd2896858ce0eabbb9a4ef1f5ca0e lib/utils/hash.py
|
||||
17009289bb5c0dc0cceaa483113101e1 lib/utils/htmlentities.py
|
||||
fb6be55d21a70765e35549af2484f762 lib/utils/__init__.py
|
||||
833b05c72c9fa60b0a25b0a26f8f31fb lib/utils/pivotdumptable.py
|
||||
5a8902fd6fa94ea73cf44952f9ed5a57 lib/utils/progress.py
|
||||
b79654e49850937ab2dc8e0d73625cab lib/utils/purge.py
|
||||
081765fc1b3ad8a63f72e9c0e02ff00e lib/utils/search.py
|
||||
8d6b244ca3d6f99a9d6cd8c1856ccfeb lib/utils/sqlalchemy.py
|
||||
a90c568a9b88eaea832a77581bd39d85 lib/utils/timeout.py
|
||||
272a538a3d36186113191f4c543bb34b lib/utils/sqlalchemy.py
|
||||
68f90f633d812ca428d2f15f016b2d96 lib/utils/timeout.py
|
||||
164f830baad3e13b226ee57d44d69dfa lib/utils/versioncheck.py
|
||||
1e5d24f1c629476bdf43363d2c8d8397 lib/utils/xrange.py
|
||||
ab877805fe12bbcbb06b9eccfabdc4ed plugins/dbms/access/connector.py
|
||||
|
@ -133,7 +133,7 @@ e003fe19474305af522d8d6c6680db17 plugins/dbms/db2/fingerprint.py
|
|||
f2fb5a3763f69cde1b1d520f8bd6a17a plugins/dbms/db2/__init__.py
|
||||
61b06dce1b9a0a2f9962266a9c9495a5 plugins/dbms/db2/syntax.py
|
||||
fcbd61e7ac30eb4c8f09ffd341fa27bb plugins/dbms/db2/takeover.py
|
||||
e2d7c937e875e9d6f5e2c5612120b515 plugins/dbms/firebird/connector.py
|
||||
105b3dc94af3fdc22e90637ca9851da5 plugins/dbms/firebird/connector.py
|
||||
f43ca05279e8fce4f02e4948d4af8fda plugins/dbms/firebird/enumeration.py
|
||||
15a3a49824324c4cca444e6e63f84273 plugins/dbms/firebird/filesystem.py
|
||||
6b505575b98694fd8e6a19870305db18 plugins/dbms/firebird/fingerprint.py
|
||||
|
@ -147,7 +147,7 @@ eb7adf57e6e6cdb058435f4fa017e985 plugins/dbms/h2/fingerprint.py
|
|||
4d838e712aaee541eb07278a3f4a2d70 plugins/dbms/h2/__init__.py
|
||||
5a1e5c46053ec1be5f536cec644949b5 plugins/dbms/h2/syntax.py
|
||||
5afbe4ae5ab3fe5176b75ac3c5a16fae plugins/dbms/h2/takeover.py
|
||||
4bdbb0059d22e6a22fe2542f120d4b0b plugins/dbms/hsqldb/connector.py
|
||||
13ed609d378459b40f44f094beb55a5c plugins/dbms/hsqldb/connector.py
|
||||
cfc9923fe399f1735fb2befd81ff12be plugins/dbms/hsqldb/enumeration.py
|
||||
e4366df5a32c32f33be348e880714999 plugins/dbms/hsqldb/filesystem.py
|
||||
5d5c38e0961c5a4dade43da7149f2a28 plugins/dbms/hsqldb/fingerprint.py
|
||||
|
@ -169,7 +169,7 @@ ea186b97a394b61d82ecf7ed22b0cff6 plugins/dbms/maxdb/enumeration.py
|
|||
8ad820fdfd2454363279eda7a9a08e6e plugins/dbms/maxdb/__init__.py
|
||||
8fe248263926639acf41db3179db13d0 plugins/dbms/maxdb/syntax.py
|
||||
479ce664674859d0e61c5221f9e835fd plugins/dbms/maxdb/takeover.py
|
||||
ac7f2849d59829c3a1e67c76841071fd plugins/dbms/mssqlserver/connector.py
|
||||
1610a08c26895154287959193d8bd56f plugins/dbms/mssqlserver/connector.py
|
||||
69bfc53a409e79511802f668439bf4be plugins/dbms/mssqlserver/enumeration.py
|
||||
bb02bdf47c71ed93d28d20b98ea0f8c6 plugins/dbms/mssqlserver/filesystem.py
|
||||
bcabbf98e72bf3c6e971b56d8da60261 plugins/dbms/mssqlserver/fingerprint.py
|
||||
|
@ -211,7 +211,7 @@ d2391dfe74f053eb5f31b0efad3fdda0 plugins/dbms/sqlite/connector.py
|
|||
2fae8e5d100fc9fb70769e483c29e8fb plugins/dbms/sybase/__init__.py
|
||||
ec3f406591fc9472f5750bd40993e72e plugins/dbms/sybase/syntax.py
|
||||
369476221b3059106410de05766227e0 plugins/dbms/sybase/takeover.py
|
||||
147f6af265f6b5412bbd7aaebef95881 plugins/generic/connector.py
|
||||
312020bc31ffb0bc6077f62e6fff6e73 plugins/generic/connector.py
|
||||
54ac71c46c67c81196e2e6707e0989cf plugins/generic/custom.py
|
||||
a3fd48c7094fca6692be8b1ae5e29cea plugins/generic/databases.py
|
||||
9c2c830b3cf66953ecffa6cf88fc7c14 plugins/generic/entries.py
|
||||
|
@ -402,7 +402,7 @@ b6bc83ae9ea69cf96e9389bde8250c7c waf/airlock.py
|
|||
34b8ec9f438d7daa56aa016e6c09fadb waf/anquanbao.py
|
||||
7ab1a7cd51a02899592f4f755d36a02e waf/approach.py
|
||||
425f2599f57ab81b4fff67e6b442cccc waf/armor.py
|
||||
2d03af372a8e660e67437438264a144d waf/asm.py
|
||||
46a1d30bb52048c2092593acfa71bd52 waf/asm.py
|
||||
9dbec5d674ed4c762ffc9bc3ab402739 waf/aws.py
|
||||
e57a22864477ad23ae6a3d308f9b5410 waf/barracuda.py
|
||||
1712d76bd4adb705f3317ff5908acdcd waf/bitninja.py
|
||||
|
@ -450,7 +450,7 @@ d2d9718de217dd07d9e66b2e6ad61380 waf/safe3.py
|
|||
213062db202a6eb0939a6674f96be551 waf/safedog.py
|
||||
34440ee94fcff88b4158e86635176547 waf/secureentry.py
|
||||
ac0728ddb7a15b46b0eabd78cd661f8c waf/secureiis.py
|
||||
c6cbe2de808d7a6b614a9ba3c85b4141 waf/securesphere.py
|
||||
d425f890541a81cc11b0905842194274 waf/securesphere.py
|
||||
ba37e1c37fa0e3688873f74183a9cb9c waf/senginx.py
|
||||
2602a8baed4da643e606a379e4dc75db waf/shieldsecurity.py
|
||||
fc21ce1e6e597e44818c03d9cb859e83 waf/siteground.py
|
||||
|
|
|
@ -5,8 +5,6 @@ Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
|
|||
See the file 'LICENSE' for copying permission
|
||||
"""
|
||||
|
||||
import re
|
||||
|
||||
from lib.core.settings import WAF_ATTACK_VECTORS
|
||||
|
||||
__product__ = "Application Security Manager (F5 Networks)"
|
||||
|
|
|
@ -7,7 +7,6 @@ See the file 'LICENSE' for copying permission
|
|||
|
||||
import re
|
||||
|
||||
from lib.core.enums import HTTP_HEADER
|
||||
from lib.core.settings import WAF_ATTACK_VECTORS
|
||||
|
||||
__product__ = "SecureSphere Web Application Firewall (Imperva)"
|
||||
|
|
Loading…
Reference in New Issue
Block a user