Possibilità di iniezione SQL sul nome della tabella che filtra i backtick?

7

Sto rivedendo un'applicazione che ha qualcosa del genere:

table_name = table_name.replace(''', '')
c.execute('SELECT * FROM '' + table_name + ''')

Questo è effettivamente sfruttabile se l'attaccante controlla il campo table_name? Il linguaggio è python e il database è sqlite fwiw

    
posta bwbrowning 25.04.2013 - 01:21
fonte

2 risposte

4

Ci sono alcune cose che un utente malintenzionato potrebbe fare con quel codice che potresti non volere.

  • Se il loro input è SQLITE_MASTER , potrebbero recuperare i metadati.
  • Se il loro input è databasename.tablename , possono recuperare i dati da un altro database.
  • Se il loro input è (select load_extension(...) from tablename) potrebbero essere in grado di caricare un'estensione.

Oppure potevano eseguire qualsiasi query di selezione voluta avvolgendoli tra parentesi.

    
risposta data 26.04.2013 - 06:17
fonte
0

A volte è necessario concatenare stringhe per creare istruzioni SQL. Ovviamente devi essere molto attento in tali circostanze. I nomi delle tabelle variabili sono una di queste situazioni.

Probabilmente in questo caso dovresti usare un built-in come quoteIdentifier per assicurarti di far fronte a tutte le circostanze necessarie.

Inoltre aggiungerei una restrizione sui caratteri consentiti:

 if(table_name.match(".*[^a-zA-Z_].*")) throw_big_error();

Sì, ciò limita i nomi delle tabelle oltre ciò che supporta il RDBMS sottostante.

Hai bisogno di supportare i nomi delle tabelle con spazi al loro interno? O è accettabile proibire caratteri speciali nei nomi delle tabelle? Se puoi, fallo.

"Fallo giusto, invece di chiedere se sbagliare è sicuro".

Poiché stai esaminando il codice, questo è il commento al codificatore.

    
risposta data 25.04.2013 - 10:56
fonte

Leggi altre domande sui tag