同步操作将从 yeqingchen1/sqlmap 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
#!/usr/bin/env python"""Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)See the file 'LICENSE' for copying permission"""import codecsimport osimport sysfrom lib.core.agent import agentfrom lib.core.common import Backendfrom lib.core.common import checkFilefrom lib.core.common import dataToOutFilefrom lib.core.common import decloakToTempfrom lib.core.common import decodeDbmsHexValuefrom lib.core.common import isListLikefrom lib.core.common import isNumPosStrValuefrom lib.core.common import isStackingAvailablefrom lib.core.common import isTechniqueAvailablefrom lib.core.common import readInputfrom lib.core.compat import xrangefrom lib.core.convert import encodeBase64from lib.core.convert import encodeHexfrom lib.core.convert import getTextfrom lib.core.convert import getUnicodefrom lib.core.data import conffrom lib.core.data import kbfrom lib.core.data import loggerfrom lib.core.enums import CHARSET_TYPEfrom lib.core.enums import DBMSfrom lib.core.enums import EXPECTEDfrom lib.core.enums import PAYLOADfrom lib.core.exception import SqlmapUndefinedMethodfrom lib.core.settings import UNICODE_ENCODINGfrom lib.request import injectclass Filesystem(object):"""This class defines generic OS file system functionalities for plugins."""def __init__(self):self.fileTblName = "%sfile" % conf.tablePrefixself.tblField = "data"def _checkFileLength(self, localFile, remoteFile, fileRead=False):if Backend.isDbms(DBMS.MYSQL):lengthQuery = "LENGTH(LOAD_FILE('%s'))" % remoteFileelif Backend.isDbms(DBMS.PGSQL) and not fileRead:lengthQuery = "SELECT SUM(LENGTH(data)) FROM pg_largeobject WHERE loid=%d" % self.oidelif Backend.isDbms(DBMS.MSSQL):self.createSupportTbl(self.fileTblName, self.tblField, "VARBINARY(MAX)")inject.goStacked("INSERT INTO %s(%s) SELECT %s FROM OPENROWSET(BULK '%s', SINGLE_BLOB) AS %s(%s)" % (self.fileTblName, self.tblField, self.tblField, remoteFile, self.fileTblName, self.tblField))lengthQuery = "SELECT DATALENGTH(%s) FROM %s" % (self.tblField, self.fileTblName)try:localFileSize = os.path.getsize(localFile)except OSError:warnMsg = "file '%s' is missing" % localFilelogger.warn(warnMsg)localFileSize = 0if fileRead and Backend.isDbms(DBMS.PGSQL):logger.info("length of read file '%s' cannot be checked on PostgreSQL" % remoteFile)sameFile = Trueelse:logger.debug("checking the length of the remote file '%s'" % remoteFile)remoteFileSize = inject.getValue(lengthQuery, resumeValue=False, expected=EXPECTED.INT, charsetType=CHARSET_TYPE.DIGITS)sameFile = Noneif isNumPosStrValue(remoteFileSize):remoteFileSize = int(remoteFileSize)localFile = getUnicode(localFile, encoding=sys.getfilesystemencoding() or UNICODE_ENCODING)sameFile = Falseif localFileSize == remoteFileSize:sameFile = TrueinfoMsg = "the local file '%s' and the remote file " % localFileinfoMsg += "'%s' have the same size (%d B)" % (remoteFile, localFileSize)elif remoteFileSize > localFileSize:infoMsg = "the remote file '%s' is larger (%d B) than " % (remoteFile, remoteFileSize)infoMsg += "the local file '%s' (%dB)" % (localFile, localFileSize)else:infoMsg = "the remote file '%s' is smaller (%d B) than " % (remoteFile, remoteFileSize)infoMsg += "file '%s' (%d B)" % (localFile, localFileSize)logger.info(infoMsg)else:sameFile = FalsewarnMsg = "it looks like the file has not been written (usually "warnMsg += "occurs if the DBMS process user has no write "warnMsg += "privileges in the destination path)"logger.warn(warnMsg)return sameFiledef fileToSqlQueries(self, fcEncodedList):"""Called by MySQL and PostgreSQL plugins to write a file on theback-end DBMS underlying file system"""counter = 0sqlQueries = []for fcEncodedLine in fcEncodedList:if counter == 0:sqlQueries.append("INSERT INTO %s(%s) VALUES (%s)" % (self.fileTblName, self.tblField, fcEncodedLine))else:updatedField = agent.simpleConcatenate(self.tblField, fcEncodedLine)sqlQueries.append("UPDATE %s SET %s=%s" % (self.fileTblName, self.tblField, updatedField))counter += 1return sqlQueriesdef fileEncode(self, fileName, encoding, single, chunkSize=256):"""Called by MySQL and PostgreSQL plugins to write a file on theback-end DBMS underlying file system"""checkFile(fileName)with open(fileName, "rb") as f:content = f.read()return self.fileContentEncode(content, encoding, single, chunkSize)def fileContentEncode(self, content, encoding, single, chunkSize=256):retVal = []if encoding == "hex":content = encodeHex(content)elif encoding == "base64":content = encodeBase64(content)else:content = codecs.encode(content, encoding)content = getText(content).replace("\n", "")if not single:if len(content) > chunkSize:for i in xrange(0, len(content), chunkSize):_ = content[i:i + chunkSize]if encoding == "hex":_ = "0x%s" % _elif encoding == "base64":_ = "'%s'" % _retVal.append(_)if not retVal:if encoding == "hex":content = "0x%s" % contentelif encoding == "base64":content = "'%s'" % contentretVal = [content]return retValdef askCheckWrittenFile(self, localFile, remoteFile, forceCheck=False):choice = Noneif forceCheck is not True:message = "do you want confirmation that the local file '%s' " % localFilemessage += "has been successfully written on the back-end DBMS "message += "file system ('%s')? [Y/n] " % remoteFilechoice = readInput(message, default='Y', boolean=True)if forceCheck or choice:return self._checkFileLength(localFile, remoteFile)return Truedef askCheckReadFile(self, localFile, remoteFile):if not kb.bruteMode:message = "do you want confirmation that the remote file '%s' " % remoteFilemessage += "has been successfully downloaded from the back-end "message += "DBMS file system? [Y/n] "if readInput(message, default='Y', boolean=True):return self._checkFileLength(localFile, remoteFile, True)return Nonedef nonStackedReadFile(self, remoteFile):errMsg = "'nonStackedReadFile' method must be defined "errMsg += "into the specific DBMS plugin"raise SqlmapUndefinedMethod(errMsg)def stackedReadFile(self, remoteFile):errMsg = "'stackedReadFile' method must be defined "errMsg += "into the specific DBMS plugin"raise SqlmapUndefinedMethod(errMsg)def unionWriteFile(self, localFile, remoteFile, fileType, forceCheck=False):errMsg = "'unionWriteFile' method must be defined "errMsg += "into the specific DBMS plugin"raise SqlmapUndefinedMethod(errMsg)def stackedWriteFile(self, localFile, remoteFile, fileType, forceCheck=False):errMsg = "'stackedWriteFile' method must be defined "errMsg += "into the specific DBMS plugin"raise SqlmapUndefinedMethod(errMsg)def readFile(self, remoteFile):localFilePaths = []self.checkDbmsOs()for remoteFile in remoteFile.split(','):fileContent = Nonekb.fileReadMode = Trueif conf.direct or isStackingAvailable():if isStackingAvailable():debugMsg = "going to read the file with stacked query SQL "debugMsg += "injection technique"logger.debug(debugMsg)fileContent = self.stackedReadFile(remoteFile)elif Backend.isDbms(DBMS.MYSQL):debugMsg = "going to read the file with a non-stacked query "debugMsg += "SQL injection technique"logger.debug(debugMsg)fileContent = self.nonStackedReadFile(remoteFile)else:errMsg = "none of the SQL injection techniques detected can "errMsg += "be used to read files from the underlying file "errMsg += "system of the back-end %s server" % Backend.getDbms()logger.error(errMsg)fileContent = Nonekb.fileReadMode = Falseif fileContent in (None, "") and not Backend.isDbms(DBMS.PGSQL):self.cleanup(onlyFileTbl=True)elif isListLike(fileContent):newFileContent = ""for chunk in fileContent:if isListLike(chunk):if len(chunk) > 0:chunk = chunk[0]else:chunk = ""if chunk:newFileContent += chunkfileContent = newFileContentif fileContent is not None:fileContent = decodeDbmsHexValue(fileContent, True)if fileContent.strip():localFilePath = dataToOutFile(remoteFile, fileContent)if not Backend.isDbms(DBMS.PGSQL):self.cleanup(onlyFileTbl=True)sameFile = self.askCheckReadFile(localFilePath, remoteFile)if sameFile is True:localFilePath += " (same file)"elif sameFile is False:localFilePath += " (size differs from remote file)"localFilePaths.append(localFilePath)elif not kb.bruteMode:errMsg = "no data retrieved"logger.error(errMsg)return localFilePathsdef writeFile(self, localFile, remoteFile, fileType=None, forceCheck=False):written = FalsecheckFile(localFile)self.checkDbmsOs()if localFile.endswith('_'):localFile = getUnicode(decloakToTemp(localFile))if conf.direct or isStackingAvailable():if isStackingAvailable():debugMsg = "going to upload the file '%s' with " % fileTypedebugMsg += "stacked query technique"logger.debug(debugMsg)written = self.stackedWriteFile(localFile, remoteFile, fileType, forceCheck)self.cleanup(onlyFileTbl=True)elif isTechniqueAvailable(PAYLOAD.TECHNIQUE.UNION) and Backend.isDbms(DBMS.MYSQL):debugMsg = "going to upload the file '%s' with " % fileTypedebugMsg += "UNION query technique"logger.debug(debugMsg)written = self.unionWriteFile(localFile, remoteFile, fileType, forceCheck)elif Backend.isDbms(DBMS.MYSQL):debugMsg = "going to upload the file '%s' with " % fileTypedebugMsg += "LINES TERMINATED BY technique"logger.debug(debugMsg)written = self.linesTerminatedWriteFile(localFile, remoteFile, fileType, forceCheck)else:errMsg = "none of the SQL injection techniques detected can "errMsg += "be used to write files to the underlying file "errMsg += "system of the back-end %s server" % Backend.getDbms()logger.error(errMsg)return Nonereturn written
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。