SQLMap: come testare i nomi dei campi generati da JavaScript?

3

Ho una pagina HTML piuttosto semplice che invia un username e password al server tramite il metodo 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>

Il mio obiettivo è eseguire un test automatizzato che SQLMap fornisca contro sqli.php . Immagino, per quanto semplice possa essere. Tuttavia , c'è anche un pezzo JavaScript sul lato client che aggiunge una stringa pseudo-casuale ai campi username e password dopo aver fatto clic sul pulsante "Invia", che trasforma i nomi dei campi in smth . come usernamePgZd4H e password3vOklA , apparentemente diverso ogni volta. Il codice JS è stato compreso in modo tale da poter prevedere il nome corretto dei campi al momento dell'invio.

Inutile dire che SQLMap fallisce qui e seleziona solo i nomi dei campi che sono attualmente all'interno del codice HTML (cioè username=&password= quando si passa l'opzione --forms a sqlmap.py ). Ho intrapreso una buona vecchia tecnica di Manual Staring e ho scoperto che c'è un'opzione --eval per SQLMap che potrebbe aiutarmi: potrei generare un nome utente corretto ma il suo valore è ciò che voglio testare e non specificarmi come nell'esempio fornito dal manuale:

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

C'è un modo in cui posso sfruttare i poteri di SQLMap qui (o forse anche un altro strumento in combinazione con esso)?

P.S .: Ecco un esempio di script PHP che, si spera, illustra il problema un po 'meglio delle parole. Si può vedere che il server confronta gli hash SHA1 del timestamp UNIX negli ultimi 3 secondi e qualsiasi cosa provenga dal lato client. Quasi mai una dura barriera per un determinato attaccante, ma sembra che impedisca i tentativi automatici. Il codice JavaScript nella parte inferiore del file cambia i nomi dei campi al momento dell'invio del modulo.

P.P.S .: Il mio altro pensiero era che avrei potuto scrivere uno script BASH e inserire il nome utente e la password "corretti" risultanti in SQLMap, ma poi di nuovo, sarebbe vero solo per il primo requst (?)

    
posta JSmyth 18.08.2013 - 11:01
fonte

1 risposta

2

Il modo migliore per gestire questo è scrivere uno script di manomissione sqlmap personalizzato.

Puoi trovare esempi nella cartella tamper . Nello script dovrai fare una richiesta a qualunque pagina stia generando il parametro del form casuale (o accodandolo al valore di un parametro); o se puoi davvero prevederlo ogni volta, basta che lo script di manomissione lo generi da solo.

Quindi il tuo script sarebbe simile a questo (se sto capendo correttamente il problema):

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

Se poi chiami sqlmap con --tamper yourtampername , lo script verrà eseguito prima di ogni richiesta. Sarà un po 'hacky, ma il tuo tamper può anche introdurre nuovi parametri nella richiesta.

Ora, se vuoi anche testare quei valori generati dinamicamente per l'iniezione, le cose potrebbero essere un po 'complicate. Gioca con esso e vedi se riesci a farlo fare quello che vuoi.

    
risposta data 19.08.2013 - 21:36
fonte

Leggi altre domande sui tag