Quanto pessimo è consentito modificare un campo di database che contiene un sql da un modulo?

2

Ho una tabella in un database (Mysql) che contiene un campo che contiene stringhe sql su di esso. Intendo query complete come testo (selezionare sempre le istruzioni). Modificare una di queste query è un "dolore nel culo" perché è necessario prima connettersi a una VPN, quindi accedere al database e infine modificare il campo con alcuni software come Mysql Workbench o qualsiasi altro.

Sto sviluppando in un sito Web un pannello di controllo accessibile solo dagli amministratori del sito. In quel pannello di controllo sto pensando di creare un modulo per modificare quel campo sql. Può aiutare gli amministratori a semplificare la vita.

Di solito sono molto consapevole di fare attenzione con le iniezioni SQL in tutte le mie forme, richieste GET e POST, ecc. So che questo potrebbe essere pericoloso anche se si tratta di un pannello limitato solo per gli amministratori.

La prima domanda è : se alla fine decido di crearla e un utente amministratore cade sotto il controllo di un hacker, quanto sarebbe male per me? Esiste la possibilità di "controllare" le istruzioni SQL da memorizzare per consentire solo le istruzioni selezionate?

So che alcune tecniche di base come sostituire alcune parole riservate per nulla, come DROP per esempio, sono inutili ... gli hacker possono usare trucchi semplici come DRDROPOP che dopo la sostituzione ottiene comunque DROP e quel tipo di trucchi sporchi ... o forse possono ofuscante i sql usando Unicode, ecc ...

Seconda domanda : c'è qualche buona guida per cercare di controllare e filtrare il più possibile i "trucchi" di sql o è inutile perché SEMPRE c'è un metodo per penetrare l'avvio di altri "non-select" affermazioni?

    
posta OscarAkaElvis 11.01.2017 - 17:14
fonte

4 risposte

3

Se veramente dovessi farlo, ti suggerirei un paio di cose:

  1. Esegui le query fornite dall'utente come utente di database di sola lettura separato. La maggior parte dei DBMS dispone di un sistema di autorizzazione in cui è possibile GRANT l'autorizzazione dell'utente essere in grado di eseguire solo SELEZIONA le query ed è possibile limitare la tabella a cui tale utente può essere eseguito.

  2. Se una delle tue tabelle contiene una combinazione di dati sensibili e non sensibili (ad esempio, la tabella degli utenti contiene hash delle password), potresti voler creare una VISTA su quella tabella per nascondere i dati sensibili. VERRANNO concesso il privilegio dell'utente per questa VISTA al posto della tabella sottostante. In alternativa, è possibile concedere all'utente l'accesso alla chiamata stored procedure / funzione selezionata che li filtra senza dare il permesso alla tabella sottostante. In alcuni casi, puoi anche utilizzare il privilegio di colonna.

In questo modo, anche se l'account amministratore è compromesso, è limitato a essere letto solo sulle tabelle selezionate.

    
risposta data 12.01.2017 - 02:28
fonte
2

Sembra un'impostazione molto strana e direi che è piuttosto insicuro. In genere, se si desidera salvare query SQL da eseguire in un secondo momento, è necessario creare una stored procedure che è possibile chiamare. Memorizzare la query sql in una tabella di database sembra una cattiva idea da un rendimento, best practice e prospettiva di sicurezza.

È una configurazione così strana che non saresti in grado di applicare t ha accettato i metodi per prevenire SQL Injection attacchi e per questo sono quasi sicuro che ci sarebbe una vulnerabilità. Senza vedere esattamente come lo si implementa, è impossibile dire quale sarebbe la vulnerabilità.

Per rispondere alle tue domande:

  1. Senza vedere esattamente come si implementa questo è impossibile dirlo con certezza, ma se stai chiedendo se c'è una "possibilità" - sì, assolutamente
  2. Vorrei esaminare la guida di OWASP sull'inserimento di whitelisting se insisti per andare avanti in questo .
risposta data 11.01.2017 - 18:36
fonte
1

Ogni volta che memorizzi le query completamente scritte in una colonna del database e consenti a un accesso "admin" a queste query, esiste la possibilità che un cattivo attore possa accedervi e modificarle.

Come best practice, non dovresti memorizzare query di testo normale nel database. Forse dovresti cifrare la stringa quando la immagazzini, o, se MySQL lo supporta, attivare la crittografia a livello di tabella o colonna nel database stesso.

    
risposta data 11.01.2017 - 18:43
fonte
0

Come altri hanno già sottolineato, questa potrebbe non essere la migliore configurazione. Ma se lo fai, ho due raccomandazioni:

  • Principio del privilegio minimo: Assicurarsi che l'utente del database che esegue le domande hanno solo il privilegio di fare il minimo indispensabile. Dovrebbero essere solo le query SELECT? Beh, permetti solo loro. Ha solo bisogno di leggere da tre tabelle? Quindi concedere solo l'accesso esattamente a quei tre tavoli. Questa risposta fa un buon punto sull'uso delle viste per dare accesso solo a parti di tabelle.

  • Filtraggio / convalida delle query SQL: citi l'utilizzo di elementi come la lista nera di determinate parole per motivi di sicurezza. Mentre la lista nera è il modo sbagliato di andare qui, è possibile utilizzare la convalida, ma solo come un'aggiunta - non una sostituzione - al punto precedente. Il modo in cui lo farei è qualcosa di simile a questo:

    if(sql.trim().substr(0, 7) !== "SELECT ") { echo "Houston, we got a problem!" }
    

    Si noti che questo è efficace solo se si utilizza una funzione che accetta solo istruzioni singole (cioè non più istruzioni separate da ; ).

Infine, se queste query vengono utilizzate per qualcosa di diverso dalla semplice visualizzazione dei dati, si è in difficoltà. Se effettivamente controllano la logica dell'applicazione, ad es. "elenca gli utenti con privilegi di modifica" o "elenca gli articoli che possono essere eliminati", non c'è limite ai problemi che potresti avere se un account amministratore viene violato.

    
risposta data 12.01.2017 - 12:54
fonte

Leggi altre domande sui tag