Iniezione SQL cieca: puoi eseguire una stringa esadecimale come parte della query?

1

Mi spiace in anticipo se questa è una domanda noobish, ma non riesco a trovare il giusto fraseggio per ottenere la risposta su google o qui - Sono abbastanza nuovo per SQL e sto lavorando su una sfida SQLi che è un'iniezione cieca. La pagina non restituisce alcuna informazione a meno che tu non esegua correttamente una query o utilizzi le virgolette in un modello che non sono stato in grado di identificare, nel qual caso dice "non puoi farlo". È silenzioso se si causa qualsiasi tipo di errore con il proprio input. Di conseguenza non sono stato in grado di capire quale sia il backend, quale varietà di SQL viene utilizzata, quale sia il nome del database o quali siano i nomi delle tabelle.

L'istruzione in esecuzione deve essere qualcosa come " SELECT * FROM table WHERE title=' ". Il sito mi consentirà di scaricare tutte le voci della tabella da cui viene eseguita la query iniettando something' OR '1' = '1 . So che c'è un'altra tabella nel database contenente informazioni che ho bisogno di ottenere (una bandiera), ma se provo qualcosa come something' UNION SELECT * FROM users WHERE '1' = '1 , restituisce "non puoi farlo". Anche dopo molti scherzi, non sono stato in grado di capire quali criteri filtra le virgolette - la dichiarazione UNION che ho provato ha la stessa quantità di caratteri di citazione dell'istruzione OR '1' = '1 che FA eseguire e aggiungere virgolette superflui che non cambiano il significato della query (aggiungendo virgolette aperte e chiuse casuali, inserendo una virgoletta singola in un commento nel mezzo della query) a volte si attiva "non è possibile farlo" e qualche volta no. Non sono stato in grado di identificare uno schema.

La mia domanda è questa: c'è un modo per indurmi a pensare che sto usando il giusto numero / modello di virgolette, come un pattern che già conosco, ma includo anche un'istruzione UNION codificata in esadecimale che verrebbe eseguito come parte della query? Ho provato cose come something' OR '1' = '1 CONVERT(varbinary(max), <hex code for ' UNION SELECT * FROM users WHERE '1' = '1>) ma non ho ottenuto alcun risultato. Dal momento che l'iniezione è cieca, non posso dire se sto facendo qualcosa che è un errore di sintassi (l'istruzione CONVERT trasforma effettivamente il codice esadecimale in ASCII che sarebbe poi eseguito come parte della query?) O se la mia logica è disattivata. Se qualcuno potrebbe farmi sapere se ciò che sto facendo ha senso e / o indicarmi la giusta direzione che sarebbe molto apprezzato.

Grazie!

    
posta noodlesandnoodles 06.12.2015 - 01:05
fonte

2 risposte

2

Affinché un UNION abbia esito positivo, entrambi SELECT s devono selezionare lo stesso numero (e possibilmente i tipi di dati compatibili) di colonne.

Quindi il primo compito sarebbe identificare il numero di colonne nel SELECT iniziale. Puoi farlo con la clausola ORDER BY specificando la posizione numerica della colonna da ordinare per:

' ORDER BY 1,'

Questo finirebbe la query come segue:

SELECT * FROM table WHERE title='' ORDER BY 1,''

Una posizione di colonna non esistente comporterebbe un errore. Quindi basta incrementare il numero fino a ottenere un errore (o una falsa risposta).

Quindi puoi costruire il tuo secondo SELECT con quel numero esatto di colonne e UNION con il primo. A seconda del DBMS e dei tipi di colonna, potresti dover armeggiare un po 'con i tipi di colonna del secondo SELECT per trovare i tipi compatibili.

    
risposta data 06.12.2015 - 08:47
fonte
0

Il motivo per cui l'app è vulnerabile è semplice. Supponi che l'app vulnerabile appaia così:

SELECT * FROM items WHERE itemid = '$id'

Quando viene eseguita questa query, la vulnerabilità ti consente di modificarlo in modo simile a questo:

SELECT * FROM items WHERE itemid = 'something' OR '1' = '1'

Si spera che tu possa vedere in che modo è stata modificata la query SQL per restituire tutte le voci dalla tabella degli articoli.

Per approfittare di questo per eseguire una query completamente nuova, dovresti fare qualcosa di simile:

SELECT * FROM items WHERE itemid = ''; SELECT * FROM users WHERE '1' = '1'

Questo ti indica almeno la direzione giusta?

    
risposta data 06.12.2015 - 01:48
fonte

Leggi altre domande sui tag