Test di iniezione SQL continui

7

Abbiamo un set di applicazioni web Python / Django interne che sono abbastanza ben testate in termini di funzionalità, ma di volta in volta scopriamo vulnerabilità e, in particolare, luoghi in cui possono verificarsi SQL e altri tipi di iniezioni. Attualmente, questo è un processo molto manuale che richiede la conoscenza del sistema (scatola bianca).

Ma c'è un modo per fare un test di SQL injection automatico di tutti i nostri endpoint API delle applicazioni in prova?

Immagino che alcune delle cose che non capisco ora siano: dovremmo effettivamente scrivere la logica di questi test ed esempi per loro e usare, diciamo, Python unittest framework, o c'è un modo per specificare endpoint e parametri possibili e lasciare che qualche framework di test di sicurezza generi input malformati per sondare le iniezioni SQL ( sqlmap ?) (la domanda è in un certo senso se si tratterebbe di test basati su Esempio o Test basati su proprietà )

    
posta alecxe 19.12.2017 - 02:57
fonte

3 risposte

1

Vorrei vedere questo problema da un altro punto di vista.

Hai affermato di aver trovato molte SQLI in diversi endpoint API nella tua applicazione.

Qual è stata esattamente la correzione / attenuazione per tale problema? E come è possibile che anche dopo questa correzione siano stati trovati altri problemi in un altro endpoint nella stessa applicazione?

In che modo è strutturata l'applicazione?

La mia idea era di costruire come un tunnel in cui prima passano tutte le richieste API e controllare la stringa con una whitelist di caratteri per ex. Credo che ci siano biblioteche che potrebbero anche farlo abbastanza bene.

Anche la maggior parte degli ORM al giorno d'oggi sta facendo questo lavoro per te.

Forse sarebbe anche interessante sapere in che modo esattamente il Data Access Layer nella tua applicazione è costruito e prova a rifattorizzarlo e segui Cheatheet OWASP per attenuare SQLis.

Non sto suggerendo di ignorare la parte dei test di Automazione. Sono più curioso di sapere perché questo problema esiste ancora dopo averlo risolto molte volte.

È anche impossibile dire che puoi eliminare completamente questi problemi, ecco perché anche dopo aver trovato una soluzione generica per l'intera applicazione potresti aver bisogno di questi test automatici.

    
risposta data 31.12.2017 - 14:22
fonte
2

Potresti eseguire script di test basati su esempi abbastanza facilmente. Con una richiesta di esempio, sqlmap può fare il resto. L'unica cosa che non fa per default credo sia il path paramters, ma anche quello potrebbe essere incorporato nel tuo script. Il problema con questo è che aumenterà esponenzialmente la quantità di tempo che impiega per eseguire i test unitari e generalmente non viene fatto in questo modo a causa di ciò. Sta a te e ai tuoi sviluppatori determinare se il tempo aggiunto è accettabile. Nella mia esperienza, generalmente non lo è. Potresti anche creare qualcosa che lanci la mappa sql in un thread separato, ad esempio, quando qualcosa viene distribuito allo stage e avvisare la sicurezza se qualcosa viene trovato. In questo modo non bloccherebbe la tua build. Il test basato sull'esempio sarebbe la risposta alla tua domanda però.

    
risposta data 19.12.2017 - 07:46
fonte
1

Domanda interessante!

Avrai bisogno di automatizzare più processi per far funzionare tutto questo. Non esiste un prodotto magico (che io sappia) che faccia questo, ma qui c'è un algoritmo:

  1. Raccogli informazioni sui server Web che eseguono le tue applicazioni SQL. Questo può essere fatto facilmente tramite nmap -sS host-range -oX output.xml -p 80,443,8080,1080

  2. Da queste applicazioni trovate si raccolgono i parametri POST / GET dal file output.xml per metterli sotto test. Questo può essere fatto tramite arricciatura e alcuni script di bash, o% pars_de% parser XML con l'aiuto di python o curl .

  3. Utilizzare l'elenco dei parametri POST / GET raccolti per inviare in wget ai test per le Iniezioni SQL. Qualcosa del genere:

    per ogni POST / REQUEST in elenco {     esegui SQLMap -u link_from_list --risk 3 --level 3     se contrassegnato come SQL Injection     { rapporto() } }

  4. Esamina il rapporto; eliminare i falsi positivi e finalizzare un report per il team di sviluppo da correggere

  5. Patch, patch, patch!

  6. Ricomincia dal passo SQLMap

risposta data 31.12.2017 - 12:23
fonte