1. Troncare il contenuto della query
Nel caso in cui desideri ignorare gli script nella query. Ad esempio, per l'elaborazione seguente, la query richiede la condizione active=1 ma possiamo commentare (--, -- -, -+, #, /*, /**/, // , ;%00…) e ignoralo. Durante l'estrazione, spesso non sappiamo cosa fa il contenuto rimanente della query, quindi l'utilizzo dei commenti in questo caso è molto efficace.
Dopo aver commentato, la nostra query diventa:
2. Ignora il filtraggio delle parole chiave
UN. Commenti in linea
I commenti in linea vengono utilizzati in modo molto efficace per aggirare il filtro degli spazi bianchi. È possibile utilizzare i seguenti caratteri per ignorare il filtro degli spazi bianchi: /**/, %20, %09, %0a, %0b, %0c, %0d, %a0). Per esempio:
Oppure ignora il filtraggio delle parole chiave (disponibile con MySql). Nell'esempio seguente, le parole chiave union e password sono nella lista nera, quindi sono state bloccate. Possiamo aggirarlo:
B. Sostituisci le parole chiave
Quando sfruttiamo l'SQL injection, utilizziamo spesso parole chiave come: union, select, information_schema... In molti casi, i programmatori semplicemente sostituiscono quelle parole chiave:
Possiamo facilmente vedere che manca il codice di elaborazione di cui sopra. Se si tratta semplicemente di una corrispondenza di pattern, il bypass è estremamente semplice. Applichiamo la distinzione tra maiuscole e minuscole, dove le lettere maiuscole e minuscole vengono interpretate in modo diverso.
Ora invece di usare la parola chiave:
select, union…
Noi useremo:
SeLEcT, UniOn…
La base di questo bypass è che i sistemi di gestione dei database non distinguono tra case e parole chiave case.
In alcuni casi, l'applicazione web filtrerà tutte o parte di alcune parole chiave (unione, selezione...). Aggireremo come segue:
id=1+uniunionon+SeLselectecT+1,2,3-- -
Dopo che l'unione e la selezione sono state filtrate dall'applicazione web, ci verrà lasciata la query corretta come segue:
id=1+union+SeLecT+1,2,3-- -
C. Codifica dei caratteri
Possiamo bypassare il blocco WAF (Web Application Firewall) delle parole chiave codificandole. Molte applicazioni WAF decodificheranno la query solo una volta e filtreranno le parole chiave nella lista nera, quindi codificheremo la richiesta due volte in modo che in questo caso possa essere ignorata.
3. Bypass blocca le virgolette singole e doppie
- Diamo un'occhiata a un esempio prima di conoscere nello specifico questo bypass.
In questo scenario, nel database è presente una tabella denominata Users. Il compito successivo è conoscere il nome della colonna nella tabella per ottenere le sue informazioni. Come nella query precedente, utilizziamo la condizione: table_name='users'. Ma se sia le virgolette singole (') che le virgolette doppie (") sono bloccate da WAF, non possiamo più utilizzare 'utenti' o "utenti". Quindi, come risolvere questo problema? Il sistema di database integrato ci fornisce una funzione che risolve molto bene questo problema, che è la funzione CHAR() (per Oracle è CHR()). Ad esempio, nella query precedente la ignoreremo:
I programmatori PHP hanno molta familiarità con la funzione addlashes(). La funzione addlashes() ha l'effetto di aggiungere prima di caratteri speciali come virgolette singole ('), virgolette doppie ("), barra rovesciata (\), carattere NUL (byte nullo) "\" per aiutare il sistema di gestione del database. Esiste nessuna difficoltà e confusione durante la gestione di stringhe contenenti questi caratteri? Pertanto, quando vogliamo inserire nella query secondo lo script: name='someName' o '1'='1'-- I risultati non sono più quelli che ci aspettavamo.
Tuttavia, esiste una tecnica per ignorare la funzione addlashes() per inserire caratteri di virgolette singole ('). Questa tecnica è pubblica da molto tempo e l'implementazione di questa tecnica è piuttosto difficile perché è legata allo stile di codifica applicato al sito web.
4. Ignorare l'errore "mix illegale di regole di confronto per l'operazione UNION"
In alcuni sistemi gestionali (comunemente presenti in MySql), quando database e tabelle sono stati impostati in collation, quando si utilizza la parola chiave UNION, verrà segnalato l'errore "illegal mix of collation for operazione UNION". L'impostazione delle regole di confronto può essere dovuta all'intenzione del progettista del database o all'impostazione predefinita di MySql. In caso di utilizzo dell'unione, dobbiamo garantire che la condizione di selezione del valore in ciascun campo debba avere il tipo di codice corrispondente definito. A mio parere, questo errore è abbastanza comune, soprattutto per i CMS che eseguono Apache MySql. Le persone possono saperne di più su: http://bugs.mysql.com/bug.php?id=57926.
In questo caso possiamo utilizzare metodi per convertire nel tipo di codifica appropriato.
Ad esempio nel seguente caso:
Nella query precedente, se la colonna1 ha le regole di confronto impostate su Unicode-UTF8 o _latin1, ad esempio, ciò che viene selezionato da colonna2 dovrà essere convertito nel codice corrispondente. Possiamo forzare lo stile come segue:
Vediamo uno svantaggio in questo metodo di bypass: dobbiamo sapere che il codice raccolto è _latin1. Un modo migliore per aggirarlo, secondo me, è utilizzare le funzioni di codifica e decodifica esadecimale e non esadecimale.
Esistono molte altre funzioni che possono essere utilizzate al posto di hex e unhex.