2222Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
2323"""
2424
25+ import codecs
2526import re
2627import socket
2728import time
2829
30+ from xml .dom import minidom
31+
2932from lib .core .agent import agent
3033from lib .core .common import getUnicode
3134from lib .core .common import preparePageForLineComparison
3639from lib .core .data import conf
3740from lib .core .data import kb
3841from lib .core .data import logger
42+ from lib .core .data import paths
3943from lib .core .exception import sqlmapConnectionException
4044from lib .core .exception import sqlmapNoneDataException
4145from lib .core .session import setString
@@ -55,197 +59,53 @@ def checkSqlInjection(place, parameter, value, parenthesis):
5559
5660 randInt = randomInt ()
5761 randStr = randomStr ()
62+ prefix = ""
63+ postfix = ""
5864
5965 if conf .prefix or conf .postfix :
60- prefix = ""
61- postfix = ""
62-
6366 if conf .prefix :
6467 prefix = conf .prefix
6568
6669 if conf .postfix :
6770 postfix = conf .postfix
6871
69- infoMsg = "testing custom injection "
70- infoMsg += "on %s parameter '%s'" % (place , parameter )
71- logger .info (infoMsg )
72-
73- payload = agent .payload (place , parameter , value , "%s%s%s AND %s%d=%d %s" % (value , prefix , ")" * parenthesis , "(" * parenthesis , randInt , randInt , postfix ))
74- trueResult = Request .queryPage (payload , place )
75-
76- if trueResult :
77- payload = agent .payload (place , parameter , value , "%s%s%s AND %s%d=%d %s" % (value , prefix , ")" * parenthesis , "(" * parenthesis , randInt , randInt + 1 , postfix ))
78- falseResult = Request .queryPage (payload , place )
79-
80- if not falseResult :
81- infoMsg = "confirming custom injection "
82- infoMsg += "on %s parameter '%s'" % (place , parameter )
83- logger .info (infoMsg )
84-
85- payload = agent .payload (place , parameter , value , "%s%s%s AND %s%s %s" % (value , prefix , ")" * parenthesis , "(" * parenthesis , randStr , postfix ))
86- falseResult = Request .queryPage (payload , place )
87-
88- if not falseResult :
89- infoMsg = "%s parameter '%s' is " % (place , parameter )
90- infoMsg += "custom injectable "
91- logger .info (infoMsg )
92-
93- return "custom"
94-
95- infoMsg = "testing unescaped numeric injection "
96- infoMsg += "on %s parameter '%s'" % (place , parameter )
97- logger .info (infoMsg )
98-
99- payload = agent .payload (place , parameter , value , "%s%s AND %s%d=%d" % (value , ")" * parenthesis , "(" * parenthesis , randInt , randInt ))
100- trueResult = Request .queryPage (payload , place )
101-
102- if trueResult :
103- payload = agent .payload (place , parameter , value , "%s%s AND %s%d=%d" % (value , ")" * parenthesis , "(" * parenthesis , randInt , randInt + 1 ))
104- falseResult = Request .queryPage (payload , place )
105-
106- if not falseResult :
107- infoMsg = "confirming unescaped numeric injection "
108- infoMsg += "on %s parameter '%s'" % (place , parameter )
109- logger .info (infoMsg )
110-
111- payload = agent .payload (place , parameter , value , "%s%s AND %s%s" % (value , ")" * parenthesis , "(" * parenthesis , randStr ))
112- falseResult = Request .queryPage (payload , place )
113-
114- if not falseResult :
115- infoMsg = "%s parameter '%s' is " % (place , parameter )
116- infoMsg += "unescaped numeric injectable "
117- infoMsg += "with %d parenthesis" % parenthesis
118- logger .info (infoMsg )
119-
120- return "numeric"
121-
122- infoMsg = "%s parameter '%s' is not " % (place , parameter )
123- infoMsg += "unescaped numeric injectable"
124- logger .info (infoMsg )
125-
126- infoMsg = "testing single quoted string injection "
127- infoMsg += "on %s parameter '%s'" % (place , parameter )
128- logger .info (infoMsg )
129-
130- payload = agent .payload (place , parameter , value , "%s'%s AND %s'%s'='%s" % (value , ")" * parenthesis , "(" * parenthesis , randStr , randStr ))
131- trueResult = Request .queryPage (payload , place )
132-
133- if trueResult :
134- payload = agent .payload (place , parameter , value , "%s'%s AND %s'%s'='%s" % (value , ")" * parenthesis , "(" * parenthesis , randStr , randStr + randomStr (1 )))
135- falseResult = Request .queryPage (payload , place )
136-
137- if not falseResult :
138- infoMsg = "confirming single quoted string injection "
139- infoMsg += "on %s parameter '%s'" % (place , parameter )
140- logger .info (infoMsg )
141-
142- payload = agent .payload (place , parameter , value , "%s'%s and %s%s" % (value , ")" * parenthesis , "(" * parenthesis , randStr ))
143- falseResult = Request .queryPage (payload , place )
144-
145- if not falseResult :
146- infoMsg = "%s parameter '%s' is " % (place , parameter )
147- infoMsg += "single quoted string injectable "
148- infoMsg += "with %d parenthesis" % parenthesis
149- logger .info (infoMsg )
150-
151- return "stringsingle"
152-
153- infoMsg = "%s parameter '%s' is not " % (place , parameter )
154- infoMsg += "single quoted string injectable"
155- logger .info (infoMsg )
156-
157- infoMsg = "testing LIKE single quoted string injection "
158- infoMsg += "on %s parameter '%s'" % (place , parameter )
159- logger .info (infoMsg )
160-
161- payload = agent .payload (place , parameter , value , "%s'%s AND %s'%s' LIKE '%s" % (value , ")" * parenthesis , "(" * parenthesis , randStr , randStr ))
162- trueResult = Request .queryPage (payload , place )
163-
164- if trueResult :
165- payload = agent .payload (place , parameter , value , "%s'%s AND %s'%s' LIKE '%s" % (value , ")" * parenthesis , "(" * parenthesis , randStr , randStr + randomStr (1 )))
166- falseResult = Request .queryPage (payload , place )
167-
168- if not falseResult :
169- infoMsg = "confirming LIKE single quoted string injection "
170- infoMsg += "on %s parameter '%s'" % (place , parameter )
171- logger .info (infoMsg )
172-
173- payload = agent .payload (place , parameter , value , "%s'%s and %s%s" % (value , ")" * parenthesis , "(" * parenthesis , randStr ))
174- falseResult = Request .queryPage (payload , place )
175-
176- if not falseResult :
177- infoMsg = "%s parameter '%s' is " % (place , parameter )
178- infoMsg += "LIKE single quoted string injectable "
179- infoMsg += "with %d parenthesis" % parenthesis
180- logger .info (infoMsg )
181-
182- return "likesingle"
183-
184- infoMsg = "%s parameter '%s' is not " % (place , parameter )
185- infoMsg += "LIKE single quoted string injectable"
186- logger .info (infoMsg )
187-
188- infoMsg = "testing double quoted string injection "
189- infoMsg += "on %s parameter '%s'" % (place , parameter )
190- logger .info (infoMsg )
191-
192- payload = agent .payload (place , parameter , value , "%s\" %s AND %s\" %s\" =\" %s" % (value , ")" * parenthesis , "(" * parenthesis , randStr , randStr ))
193- trueResult = Request .queryPage (payload , place )
194-
195- if trueResult :
196- payload = agent .payload (place , parameter , value , "%s\" %s AND %s\" %s\" =\" %s" % (value , ")" * parenthesis , "(" * parenthesis , randStr , randStr + randomStr (1 )))
197- falseResult = Request .queryPage (payload , place )
198-
199- if not falseResult :
200- infoMsg = "confirming double quoted string injection "
201- infoMsg += "on %s parameter '%s'" % (place , parameter )
202- logger .info (infoMsg )
203-
204- payload = agent .payload (place , parameter , value , "%s\" %s AND %s%s" % (value , ")" * parenthesis , "(" * parenthesis , randStr ))
205- falseResult = Request .queryPage (payload , place )
206-
207- if not falseResult :
208- infoMsg = "%s parameter '%s' is " % (place , parameter )
209- infoMsg += "double quoted string injectable "
210- infoMsg += "with %d parenthesis" % parenthesis
211- logger .info (infoMsg )
72+ f = codecs .open (paths .INJECTIONS_XML , 'r' , conf .dataEncoding )
73+ injections = minidom .parse (f ).documentElement
74+ f .close ()
21275
213- return "stringdouble"
76+ for case in injections .getElementsByTagName ("case" ):
77+ tag = case .getAttribute ("tag" )
78+ desc = case .getAttribute ("desc" )
21479
215- infoMsg = "%s parameter '%s' is not " % ( place , parameter )
216- infoMsg += "double quoted string injectable"
217- logger .info (infoMsg )
80+ infoMsg = "testing %s injection " % desc
81+ infoMsg += "on %s parameter '%s'" % ( place , parameter )
82+ logger .info (infoMsg )
21883
219- infoMsg = "testing LIKE double quoted string injection "
220- infoMsg += "on %s parameter '%s'" % (place , parameter )
221- logger .info (infoMsg )
84+ positive = case .getElementsByTagName ("positive" )[0 ]
85+ negative = case .getElementsByTagName ("negative" )[0 ]
22286
223- payload = agent .payload (place , parameter , value , "%s\" %s AND %s\" %s\" LIKE \" %s" % (value , ")" * parenthesis , "(" * parenthesis , randStr , randStr ))
224- trueResult = Request .queryPage (payload , place )
87+ params = positive .getAttribute ("params" )
88+ format = positive .getAttribute ("format" )
89+
90+ if not prefix and not postfix and tag == "custom" :
91+ continue
92+
93+ payload = agent .payload (place , parameter , value , format % eval (params ))
22594
226- if trueResult :
227- payload = agent .payload (place , parameter , value , "%s\" %s AND %s\" %s\" LIKE \" %s" % (value , ")" * parenthesis , "(" * parenthesis , randStr , randStr + randomStr (1 )))
228- falseResult = Request .queryPage (payload , place )
95+ trueResult = Request .queryPage (payload , place )
22996
230- if not falseResult :
231- infoMsg = "confirming LIKE double quoted string injection "
232- infoMsg += "on %s parameter '%s'" % ( place , parameter )
233- logger . info ( infoMsg )
97+ if trueResult :
98+ params = negative . getAttribute ( "params" )
99+ format = negative . getAttribute ( "format" )
100+ payload = agent . payload ( place , parameter , value , format % eval ( params ) )
234101
235- payload = agent .payload (place , parameter , value , "%s\" %s and %s%s" % (value , ")" * parenthesis , "(" * parenthesis , randStr ))
236102 falseResult = Request .queryPage (payload , place )
237103
238104 if not falseResult :
239- infoMsg = "%s parameter '%s' is " % (place , parameter )
240- infoMsg += "LIKE double quoted string injectable "
105+ infoMsg = "%s parameter '%s' is %s injectable " % (place , parameter , desc )
241106 infoMsg += "with %d parenthesis" % parenthesis
242107 logger .info (infoMsg )
243-
244- return "likedouble"
245-
246- infoMsg = "%s parameter '%s' is not " % (place , parameter )
247- infoMsg += "LIKE double quoted string injectable"
248- logger .info (infoMsg )
108+ return tag
249109
250110 return None
251111
@@ -291,10 +151,12 @@ def checkDynamicContent(*pages):
291151 for i in xrange (len (pages )):
292152 firstPage = pages [i ]
293153 linesFirst = preparePageForLineComparison (firstPage )
294- pageLinesNumber = len (linesFirst )
154+ pageLinesNumber = len (linesFirst )
155+
295156 for j in xrange (i + 1 , len (pages )):
296157 secondPage = pages [j ]
297158 linesSecond = preparePageForLineComparison (secondPage )
159+
298160 if pageLinesNumber == len (linesSecond ):
299161 for k in xrange (0 , pageLinesNumber ):
300162 if (linesFirst [k ] != linesSecond [k ]):
@@ -303,6 +165,7 @@ def checkDynamicContent(*pages):
303165 linesFirst [k + 1 ] if k < pageLinesNumber - 1 else None )
304166
305167 found = None
168+
306169 for other in kb .dynamicContent :
307170 found = True
308171 if other .pageTotal == item .pageTotal :
@@ -311,18 +174,22 @@ def checkDynamicContent(*pages):
311174 other .lineNumber = [other .lineNumber , item .lineNumber ]
312175 other .lineContentAfter = item .lineContentAfter
313176 break
177+
314178 elif other .lineNumber == item .lineNumber + 1 :
315179 other .lineNumber = [item .lineNumber , other .lineNumber ]
316180 other .lineContentBefore = item .lineContentBefore
317181 break
182+
318183 elif item .lineNumber - 1 == other .lineNumber [- 1 ]:
319184 other .lineNumber .append (item .lineNumber )
320185 other .lineContentAfter = item .lineContentAfter
321186 break
187+
322188 elif item .lineNumber + 1 == other .lineNumber [0 ]:
323189 other .lineNumber .insert (0 , item .lineNumber )
324190 other .lineContentBefore = item .lineContentBefore
325191 break
192+
326193 found = False
327194
328195 if not found :
0 commit comments