L'accesso in sola lettura al database impedisce l'injection sql?

48

Ho una web API che si connette al mio SQL Server usando una connessione di sola lettura e voglio consentire agli utenti esperti di tecnologia della mia API di inserire una clausola SQL where su querystring. Fondamentalmente voglio solo attaccare ciò che inseriscono nell'istruzione select.

Il privilegio minimo (selezionare l'abilità su una sola tabella), la connessione di sola lettura al database previene tutti gli attacchi di iniezione?

    
posta Aaron 26.04.2015 - 17:04
fonte

4 risposte

102

No. Potresti confondere l'iniezione SQL con l'iniezione di dati; le tabelle di sola lettura non impediscono l'iniezione SQL e al massimo fanno solo un piccolo sforzo per limitare il suo impatto.

Iniezione SQL significa semplicemente la capacità di iniettare codice SQL. Mentre le tabelle di sola lettura possono limitare la possibilità di iniettare dati nella tabella, non incidono sulla possibilità di:

  • Leggi da altri database o tabelle se non consentito
  • Leggi dalle tabelle di sistema o esegui altre query di sistema che sono difficili da disabilitare
  • Scrivi query eccessivamente complesse che eseguiranno un DoS
  • Esamina i dati utilizzando DNS
  • Accedi ai file locali (ad esempio, utl_file in Oracle)
  • Accedere alla rete del server DB (ad es. utl_http in Oracle)
  • Esegui codice arbitrario sul server tramite funzione DB buffer overflow
  • Vedi Iniezione SQL avanzata nei database Oracle per una buona passeggiata attraverso tutti i tipi di cose di cui devi preoccuparti (e realizzare che altri database hanno i loro equivalenti)

Se tu

basically just want to tack what they enter onto the select statement.

quindi autorizzi espressamente l'aggressore a provare uno di questi.

Ora puoi certamente fare cose per limitarlo. È possibile disabilitare le virgolette e i caratteri separatori delle istruzioni SQL. Puoi disabilitare qualsiasi input che non sia [A-Za-z0-9"=] (o equivalente efficace per il tuo database). Ma se inizi a seguire questo percorso, stai meglio scrivendo la tua applicazione correttamente : esponi un'interfaccia di query più ricca in cui offri le chiavi da controllare e poi esegui il corretto quoting su qualunque valore l'utente entra.

    
risposta data 26.04.2015 - 18:04
fonte
13

No, esempio banale

EXEC ('SELECT COUNT(*) 
       FROM table 
       WHERE UserName =''''' + @UserName + ''''' AND Password = '''''+@Password+'''''')

Imposta @Password su a' OR 1=1;--

E la password viene ignorata

    
risposta data 26.04.2015 - 17:56
fonte
12

Does a least-privilege (select ability on one table only), read-only connection to the database prevent all injection attacks?

L'iniezione SQL è un modo per un utente malintenzionato di modificare un'istruzione esistente in modo che provochi azioni indesiderate. Queste azioni potrebbero essere modifiche al database o all'esecuzione di codice sul sistema, ma anche semplicemente restituire dati che non dovrebbero o effettuare un Denial of Service eseguendo operazioni che richiedono risorse.

Limitare le query per selezionare solo su una tabella specifica potrebbe limitare l'impatto, ma probabilmente sarai ancora in grado di causare un Denial of Service. E a seconda di dove verranno utilizzati i risultati della query, potresti cambiare il comportamento dell'applicazione restituendo risultati imprevisti.

    
risposta data 26.04.2015 - 17:19
fonte
0

Assolutamente no. I difetti di SQL injection non sono sul server SQL ma a livello di applicazione Web, quindi se l'applicazione Web è sensibile all'iniezione SQL, rimarrà sensibile indipendentemente dal livello di accesso al database.

Tuttavia, il principio del privilegio minimo menzionato fa sì che, anche se qualcuno riesca a sfruttare un'iniezione SQL sull'applicazione Web, otterrebbe solo l'accesso in lettura sul contenuto del database, non sarà in grado di modificare il database contenuto o struttura.

    
risposta data 26.04.2015 - 17:17
fonte

Leggi altre domande sui tag