4747from lib .core .convert import urlencode
4848from lib .core .exception import sqlmapFilePathException
4949from lib .core .exception import sqlmapNoneDataException
50+ from lib .core .exception import sqlmapMissingDependence
5051from lib .core .exception import sqlmapSyntaxException
5152from lib .core .settings import DESCRIPTION
5253from lib .core .settings import IS_WIN
5354from lib .core .settings import SITE
5455from lib .core .settings import SQL_STATEMENTS
56+ from lib .core .settings import SUPPORTED_DBMS
5557from lib .core .settings import VERSION_STRING
58+ from lib .core .settings import MSSQL_ALIASES
59+ from lib .core .settings import MYSQL_ALIASES
60+ from lib .core .settings import PGSQL_ALIASES
61+ from lib .core .settings import ORACLE_ALIASES
62+ from lib .core .settings import SQLITE_ALIASES
63+ from lib .core .settings import ACCESS_ALIASES
64+ from lib .core .settings import FIREBIRD_ALIASES
5665
5766def paramToDict (place , parameters = None ):
5867 """
@@ -319,7 +328,7 @@ def getDirs(webApi=None):
319328 [directories .add (directory ) for directory in defaultDirs ]
320329
321330 return directories
322-
331+
323332def filePathToString (filePath ):
324333 strRepl = filePath .replace ("/" , "_" ).replace ("\\ " , "_" )
325334 strRepl = strRepl .replace (" " , "_" ).replace (":" , "_" )
@@ -329,18 +338,18 @@ def filePathToString(filePath):
329338def dataToStdout (data ):
330339 sys .stdout .write (data )
331340 sys .stdout .flush ()
332-
341+
333342def dataToSessionFile (data ):
334343 if not conf .sessionFile :
335344 return
336345
337346 conf .sessionFP .write (data )
338347 conf .sessionFP .flush ()
339-
348+
340349def dataToDumpFile (dumpFile , data ):
341350 dumpFile .write (data )
342351 dumpFile .flush ()
343-
352+
344353def dataToOutFile (data ):
345354 if not data :
346355 return "No data retrieved"
@@ -586,10 +595,62 @@ def weAreFrozen():
586595
587596 return hasattr (sys , "frozen" )
588597
598+ def parseTargetDirect ():
599+ """
600+ Parse target dbms and set some attributes into the configuration singleton.
601+ """
602+
603+ if not conf .direct :
604+ return
605+
606+ details = None
607+
608+ for dbms in SUPPORTED_DBMS :
609+ details = re .search ("^(%s)://(.+?)\:(.+?)\@(.+?)\:([\d]+)\/(.+?)$" % dbms , conf .direct , re .I )
610+
611+ if details :
612+ conf .dbms = details .group (1 )
613+ conf .dbmsUser = details .group (2 )
614+ conf .dbmsPass = details .group (3 )
615+ conf .hostname = details .group (4 )
616+ conf .port = int (details .group (5 ))
617+ conf .dbmsDb = details .group (6 )
618+
619+ conf .parameters [None ] = "direct connection"
620+
621+ break
622+
623+ if not details :
624+ errMsg = "invalid target details, valid syntax is for instance: mysql://USER:PASSWORD@DBMS_IP:DBMS_PORT/DATABASE_NAME"
625+ raise sqlmapSyntaxException , errMsg
626+
627+ # TODO: add details for others python DBMS libraries
628+ dbmsDict = { "Microsoft SQL Server" : [MSSQL_ALIASES , "python-pymssql" , "http://pymssql.sourceforge.net/" ],
629+ "MySQL" : [MYSQL_ALIASES , "python-mysqldb" , "http://mysql-python.sourceforge.net/" ],
630+ "PostgreSQL" : [PGSQL_ALIASES , "python-psycopg2" , "http://initd.org/psycopg/" ],
631+ "Oracle" : [ORACLE_ALIASES , "" , "" ],
632+ "SQLite" : [SQLITE_ALIASES , "" , "" ],
633+ "Access" : [ACCESS_ALIASES , "" , "" ],
634+ "Firebird" : [FIREBIRD_ALIASES , "" , "" ] }
635+
636+ for dbmsName , data in dbmsDict .items ():
637+ if conf .dbms in data [0 ]:
638+ try :
639+ if dbmsName == "Microsoft SQL Server" :
640+ import pymssql
641+ elif dbmsName == "MySQL" :
642+ import MySQLdb
643+ elif dbmsName == "PostgreSQL" :
644+ import psycopg2
645+ except ImportError , _ :
646+ errMsg = "sqlmap requires %s third-party library " % data [1 ]
647+ errMsg += "in order to directly connect to the database "
648+ errMsg += "%s. Download from %s" % (dbmsName , data [2 ])
649+ raise sqlmapMissingDependence , errMsg
650+
589651def parseTargetUrl ():
590652 """
591- Parse target url and set some attributes into the configuration
592- singleton.
653+ Parse target url and set some attributes into the configuration singleton.
593654 """
594655
595656 if not conf .url :
0 commit comments