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

MySQL Injection - Usa la query SELECT per AGGIORNARE/CANCELLARE

Prima di rispondere direttamente alla domanda, vale la pena notare che anche se tutto ciò che un attaccante può fare è leggere dati di cui non dovrebbe essere in grado, solitamente ancora davvero male. Consideralo usando JOIN se SELECT ing da tabelle di sistema (come mysql.innodb_table_stats ), un utente malintenzionato che inizia con un SELECT injection e nessuna altra conoscenza del tuo database può mappare il tuo schema e quindi esfiltrare la totalità dei dati che hai in MySQL. Per la stragrande maggioranza dei database e delle applicazioni, questo già rappresenta una falla di sicurezza catastrofica.

Ma per rispondere direttamente alla domanda:ci sono alcuni modi che conosco per mezzo dell'iniezione in un MySQL SELECT può essere utilizzato per modificare i dati. Fortunatamente, richiedono tutti ragionevolmente circostanze insolite siano possibili. Tutte le iniezioni di esempio di seguito sono fornite in relazione alla query iniettabile di esempio dalla domanda:

SELECT id, name, message FROM messages WHERE id = $_GET['q']

1. Query "in pila" o "in batch".

La classica tecnica di iniezione di inserire un'intera altra affermazione dopo quella in cui è stata iniettata. Come suggerito in un'altra risposta qui , puoi impostare $_GET['q'] a 1; DELETE FROM users; -- in modo che la query formi due istruzioni che vengono eseguite consecutivamente, la seconda delle quali elimina tutto in users tabella.

In mitigazione

La maggior parte dei connettori MySQL, in particolare incluso mysql_* di PHP (obsoleto). e (non deprecato) mysqli_* funzioni:non supportano affatto le query in pila o in batch, quindi questo tipo di attacco semplicemente non funziona. Tuttavia, alcuni lo fanno - in particolare includendo il connettore PDO di PHP (sebbene il supporto può essere disabilitato per aumentare la sicurezza ).

2. Sfruttare le funzioni definite dall'utente

Le funzioni possono essere chiamate da un SELECT e può alterare i dati. Se nel database è stata creata una funzione di alterazione dei dati, è possibile eseguire il SELECT chiamalo, ad esempio passando 0 OR SOME_FUNCTION_NAME() come valore di $_GET['q'] .

In mitigazione

La maggior parte dei database non contiene alcuna funzione definita dall'utente, per non parlare di quelle che alterano i dati, e quindi non offre alcuna possibilità di eseguire questo tipo di exploit.

3. Scrittura su file

Come descritto nel documento di Muhaimin Dzulfakar (dal nome alquanto presuntuoso) Sfruttamento avanzato di MySQL , puoi usare INTO OUTFILE o INTO DUMPFILE clausole su una selezione MySQL per scaricare il risultato in un file. Poiché, utilizzando un UNION , qualsiasi risultato arbitrario può essere SELECT ed, questo consente di scrivere nuovi file con contenuto arbitrario in qualsiasi posizione in cui l'utente esegue mysqld può accedere. È plausibile che questo possa essere sfruttato non solo per modificare i dati nel database MySQL, ma per ottenere l'accesso della shell al server su cui è in esecuzione, ad esempio scrivendo uno script PHP sulla webroot e quindi facendogli una richiesta, se il Il server MySQL è co-ospitato con un server PHP.

In mitigazione

Molti fattori riducono lo sfruttamento pratico di questo attacco dal suono altrimenti impressionante:

  • MySQL mai ti consente di utilizzare INTO OUTFILE o INTO DUMPFILE per sovrascrivere un file esistente, né scrivere in una cartella che non esiste. Questo impedisce attacchi come la creazione di un .ssh cartella con una chiave privata in mysql directory home dell'utente e quindi SSHing o sovrascrivendo mysqld binario stesso con una versione dannosa e in attesa del riavvio del server.
  • Qualsiasi pacchetto di installazione decente imposterà un utente speciale (di solito chiamato mysql ) per eseguire mysqld e concedi a quell'utente solo autorizzazioni molto limitate. In quanto tale, non dovrebbe essere in grado di scrivere nella maggior parte delle posizioni del file system e di solito non dovrebbe essere in grado di eseguire operazioni come scrivere sulla webroot di un'applicazione web.
  • Le moderne installazioni di MySQL vengono fornite con --secure-file-priv impostato per impostazione predefinita, impedendo a MySQL di scrivere in un luogo diverso da una directory di importazione/esportazione di dati designata e quindi rendendo questo attacco quasi completamente impotente... a meno che il proprietario del server non lo abbia disabilitato deliberatamente. Fortunatamente, nessuno disabiliterebbe mai completamente una funzione di sicurezza del genere poiché sarebbe ovviamente - oh aspetta non importa .

4. Chiamando il sys_exec() funzione da lib_mysqludf_sys per eseguire comandi shell arbitrari

C'è un'estensione MySQL chiamata lib_mysqludf_sys che - a giudicare dalle sue stelle su GitHub e una rapida ricerca Stack Overflow - ha almeno qualche centinaio di utenti. Aggiunge una funzione chiamata sys_exec che esegue i comandi della shell. Come indicato in #2, le funzioni possono essere chiamate da un SELECT; si spera che le implicazioni siano ovvie. Per citare da la fonte , questa funzione "può essere un pericolo per la sicurezza" .

In mitigazione

Nella maggior parte dei sistemi non è installata questa estensione.