Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 207bef7

Browse files
committed
fix for that SQLite3 vs SQLite2 issue
1 parent d0df8cd commit 207bef7

3 files changed

Lines changed: 35 additions & 17 deletions

File tree

lib/core/common.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -763,9 +763,9 @@ def parseTargetDirect():
763763
elif dbmsName == "Firebird":
764764
import kinterbasdb
765765
except ImportError, _:
766-
errMsg = "sqlmap requires %s third-party library " % data[1]
766+
errMsg = "sqlmap requires '%s' third-party library " % data[1]
767767
errMsg += "in order to directly connect to the database "
768-
errMsg += "%s. Download from %s" % (dbmsName, data[2])
768+
errMsg += "'%s'. Download from '%s'" % (dbmsName, data[2])
769769
raise sqlmapMissingDependence, errMsg
770770

771771
def parseTargetUrl():

lib/request/direct.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,15 @@ def direct(query, content=True):
3838
if not select:
3939
output = timeout(func=conf.dbmsConnector.execute, args=(query,), duration=conf.timeout, default=None)
4040
elif conf.hostname in kb.resumedQueries and query in kb.resumedQueries[conf.hostname] and "sqlmapoutput" not in query and "sqlmapfile" not in query:
41-
output = base64unpickle(kb.resumedQueries[conf.hostname][query][:-1])
41+
try:
42+
output = base64unpickle(kb.resumedQueries[conf.hostname][query][:-1])
43+
except:
44+
output = timeout(func=conf.dbmsConnector.select, args=(query,), duration=conf.timeout, default=None)
4245

4346
infoMsg = "resumed from file '%s': " % conf.sessionFile
4447
infoMsg += "%s..." % getUnicode(output)[:20]
4548
logger.info(infoMsg)
46-
elif select:
49+
else:
4750
output = timeout(func=conf.dbmsConnector.select, args=(query,), duration=conf.timeout, default=None)
4851

4952
if output is None or len(output) == 0:

plugins/dbms/sqlite/connector.py

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,59 +7,74 @@
77
See the file 'doc/COPYING' for copying permission
88
"""
99

10-
try:
11-
import sqlite3
12-
except ImportError, _:
13-
pass
10+
import sqlite3
1411

1512
from lib.core.convert import utf8encode
1613
from lib.core.data import conf
1714
from lib.core.data import logger
1815
from lib.core.exception import sqlmapConnectionException
16+
from lib.core.exception import sqlmapMissingDependence
1917

2018
from plugins.generic.connector import Connector as GenericConnector
2119

20+
2221
class Connector(GenericConnector):
2322
"""
2423
Homepage: http://pysqlite.googlecode.com/
2524
User guide: http://docs.python.org/release/2.5/lib/module-sqlite3.html
2625
API: http://docs.python.org/library/sqlite3.html
27-
Debian package: python-pysqlite2
26+
Debian package: python-pysqlite2 (SQLite 2), python-pysqlite3 (SQLite 3)
2827
License: MIT
2928
3029
Possible connectors: http://wiki.python.org/moin/SQLite
3130
"""
3231

3332
def __init__(self):
3433
GenericConnector.__init__(self)
34+
self.__sqlite = sqlite3
3535

3636
def connect(self):
3737
self.initConnection()
3838
self.checkFileDb()
3939

4040
try:
41-
self.connector = sqlite3.connect(database=self.db, check_same_thread=False, timeout=conf.timeout)
42-
except (sqlite3.DatabaseError, sqlite3.OperationalError), msg:
43-
raise sqlmapConnectionException, msg[0]
41+
self.connector = self.__sqlite.connect(database=self.db, check_same_thread=False, timeout=conf.timeout)
42+
43+
cursor = self.connector.cursor()
44+
cursor.execute("SELECT * FROM sqlite_master")
45+
cursor.close()
46+
47+
except (self.__sqlite.DatabaseError, self.__sqlite.OperationalError), msg:
48+
errMsg = "unable to connect using SQLite 3 library, trying with SQLite 2 (%s)" % msg[0]
49+
logger.error(errMsg)
50+
try:
51+
try:
52+
import sqlite
53+
except ImportError, _:
54+
errMsg = "sqlmap requires 'python-sqlite2' third-party library "
55+
errMsg += "in order to directly connect to the database '%s'" % self.db
56+
raise sqlmapMissingDependence, errMsg
57+
self.__sqlite = sqlite
58+
self.connector = self.__sqlite.connect(database=self.db, check_same_thread=False, timeout=conf.timeout)
59+
except (self.__sqlite.DatabaseError, self.__sqlite.OperationalError), msg:
60+
raise sqlmapConnectionException, msg[0]
4461

4562
self.setCursor()
4663
self.connected()
4764

4865
def fetchall(self):
4966
try:
5067
return self.cursor.fetchall()
51-
except sqlite3.OperationalError, msg:
68+
except self.__sqlite.OperationalError, msg:
5269
logger.log(8, msg[0])
5370
return None
5471

5572
def execute(self, query):
5673
try:
57-
import pdb
58-
pdb.set_trace()
5974
self.cursor.execute(utf8encode(query))
60-
except sqlite3.OperationalError, msg:
75+
except self.__sqlite.OperationalError, msg:
6176
logger.log(8, msg[0])
62-
except sqlite3.DatabaseError, msg:
77+
except self.__sqlite.DatabaseError, msg:
6378
raise sqlmapConnectionException, msg[0]
6479

6580
self.connector.commit()

0 commit comments

Comments
 (0)