SIGN IN SIGN UP
sqlmapproject / sqlmap UNCLAIMED

Automatic SQL injection and database takeover tool

0 0 5 Python
2019-05-08 12:47:52 +02:00
#!/usr/bin/env python
2008-10-15 15:38:22 +00:00
"""
2019-01-05 21:38:52 +01:00
Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
2017-10-11 14:50:46 +02:00
See the file 'LICENSE' for copying permission
2008-10-15 15:38:22 +00:00
"""
import glob
2012-07-03 22:13:01 +02:00
import os
2008-10-15 15:38:22 +00:00
import re
import shutil
2016-12-19 23:47:39 +01:00
import subprocess
2018-03-03 00:50:47 +01:00
import sys
2010-01-18 14:59:24 +00:00
import time
import zipfile
2008-10-15 15:38:22 +00:00
2010-01-18 14:05:23 +00:00
from lib.core.common import dataToStdout
2015-10-16 23:59:39 +02:00
from lib.core.common import getSafeExString
from lib.core.common import getLatestRevision
from lib.core.common import pollProcess
from lib.core.common import readInput
2008-10-15 15:38:22 +00:00
from lib.core.data import conf
from lib.core.data import logger
from lib.core.data import paths
2012-07-26 00:02:38 +02:00
from lib.core.revision import getRevisionNumber
2012-07-08 19:24:25 +02:00
from lib.core.settings import GIT_REPOSITORY
from lib.core.settings import IS_WIN
from lib.core.settings import VERSION
from lib.core.settings import ZIPBALL_PAGE
2018-03-03 00:27:21 +01:00
from lib.core.settings import UNICODE_ENCODING
2019-05-02 23:51:54 +02:00
from thirdparty.six.moves import urllib as _urllib
2008-10-15 15:38:22 +00:00
def update():
2012-07-02 00:00:46 +01:00
if not conf.updateAll:
return
2012-07-03 22:13:01 +02:00
success = False
2010-01-18 14:59:24 +00:00
2015-10-22 20:51:05 +02:00
if not os.path.exists(os.path.join(paths.SQLMAP_ROOT_PATH, ".git")):
warnMsg = "not a git repository. It is recommended to clone the 'sqlmapproject/sqlmap' repository "
warnMsg += "from GitHub (e.g. 'git clone --depth 1 %s sqlmap')" % GIT_REPOSITORY
logger.warn(warnMsg)
if VERSION == getLatestRevision():
logger.info("already at the latest revision '%s'" % getRevisionNumber())
return
message = "do you want to try to fetch the latest 'zipball' from repository and extract it (experimental) ? [y/N]"
if readInput(message, default='N', boolean=True):
directory = os.path.abspath(paths.SQLMAP_ROOT_PATH)
try:
open(os.path.join(directory, "sqlmap.py"), "w+b")
2019-01-22 00:40:48 +01:00
except Exception as ex:
errMsg = "unable to update content of directory '%s' ('%s')" % (directory, getSafeExString(ex))
logger.error(errMsg)
else:
2018-06-01 11:23:41 +02:00
attrs = os.stat(os.path.join(directory, "sqlmap.py")).st_mode
for wildcard in ('*', ".*"):
for _ in glob.glob(os.path.join(directory, wildcard)):
try:
if os.path.isdir(_):
shutil.rmtree(_)
else:
os.remove(_)
except:
pass
if glob.glob(os.path.join(directory, '*')):
errMsg = "unable to clear the content of directory '%s'" % directory
logger.error(errMsg)
else:
try:
2019-05-02 23:51:54 +02:00
archive = _urllib.request.urlretrieve(ZIPBALL_PAGE)[0]
with zipfile.ZipFile(archive) as f:
for info in f.infolist():
info.filename = re.sub(r"\Asqlmap[^/]+", "", info.filename)
if info.filename:
f.extract(info, directory)
filepath = os.path.join(paths.SQLMAP_ROOT_PATH, "lib", "core", "settings.py")
if os.path.isfile(filepath):
with open(filepath, "rb") as f:
version = re.search(r"(?m)^VERSION\s*=\s*['\"]([^'\"]+)", f.read()).group(1)
logger.info("updated to the latest version '%s#dev'" % version)
success = True
2019-01-22 00:40:48 +01:00
except Exception as ex:
logger.error("update could not be completed ('%s')" % getSafeExString(ex))
else:
if not success:
logger.error("update could not be completed")
2018-06-01 11:23:41 +02:00
else:
2018-06-09 22:59:08 +02:00
try:
os.chmod(os.path.join(directory, "sqlmap.py"), attrs)
except OSError:
logger.warning("could not set the file attributes of '%s'" % os.path.join(directory, "sqlmap.py"))
2012-07-03 22:13:01 +02:00
else:
2018-01-21 11:49:50 +01:00
infoMsg = "updating sqlmap to the latest development revision from the "
2012-07-03 22:13:01 +02:00
infoMsg += "GitHub repository"
logger.info(infoMsg)
2010-01-18 14:59:24 +00:00
2012-07-03 22:13:01 +02:00
debugMsg = "sqlmap will try to update itself using 'git' command"
logger.debug(debugMsg)
2019-01-29 14:59:31 +01:00
dataToStdout("\r[%s] [INFO] update in progress" % time.strftime("%X"))
2015-10-16 23:59:39 +02:00
try:
2018-03-03 00:27:21 +01:00
process = subprocess.Popen("git checkout . && git pull %s HEAD" % GIT_REPOSITORY, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=paths.SQLMAP_ROOT_PATH.encode(sys.getfilesystemencoding() or UNICODE_ENCODING))
2015-10-16 23:59:39 +02:00
pollProcess(process, True)
stdout, stderr = process.communicate()
success = not process.returncode
2019-01-22 00:40:48 +01:00
except (IOError, OSError) as ex:
2015-10-16 23:59:39 +02:00
success = False
stderr = getSafeExString(ex)
2011-01-31 22:51:14 +00:00
2012-07-03 22:13:01 +02:00
if success:
logger.info("%s the latest revision '%s'" % ("already at" if "Already" in stdout else "updated to", getRevisionNumber()))
2012-07-03 22:13:01 +02:00
else:
if "Not a git repository" in stderr:
errMsg = "not a valid git repository. Please checkout the 'sqlmapproject/sqlmap' repository "
errMsg += "from GitHub (e.g. 'git clone --depth 1 %s sqlmap')" % GIT_REPOSITORY
logger.error(errMsg)
else:
logger.error("update could not be completed ('%s')" % re.sub(r"\W+", " ", stderr).strip())
2012-07-03 16:49:34 +02:00
2012-07-03 22:13:01 +02:00
if not success:
2012-07-03 16:49:34 +02:00
if IS_WIN:
infoMsg = "for Windows platform it's recommended "
infoMsg += "to use a GitHub for Windows client for updating "
2012-07-04 20:28:18 +02:00
infoMsg += "purposes (http://windows.github.com/) or just "
infoMsg += "download the latest snapshot from "
infoMsg += "https://github.com/sqlmapproject/sqlmap/downloads"
2012-07-03 16:49:34 +02:00
else:
infoMsg = "for Linux platform it's recommended "
2012-07-03 22:13:01 +02:00
infoMsg += "to install a standard 'git' package (e.g.: 'sudo apt-get install git')"
2012-07-03 16:34:11 +02:00
logger.info(infoMsg)