L'iniezione SQL può portare all'esecuzione di codice in modalità remota?

19

È possibile eseguire del codice (ad esempio codice PHP su un'applicazione Web basata su PHP) sul server tramite SQL injection? Se sì, come esattamente?

Comprendo che il campo senza escape può portare a SQL injection e un utente malintenzionato può eseguire comandi SQL di sua scelta direttamente sul server. Ma penso di eseguire solo comandi SQL, non un codice arbitrario. Ho sbagliato qui?

    
posta pavanw3b 29.12.2014 - 17:12
fonte

6 risposte

30

I sistemi di database SQL in genere hanno un meccanismo di esportazione che può scrivere file arbitrari sul server, e. g. SELECT ... INTO OUTFILE in MySQL. Se un utente malintenzionato è in grado di assemblare una query di questo tipo e non viene fermato da autorizzazioni restrittive, può infatti creare script PHP. Ora hanno ancora bisogno di ottenere il server per eseguire lo script. Nel caso più semplice, hanno accesso in scrittura a una directory web. Se richiedono lo script, il web server lo eseguirà felicemente.

    
risposta data 29.12.2014 - 17:58
fonte
17

Dipende dal tipo di database (MySQL, Postgres, Oracle, ecc.) e dai privilegi dell'utente del database.

Se l'applicazione si connette al database utilizzando un account amministratore, l'esecuzione del codice è generalmente possibile. È semplice su SQL Server, usando xp_cmdshell. Altri database richiedono tecniche più coinvolte. SQLmap , il più popolare strumento di exploit SQL, menziona questo:

Support to execute arbitrary commands and retrieve their standard output 
on the database server underlying operating system when the database software 
is MySQL, PostgreSQL or Microsoft SQL Server.

Almeno per MySQL, penso che usi il trucco di scrivere in un file PHP menzionato da Fleche.

Dal punto di vista della difesa, questo è il motivo per cui non dovresti mai connettere l'applicazione come amministratore.

    
risposta data 29.12.2014 - 20:12
fonte
4

Oltre alle cose già menzionate, alcuni database si basano sul codice: ad esempio, la maggior parte della Oracle stessa è scritta in oracle, cioè PL / SQL, in esecuzione all'interno del server di database. Se si ottiene un'iniezione SQL, si può benissimo fare cose per alterare lo stato del sistema, a volte oltre ciò che l'account utente del database consente, specialmente se si ha la possibilità di combinarlo con un'escalation di privilegi locali.

Oracle, almeno, consente anche di eseguire il codice Java ™ nel server database per impostazione predefinita. E forse un altro paio di cose ...

Anche PostgreSQL è estensibile. Puoi eseguire cose come gli script Perl, non solo PL / pgSQL ...

    
risposta data 30.12.2014 - 18:43
fonte
4

Molte applicazioni non banali memorizzano oggetti nel database. Un utente malintenzionato con accesso db (come ottenuto da un'iniezione SQL) può modificarli in modo tale che quando sono non serializzati , eseguono il codice previsto.

Questo dipende dall'applicazione php per avere una classe con un __wakeup () che può essere abusato, ma l'autore del webapp non ne è completamente responsabile, poiché potrebbero esserci anche classi di terze parti installate sul server che potrebbero essere oggetto di abuso.

(Vale anche la pena notare il problema di SELECT INTO OUTFILE sottolineato da Fleche, sebbene * nix i server mysql siano di solito installati con il proprio utente, e questo attacco non è possibile)

    
risposta data 30.12.2014 - 22:08
fonte
1

Un altro possibile vettore di attacco sarebbe se in qualsiasi momento i contenuti del database venissero eseguiti come codice.

Un esempio di pseudocodice in PHP:

$dbstring = some_db_query('SELECT some_code from some_table ...');
eval( $dbstring );

Fortunatamente, una cosa del genere non sarebbe comune, ma se gli utenti fidati avessero il permesso di aggiungere codice a un database, SQL injection potrebbe sovrascriverlo con codice dannoso.

Credo che CMS Drupal abbia una funzione simile per i contenuti creati dagli utenti fidati (a meno che non li abbiano rimossi).

    
risposta data 30.12.2014 - 23:39
fonte
1

Ciò che la tua descrizione sarebbe molto possibile se il sito web sta eseguendo un codice PHP che è memorizzato nel database ed eseguito con eval (). SQL injection verrebbe utilizzato per modificare il contenuto PHP memorizzato nella tabella in modo che venga eseguito il codice degli utenti malintenzionati invece del contenuto originale.

Un'altra possibilità è che un file remoto includa un attacco su un nome di file che viene estratto dal database.

Microsoft SQL server ha una stored procedure chiamata xp_cmdshell , che ti permetterà di eseguire arbitrariamente applicazioni da riga di comando. Questo è comunemente usato dagli hacker per caricare backdoor o modifiche alle applicazioni web tramite FTP.

    
risposta data 03.01.2015 - 20:47
fonte

Leggi altre domande sui tag