3131
3232from lib .core .common import checkFile
3333from lib .core .common import sanitizeStr
34+ from lib .core .data import kb
35+ from lib .core .data import paths
3436
3537
36- class bannerHandler (ContentHandler ):
38+ class BannerHandler (ContentHandler ):
3739 """
3840 This class defines methods to parse and extract information from
3941 the given DBMS banner based upon the data in XML file
4042 """
4143
44+ def __init__ (self , banner ):
45+ self .__banner = sanitizeStr (banner )
46+
47+ self .__regexp = None
48+ self .__match = None
49+ self .__position = None
50+
51+ self .info = {}
52+
53+
54+ def startElement (self , name , attrs ):
55+ if name == "regexp" :
56+ self .__regexp = sanitizeStr (attrs .get ("value" ))
57+ self .__match = re .search (self .__regexp , self .__banner , re .I | re .M )
58+
59+ if name == "info" and self .__match :
60+ self .__position = sanitizeStr (attrs .get ("version" ))
61+ self .__sp = sanitizeStr (attrs .get ("sp" ))
62+
63+ self .info ['type' ] = sanitizeStr (attrs .get ("type" ))
64+ self .info ['distrib' ] = sanitizeStr (attrs .get ("distrib" ))
65+ self .info ['release' ] = sanitizeStr (attrs .get ("release" ))
66+ self .info ['codename' ] = sanitizeStr (attrs .get ("codename" ))
67+
68+ if self .__position .isdigit ():
69+ self .info ['version' ] = self .__match .group (int (self .__position ))
70+
71+ if self .__sp .isdigit ():
72+ self .info ['sp' ] = "Service Pack %s" % self .__match .group (int (self .__sp ))
73+
74+ self .__match = None
75+ self .__position = None
76+
77+
78+ class MSSQLBannerHandler (ContentHandler ):
79+ """
80+ This class defines methods to parse and extract information from the
81+ given Microsoft SQL Server banner based upon the data in XML file
82+ """
83+
4284 def __init__ (self , banner ):
4385 self .__banner = sanitizeStr (banner )
44- self .release = None
45- self .version = None
46- self .servicePack = None
86+
4787 self .__inVersion = False
4888 self .__inServicePack = False
4989 self .__release = None
5090 self .__version = ""
5191 self .__servicePack = ""
5292
93+ self .info = {}
94+
5395
5496 def startElement (self , name , attrs ):
5597 if name == "signatures" :
@@ -72,9 +114,9 @@ def characters(self, data):
72114 def endElement (self , name ):
73115 if name == "signature" :
74116 if re .search (" %s[\.\ ]+" % self .__version , self .__banner ):
75- self .release = self .__release
76- self .version = self .__version
77- self .servicePack = self .__servicePack
117+ self .info [ 'dbmsRelease' ] = self .__release
118+ self .info [ 'dbmsVersion' ] = self .__version
119+ self .info [ 'dbmsServicePack' ] = self .__servicePack
78120
79121 self .__version = ""
80122 self .__servicePack = ""
@@ -89,16 +131,47 @@ def endElement(self, name):
89131 self .__servicePack = self .__servicePack .replace (" " , "" )
90132
91133
92-
93- def bannerParser (banner , xmlfile ):
134+ def bannerParser (banner ):
94135 """
95136 This function calls a class to extract information from the given
96137 DBMS banner based upon the data in XML file
97138 """
98139
99- checkFile (xmlfile )
100140 banner = sanitizeStr (banner )
101- handler = bannerHandler (banner )
102- parse (xmlfile , handler )
141+ info = {}
142+
143+ if kb .dbms == "Microsoft SQL Server" :
144+ xmlfile = paths .MSSQL_XML
145+ elif kb .dbms == "MySQL" :
146+ xmlfile = paths .MYSQL_XML
147+ elif kb .dbms == "Oracle" :
148+ xmlfile = paths .ORACLE_XML
149+ elif kb .dbms == "PostgreSQL" :
150+ xmlfile = paths .PGSQL_XML
151+
152+ checkFile (xmlfile )
153+
154+ if kb .dbms == "Microsoft SQL Server" :
155+ handler = MSSQLBannerHandler (banner )
156+ parse (xmlfile , handler )
157+ info = handler .info
158+
159+ handler = BannerHandler (banner )
160+ parse (paths .GENERIC_XML , handler )
161+
162+ for title , value in handler .info .items ():
163+ info [title ] = value
164+ else :
165+ handler = BannerHandler (banner )
166+ parse (xmlfile , handler )
167+ info = handler .info
168+
169+ if "type" not in info or info ["type" ] == "None" :
170+ parse (paths .GENERIC_XML , handler )
171+ info ["type" ] = handler .info ["type" ]
172+
173+ if "distrib" not in info or info ["distrib" ] == "None" :
174+ parse (paths .GENERIC_XML , handler )
175+ info ["distrib" ] = handler .info ["distrib" ]
103176
104- return handler . release , handler . version , handler . servicePack
177+ return info
0 commit comments