Fix (and some hidden bug fixes/improvements) regarding an Issue #317

This commit is contained in:
Miroslav Stampar 2012-12-21 10:51:35 +01:00
parent 352e516400
commit 35728fa443
4 changed files with 31 additions and 23 deletions

View File

@ -737,13 +737,13 @@ def dataToDumpFile(dumpFile, data):
dumpFile.flush() dumpFile.flush()
def dataToOutFile(filename, data): def dataToOutFile(filename, data):
if not data: retVal = None
return "No data retrieved"
retVal = "%s%s%s" % (conf.filePath, os.sep, filePathToString(filename)) if data:
retVal = "%s%s%s" % (conf.filePath, os.sep, filePathToString(filename))
with codecs.open(retVal, "wb") as f: with codecs.open(retVal, "wb", UNICODE_ENCODING) as f:
f.write(data) f.write(data)
return retVal return retVal
@ -3170,19 +3170,20 @@ def decodeHexValue(value):
retVal = value retVal = value
def _(value): def _(value):
retVal = value
if value and isinstance(value, basestring) and len(value) % 2 == 0: if value and isinstance(value, basestring) and len(value) % 2 == 0:
value = hexdecode(value) retVal = hexdecode(retVal)
if Backend.isDbms(DBMS.MSSQL): if Backend.isDbms(DBMS.MSSQL) and value.startswith("0x"):
try: try:
value = value.decode("utf-16-le") retVal = retVal.decode("utf-16-le")
except UnicodeDecodeError: except UnicodeDecodeError:
pass pass
if not isinstance(value, unicode): if not isinstance(retVal, unicode):
value = getUnicode(value, "utf8") retVal = getUnicode(retVal, "utf8")
return value return retVal
try: try:
retVal = applyFunctionRecursively(value, _) retVal = applyFunctionRecursively(value, _)

View File

@ -531,7 +531,7 @@ class Metasploit:
errMsg = "failed to create the shellcode (%s)" % payloadStderr.replace("\n", " ").replace("\r", "") errMsg = "failed to create the shellcode (%s)" % payloadStderr.replace("\n", " ").replace("\r", "")
raise SqlmapFilePathException, errMsg raise SqlmapFilePathException, errMsg
self._shellcodeFP = codecs.open(self._shellcodeFilePath, "rb") self._shellcodeFP = codecs.open(self._shellcodeFilePath, "rb", UNICODE_ENCODING)
self.shellcodeString = self._shellcodeFP.read() self.shellcodeString = self._shellcodeFP.read()
self._shellcodeFP.close() self._shellcodeFP.close()

View File

@ -23,6 +23,7 @@ from lib.core.enums import EXPECTED
from lib.core.enums import PAYLOAD from lib.core.enums import PAYLOAD
from lib.core.exception import SqlmapNoneDataException from lib.core.exception import SqlmapNoneDataException
from lib.core.exception import SqlmapUnsupportedFeatureException from lib.core.exception import SqlmapUnsupportedFeatureException
from lib.core.settings import UNICODE_ENCODING
from lib.request import inject from lib.request import inject
from plugins.generic.filesystem import Filesystem as GenericFilesystem from plugins.generic.filesystem import Filesystem as GenericFilesystem
@ -337,7 +338,7 @@ class Filesystem(GenericFilesystem):
tmpPath = posixToNtSlashes(conf.tmpPath) tmpPath = posixToNtSlashes(conf.tmpPath)
dFile = posixToNtSlashes(dFile) dFile = posixToNtSlashes(dFile)
wFilePointer = codecs.open(wFile, "rb") wFilePointer = codecs.open(wFile, "rb", UNICODE_ENCODING)
wFileContent = wFilePointer.read() wFileContent = wFilePointer.read()
wFilePointer.close() wFilePointer.close()

View File

@ -25,6 +25,7 @@ from lib.core.enums import CHARSET_TYPE
from lib.core.enums import EXPECTED from lib.core.enums import EXPECTED
from lib.core.enums import PAYLOAD from lib.core.enums import PAYLOAD
from lib.core.exception import SqlmapUndefinedMethod from lib.core.exception import SqlmapUndefinedMethod
from lib.core.settings import UNICODE_ENCODING
from lib.request import inject from lib.request import inject
class Filesystem: class Filesystem:
@ -112,7 +113,7 @@ class Filesystem:
""" """
retVal = [] retVal = []
with codecs.open(fileName, "rb") as f: with codecs.open(fileName, "rb", UNICODE_ENCODING) as f:
content = f.read().encode(encoding).replace("\n", "") content = f.read().encode(encoding).replace("\n", "")
if not single: if not single:
@ -230,19 +231,24 @@ class Filesystem:
if fileContent is not None: if fileContent is not None:
fileContent = decodeHexValue(fileContent) fileContent = decodeHexValue(fileContent)
localFilePath = dataToOutFile(remoteFile, fileContent)
if not Backend.isDbms(DBMS.PGSQL): if fileContent:
self.cleanup(onlyFileTbl=True) localFilePath = dataToOutFile(remoteFile, fileContent)
sameFile = self.askCheckReadFile(localFilePath, remoteFile) if not Backend.isDbms(DBMS.PGSQL):
self.cleanup(onlyFileTbl=True)
if sameFile is True: sameFile = self.askCheckReadFile(localFilePath, remoteFile)
localFilePath += " (same file)"
elif sameFile is False:
localFilePath += " (size differs from remote file)"
localFilePaths.append(localFilePath) if sameFile is True:
localFilePath += " (same file)"
elif sameFile is False:
localFilePath += " (size differs from remote file)"
localFilePaths.append(localFilePath)
else:
errMsg = "no data retrieved"
logger.error(errMsg)
return localFilePaths return localFilePaths