SQLMap: ¿Cómo probar los nombres de campo generados por JavaScript?

3

Tengo una página HTML bastante simple que envía un método username y password al servidor a través del método POST :

<doctype html>
<head>
    <title>SQLMap dynamic parameters</title>
</head>
<body>
    <form id="sqliForm" action="sqli.php" method="POST">
        <input id="username" type="text" name="username">
        <input id="password" type="password" name="password">

        <input type="submit" value="Submit">
    </form>
</body>
</html>

Mi objetivo es realizar una prueba automatizada que SQLMap proporciona contra el sqli.php . Supongo, tan simple como podría ser. Sin embargo , también hay una parte de JavaScript en el lado del cliente que agrega una cadena pseudoaleatoria a los campos username y password al hacer clic en el botón "Enviar", que convierte los nombres de los campos en smth . como usernamePgZd4H y password3vOklA , aparentemente diferentes cada vez. Sin embargo, el código JS se ha comprendido para que pueda predecir el nombre correcto de los campos al enviarlo.

No hace falta decir que SQLMap falla aquí y selecciona solo los nombres de campo que actualmente están dentro del código HTML (es decir, username=&password= al pasar la opción --forms a sqlmap.py ). Me he embarcado en una vieja técnica de Manual Staring y descubrí que hay una opción --eval en SQLMap que podría haberme ayudado: podría generar un nombre de usuario correcto pero su valor es lo que quiero probar y no especificarme como En el ejemplo proporcionado por el manual:

python sqlmap.py -u "http://www.target.com/vuln.php?id=1&hash=c4ca4238a0b923820dcc509a6f75849b" --eval="import hashlib;hash=hashlib.md5(id).hexdigest()"

¿Hay alguna manera de que pueda aprovechar los poderes de SQLMap aquí (o tal vez incluso otra herramienta en combinación con él)?

P.S .: Aquí hay un ejemplo de script PHP que, con suerte, ilustra el problema un poco mejor que las palabras. Puede ver que el servidor compara los hashes SHA1 de la marca de tiempo de UNIX en los últimos 3 segundos y lo que vino del lado del cliente. Casi nunca una barrera ruda para un atacante determinado, pero parece que evita los intentos automáticos. El JavaScript en la parte inferior del archivo cambia los nombres de los campos al enviar el formulario.

P.P.S .: Mi otro pensamiento fue que podía escribir una secuencia de comandos BASH y alimentar los nombres de los campos de nombre de usuario y contraseña "correctos" resultantes a SQLMap, pero nuevamente, eso sería cierto solo para el primer requst (?)

    
pregunta JSmyth 18.08.2013 - 11:01
fuente

1 respuesta

2

La mejor manera de lidiar con esto es escribir un script de manipulación de sqlmap personalizado.

Puedes encontrar ejemplos en la carpeta tamper . En el script, querrá realizar una solicitud a cualquier página que genere el parámetro de formulario aleatorio (o que se agregue al valor de un parámetro); o si realmente puedes predecirlo cada vez, simplemente haz que el script de manipulación lo genere por sí mismo.

Entonces, su secuencia de comandos tendría un aspecto similar a este (si estoy entendiendo el problema correctamente):

def tamper(payload, **kwargs):
    username = get_username()
    password = get_password()
    return payload + "&%s=user1&%s=password" % (username, password)

Si luego llama a sqlmap con --tamper yourtampername , ejecutará ese script antes de cada solicitud. Será un poco difícil, pero su manipulación también puede introducir nuevos parámetros en la solicitud.

Ahora, si también quiere probar esos valores generados dinámicamente para inyección, las cosas pueden ponerse un poco difíciles. Sin embargo, juegue un poco con él y vea si puede lograr que haga lo que quiera.

    
respondido por el Anorov 19.08.2013 - 21:36
fuente

Lea otras preguntas en las etiquetas