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

Skip to content

Commit f9eac97

Browse files
committed
refactoring of MSSQL XML banner parsing
1 parent 14de580 commit f9eac97

4 files changed

Lines changed: 3150 additions & 1187 deletions

File tree

extra/mssqlsig/update.py

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
#!/usr/bin/env python
2+
3+
"""
4+
$Id: fingerprint.py 2463 2010-11-30 22:40:25Z inquisb $
5+
6+
Copyright (c) 2006-2010 sqlmap developers (http://sqlmap.sourceforge.net/)
7+
See the file 'doc/COPYING' for copying permission
8+
"""
9+
10+
# Removes duplicate entries in wordlist like files
11+
12+
import codecs
13+
import difflib
14+
import os
15+
import re
16+
import sys
17+
import urllib2
18+
import urlparse
19+
20+
from xml.dom.minidom import Document
21+
22+
MSSQL_XML = os.path.abspath("../../xml/banner/mssql.xml")
23+
24+
# Url to update Microsoft SQL Server XML versions file from
25+
MSSQL_VERSIONS_URL = "http://www.sqlsecurity.com/FAQs/SQLServerVersionDatabase/tabid/63/Default.aspx"
26+
27+
def updateMSSQLXML():
28+
infoMsg = "[INFO] retrieving data from '%s'" % MSSQL_VERSIONS_URL
29+
print infoMsg
30+
31+
try:
32+
req = urllib2.Request(MSSQL_VERSIONS_URL)
33+
f = urllib2.urlopen(req)
34+
mssqlVersionsHtmlString = f.read()
35+
f.close()
36+
except urllib2.URLError:
37+
__mssqlPath = urlparse.urlsplit(MSSQL_VERSIONS_URL)
38+
__mssqlHostname = __mssqlPath[1]
39+
40+
warnMsg = "[WARNING] sqlmap was unable to connect to %s," % __mssqlHostname
41+
warnMsg += " check your Internet connection and retry"
42+
print warnMsg
43+
44+
return
45+
46+
releases = re.findall("class=\"BCC_DV_01DarkBlueTitle\">SQL Server ([\d\.]+) Builds", mssqlVersionsHtmlString, re.I | re.M)
47+
releasesCount = len(releases)
48+
49+
# Create the minidom document
50+
doc = Document()
51+
52+
# Create the <root> base element
53+
root = doc.createElement("root")
54+
doc.appendChild(root)
55+
56+
for index in range(0, releasesCount):
57+
release = releases[index]
58+
59+
# Skip Microsoft SQL Server 6.5 because the HTML
60+
# table is in another format
61+
if release == "6.5":
62+
continue
63+
64+
# Create the <signatures> base element
65+
signatures = doc.createElement("signatures")
66+
signatures.setAttribute("release", release)
67+
root.appendChild(signatures)
68+
69+
startIdx = mssqlVersionsHtmlString.index("SQL Server %s Builds" % releases[index])
70+
71+
if index == releasesCount - 1:
72+
stopIdx = len(mssqlVersionsHtmlString)
73+
else:
74+
stopIdx = mssqlVersionsHtmlString.index("SQL Server %s Builds" % releases[index + 1])
75+
76+
mssqlVersionsReleaseString = mssqlVersionsHtmlString[startIdx:stopIdx]
77+
servicepackVersion = re.findall("</td><td>[7\.0|2000|2005|2008]*(.*?)</td><td.*?([\d\.]+)</td>[\r]*\n", mssqlVersionsReleaseString, re.I | re.M)
78+
79+
for servicePack, version in servicepackVersion:
80+
if servicePack.startswith(" "):
81+
servicePack = servicePack[1:]
82+
if "/" in servicePack:
83+
servicePack = servicePack[:servicePack.index("/")]
84+
if "(" in servicePack:
85+
servicePack = servicePack[:servicePack.index("(")]
86+
if "-" in servicePack:
87+
servicePack = servicePack[:servicePack.index("-")]
88+
if "*" in servicePack:
89+
servicePack = servicePack[:servicePack.index("*")]
90+
if servicePack.startswith("+"):
91+
servicePack = "0%s" % servicePack
92+
93+
servicePack = servicePack.replace("\t", " ")
94+
servicePack = servicePack.replace("No SP", "0")
95+
servicePack = servicePack.replace("RTM", "0")
96+
servicePack = servicePack.replace("SP", "")
97+
servicePack = servicePack.replace("Service Pack", "")
98+
servicePack = servicePack.replace("<a href=\"http:", "")
99+
servicePack = servicePack.replace(" ", " ")
100+
servicePack = servicePack.replace("+ ", "+")
101+
servicePack = servicePack.replace(" +", "+")
102+
103+
if servicePack.endswith(" "):
104+
servicePack = servicePack[:-1]
105+
106+
if servicePack and version:
107+
# Create the main <card> element
108+
signature = doc.createElement("signature")
109+
signatures.appendChild(signature)
110+
111+
# Create a <version> element
112+
versionElement = doc.createElement("version")
113+
signature.appendChild(versionElement)
114+
115+
# Give the <version> elemenet some text
116+
versionText = doc.createTextNode(version)
117+
versionElement.appendChild(versionText)
118+
119+
# Create a <servicepack> element
120+
servicepackElement = doc.createElement("servicepack")
121+
signature.appendChild(servicepackElement)
122+
123+
# Give the <servicepack> elemenet some text
124+
servicepackText = doc.createTextNode(servicePack)
125+
servicepackElement.appendChild(servicepackText)
126+
127+
# Save our newly created XML to the signatures file
128+
mssqlXml = codecs.open(MSSQL_XML, "w", "utf8")
129+
doc.writexml(writer=mssqlXml, addindent=" ", newl="\n")
130+
mssqlXml.close()
131+
132+
infoMsg = "[INFO] done. retrieved data parsed and saved into '%s'" % MSSQL_XML
133+
print infoMsg
134+
135+
if __name__ == "__main__":
136+
updateMSSQLXML()

lib/core/settings.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -100,9 +100,6 @@
100100
PLATFORM = os.name
101101
PYVERSION = sys.version.split()[0]
102102

103-
# Url to update Microsoft SQL Server XML versions file from
104-
MSSQL_VERSIONS_URL = "http://www.sqlsecurity.com/FAQs/SQLServerVersionDatabase/tabid/63/Default.aspx"
105-
106103
# Database management system specific variables
107104
MSSQL_SYSTEM_DBS = ( "Northwind", "model", "msdb", "pubs", "tempdb" )
108105
MYSQL_SYSTEM_DBS = ( "information_schema", "mysql" ) # Before MySQL 5.0 only "mysql"

lib/core/update.py

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

10-
import codecs
11-
import difflib
1210
import os
1311
import re
1412
import shutil
1513
import sys
1614
import time
17-
import urlparse
1815

1916
from distutils.dir_util import mkpath
20-
from xml.dom.minidom import Document
2117

2218
from subprocess import PIPE
2319
from subprocess import Popen as execute
@@ -28,166 +24,15 @@
2824
from lib.core.data import conf
2925
from lib.core.data import logger
3026
from lib.core.data import paths
31-
from lib.core.exception import sqlmapConnectionException
3227
from lib.core.exception import sqlmapFilePathException
33-
from lib.core.settings import MSSQL_VERSIONS_URL
3428
from lib.core.settings import UNICODE_ENCODING
3529
from lib.core.subprocessng import pollProcess
3630
from lib.request.connect import Connect as Request
3731

38-
def __updateMSSQLXML():
39-
infoMsg = "updating Microsoft SQL Server XML versions file"
40-
logger.info(infoMsg)
41-
42-
try:
43-
mssqlVersionsHtmlString, _ = Request.getPage(url=MSSQL_VERSIONS_URL, direct=True)
44-
except sqlmapConnectionException, _:
45-
__mssqlPath = urlparse.urlsplit(MSSQL_VERSIONS_URL)
46-
__mssqlHostname = __mssqlPath[1]
47-
48-
warnMsg = "sqlmap was unable to connect to %s," % __mssqlHostname
49-
warnMsg += " check your Internet connection and retry"
50-
logger.warn(warnMsg)
51-
32+
def update():
33+
if not conf.updateAll:
5234
return
5335

54-
releases = re.findall("class=\"BCC_DV_01DarkBlueTitle\">SQL Server ([\d\.]+) Builds", mssqlVersionsHtmlString, re.I | re.M)
55-
releasesCount = len(releases)
56-
57-
# Create the minidom document
58-
doc = Document()
59-
60-
# Create the <root> base element
61-
root = doc.createElement("root")
62-
doc.appendChild(root)
63-
64-
for index in range(0, releasesCount):
65-
release = releases[index]
66-
67-
# Skip Microsoft SQL Server 6.5 because the HTML
68-
# table is in another format
69-
if release == "6.5":
70-
continue
71-
72-
# Create the <signatures> base element
73-
signatures = doc.createElement("signatures")
74-
signatures.setAttribute("release", release)
75-
root.appendChild(signatures)
76-
77-
startIdx = mssqlVersionsHtmlString.index("SQL Server %s Builds" % releases[index])
78-
79-
if index == releasesCount - 1:
80-
stopIdx = len(mssqlVersionsHtmlString)
81-
else:
82-
stopIdx = mssqlVersionsHtmlString.index("SQL Server %s Builds" % releases[index + 1])
83-
84-
mssqlVersionsReleaseString = mssqlVersionsHtmlString[startIdx:stopIdx]
85-
servicepackVersion = re.findall("</td><td>[7\.0|2000|2005|2008]*(.*?)</td><td.*?([\d\.]+)</td>[\r]*\n", mssqlVersionsReleaseString, re.I | re.M)
86-
87-
for servicePack, version in servicepackVersion:
88-
if servicePack.startswith(" "):
89-
servicePack = servicePack[1:]
90-
if "/" in servicePack:
91-
servicePack = servicePack[:servicePack.index("/")]
92-
if "(" in servicePack:
93-
servicePack = servicePack[:servicePack.index("(")]
94-
if "-" in servicePack:
95-
servicePack = servicePack[:servicePack.index("-")]
96-
if "*" in servicePack:
97-
servicePack = servicePack[:servicePack.index("*")]
98-
if servicePack.startswith("+"):
99-
servicePack = "0%s" % servicePack
100-
101-
servicePack = servicePack.replace("\t", " ")
102-
servicePack = servicePack.replace("No SP", "0")
103-
servicePack = servicePack.replace("RTM", "0")
104-
servicePack = servicePack.replace("SP", "")
105-
servicePack = servicePack.replace("Service Pack", "")
106-
servicePack = servicePack.replace("<a href=\"http:", "")
107-
servicePack = servicePack.replace(" ", " ")
108-
servicePack = servicePack.replace("+ ", "+")
109-
servicePack = servicePack.replace(" +", "+")
110-
111-
if servicePack.endswith(" "):
112-
servicePack = servicePack[:-1]
113-
114-
if servicePack and version:
115-
# Create the main <card> element
116-
signature = doc.createElement("signature")
117-
signatures.appendChild(signature)
118-
119-
# Create a <version> element
120-
versionElement = doc.createElement("version")
121-
signature.appendChild(versionElement)
122-
123-
# Give the <version> elemenet some text
124-
versionText = doc.createTextNode(version)
125-
versionElement.appendChild(versionText)
126-
127-
# Create a <servicepack> element
128-
servicepackElement = doc.createElement("servicepack")
129-
signature.appendChild(servicepackElement)
130-
131-
# Give the <servicepack> elemenet some text
132-
servicepackText = doc.createTextNode(servicePack)
133-
servicepackElement.appendChild(servicepackText)
134-
135-
# Get the XML old file content to a local variable
136-
mssqlXml = codecs.open(paths.MSSQL_XML, "r", UNICODE_ENCODING)
137-
oldMssqlXml = mssqlXml.read()
138-
oldMssqlXmlSignatures = oldMssqlXml.count("<signature>")
139-
oldMssqlXmlList = oldMssqlXml.splitlines(1)
140-
mssqlXml.close()
141-
142-
# Backup the XML old file
143-
shutil.copy(paths.MSSQL_XML, "%s.bak" % paths.MSSQL_XML)
144-
145-
# Save our newly created XML to the signatures file
146-
mssqlXml = codecs.open(paths.MSSQL_XML, "w", UNICODE_ENCODING)
147-
doc.writexml(writer=mssqlXml, addindent=" ", newl="\n")
148-
mssqlXml.close()
149-
150-
# Get the XML new file content to a local variable
151-
mssqlXml = codecs.open(paths.MSSQL_XML, "r", UNICODE_ENCODING)
152-
newMssqlXml = mssqlXml.read()
153-
newMssqlXmlSignatures = newMssqlXml.count("<signature>")
154-
newMssqlXmlList = newMssqlXml.splitlines(1)
155-
mssqlXml.close()
156-
157-
# If the new XML versions file differs from the old one it probably
158-
# means that we have got new Microsoft SQL Server versions
159-
if oldMssqlXmlSignatures != newMssqlXmlSignatures:
160-
infoMsg = "Microsoft SQL Server XML versions file updated successfully. "
161-
162-
if oldMssqlXmlSignatures < newMssqlXmlSignatures:
163-
infoMsg += "%d " % (newMssqlXmlSignatures - oldMssqlXmlSignatures)
164-
infoMsg += "new signatures added since the last update"
165-
166-
# NOTE: This should never happen, in this rare case it might
167-
# be that the Microsoft SQL Server versions database
168-
# (MSSQL_VERSIONS_URL) changed its structure
169-
else:
170-
infoMsg += "%d " % (oldMssqlXmlSignatures - newMssqlXmlSignatures)
171-
infoMsg += "signatures removed since the last update"
172-
173-
logger.info(infoMsg)
174-
175-
message = "Do you want to see the differences? [Y/n] "
176-
test = readInput(message, default="Y")
177-
178-
if not test or test[0] in ("y", "Y"):
179-
infoMsg = "Differences:"
180-
logger.info(infoMsg)
181-
182-
# Compare the old XML file with the new one
183-
diff = difflib.unified_diff(oldMssqlXmlList, newMssqlXmlList, "%s.bak" % paths.MSSQL_XML, paths.MSSQL_XML)
184-
sys.stdout.writelines(diff)
185-
else:
186-
infoMsg = "no new Microsoft SQL Server versions since the "
187-
infoMsg += "last update"
188-
logger.info(infoMsg)
189-
190-
def __updateSqlmap():
19136
rootDir = paths.SQLMAP_ROOT_PATH
19237

19338
infoMsg = "updating sqlmap to latest development version from the "
@@ -240,10 +85,3 @@ def notify(event_dict):
24085
revision = re.search("revision\s+([\d]+)", svnStdout, re.I)
24186
if revision:
24287
logger.info('updated to the latest revision %s' % revision.group(1))
243-
244-
def update():
245-
if not conf.updateAll:
246-
return
247-
248-
__updateSqlmap()
249-
__updateMSSQLXML()

0 commit comments

Comments
 (0)