Iniezione SQL con operatore LIKE?

-1

Sono uno studente in sicurezza informatica e sto cercando di eseguire un SQLi sulla seguente richiesta:

SELECT * FROM Books WHERE 1 AND (LOWER(title) LIKE '%aaa%' 
OR LOWER(blurb) LIKE '%aaa%' OR LOWER(content) LIKE '%aaa%') AND 
(publish_date IS NULL OR publish_date <= '2016-08-22') ORDER BY date DESC LIMIT -5,5

Quindi, aaa è dove avviene l'iniezione. Ho provato ') UNION SELECT * FROM Books# ma, il server mi ha appena restituito questa iniezione come un "risultato di ricerca", quindi non funziona.

Per abbinare meglio la richiesta, farei %'; REQUEST THAT I WANT; '% .

O anche meglio: %'; REQUEST THAT I WANT;SELECT * FROM Books WHERE LOWER(title) LIKE '% .

Ma per l'ultima volta, ho ricevuto una risposta "Richiesta non valida".

    
posta mric750 23.08.2016 - 11:22
fonte

1 risposta

3

Non hai specificato in che modo il codice server riempie effettivamente il filtro di ricerca. Potrebbe benissimo usare istruzioni preparate, qualcosa del genere:

query = db.prepare("SELECT * FROM Books WHERE LOWER(title) LIKE ? OR LOWER(blurb) LIKE ?")

pattern = "%" + input + "%"
query.set_parameter(1, pattern)
query.set_parameter(2, pattern)
...

result = query.exec()

In altre parole, solo perché il codice deve aggiungere % attorno al filtro, non significa che la query SQL intera venga aggiunta contemporaneamente. Invece, la "dichiarazione preparata" consente al database stesso di inserire valori aggiuntivi.

Oppure il codice potrebbe essere molto cauto nell'escludere le virgolette nell'input (come nel noto mysql_escape_string ()). Anche se è molto più facile sbagliare (per non parlare di un po 'più lento), evita comunque le iniezioni assicurandosi che una% non corretta di co_de venga mai inserita.

    
risposta data 23.08.2016 - 14:43
fonte

Leggi altre domande sui tag