Iniezione sql generica CGI

1

Stavo effettuando la scansione di un sito con Nessus quando è stata segnalata la seguente vulnerabilità:

CGI Generic SQL Injection

Nessus dice che:

"An attacker may exploit this flaw to bypass authentication, read confidential data, modify the remote database, or even take control of the remote operating system."

Così ho continuato a leggere e ho scoperto che la vulnerabilità si trova in questo pezzo di codice:

Using the POST HTTP method, Nessus found that :

The following resources may be vulnerable to SQL injection :

The '_codeTextBox' parameter of the /LoginTeacherForm.aspx CGI :

/LoginTeacherForm.aspx [loginButton=Login&_VIEWSTATE=dDwtMTU2NDIxMDkwN Ts7Pg%3d%3d&btnChangePassword=Wijzig%20Pincode&_pinCodeTextBox=&_codeTex tBox='+convert(int,convert(varchar,0x7b5d))+']

-------- output --------

Exception Details: System.Data.SqlClient.SqlException: String or binary data would be truncated. The statement has been terminated.

Ma mi chiedo in che modo un utente malintenzionato potrebbe sfruttare questa vulnerabilità, perché quando si incolla quell'url mi dà solo un errore.

Quindi la mia domanda è: in che modo un attacco potrebbe effettivamente entrare nel sito e bypassare l'accesso, ecc.?

    
posta ruben 24.08.2013 - 15:17
fonte

2 risposte

1

Inizierò citando il solito pezzo che facciamo quando vengono utilizzati strumenti di test di sicurezza, il che è molto importante usarli solo su siti che sei autorizzato a testare. L'utilizzo di strumenti di sicurezza su siti che non sei autorizzato a testare può essere considerato un reato a seconda della tua giurisdizione.

Detto questo, direi che Nessus probabilmente riferirà che in base alla menzione dell'eccezione SQL nel messaggio di errore, implica che la query SQL su quella pagina è stata modificata, anche se ho visto falsi positivi con quel tipo di errore prima.

In termini di come potrebbe essere vulnerabile, la query dietro quel tipo di pagina è probabilmente un'istruzione SELECT che confronta i valori forniti per l'accesso con quelli memorizzati nel database per quell'utente. Se la pagina prende i valori direttamente dall'utente e li inserisce nella query, esiste la possibilità che sia vulnerabile.

Se è vulnerabile, un utente malintenzionato può modificare la query SQL da eseguire sul sito, ignorando l'accesso è un possibile risultato, insieme a un utente malintenzionato che danneggia il server sottostante.

Un buon modo per testare questo in modo non distruttivo potrebbe essere usare i caratteri di citazione e la concatenazione di stringhe.

Innanzitutto controlla se è possibile riprodurre l'errore. Inserisci un singolo carattere nel campo insieme a dati validi negli altri campi in tale forma. Se genera un errore, è possibile che sia vulnerabile.

Quindi se hai un valore valido per il campo di codetextbox (diciamo che è abcdef) prova ad inserire

abc'+'def

come valore in quel campo insieme a dati validi negli altri campi. Se l'applicazione esegue il login, è stato rimosso i caratteri non alpha (possibile ma non spiegherebbe il tuo messaggio di errore) o ha concatenato le due stringhe insieme, il che implica che hai SQL Injection.

A quel punto la cosa migliore è guardare la fonte della pagina per confermare.

    
risposta data 25.08.2013 - 09:39
fonte
0

L'errore System.Data.SqlClient.SqlException indica un errore nell'istruzione della query SQL. Ciò implica che il valore memorizzato nel parametro _codeTextBox non sia convalidato o altro sanificato sanificato prima di essere inserito nella query.

Questo avrebbe implicazioni variabili a seconda della query e della logica che circonda il suo valore di ritorno. È impossibile determinare lo scenario peggiore senza una conoscenza approfondita dell'applicazione web. Basti pensare che questo problema dovrebbe essere risolto dallo sviluppatore. Fortunatamente, di solito è facile risolverlo una volta identificato.

In questo caso, sembra che il parametro _codeTextBox sia passato alla funzione convert . Dubito che qualcuno possa sfruttarlo. Ma questo indica pratiche di codifica insicure che probabilmente appaiono in altre aree di cui Nessus non è a conoscenza. Leggi sotto per maggiori informazioni.

Lo vedo molto spesso quando il programmatore concatena semplicemente i valori con la stringa di query SQL:

Esempio non sicuro (java) (fonte OWASP )

String query = "SELECT account_balance FROM user_data WHERE user_name = "
  + request.getParameter("customerName");

try {
    Statement statement = connection.createStatement( … );
    ResultSet results = statement.executeQuery( query );
}

Poiché il valore viene semplicemente aggiunto alla fine della query, l'utente può cambiare query per fare qualcosa di nefasto come l'accesso come qualsiasi utente o visualizzare tutte le transazioni. Nell'esempio precedente, l'utente può modificare il parametro customer name in qualcosa come '' or 1=1 o peggio.

Query prevista:

 SELECT account_balance FROM user_data WHERE user_name = someuser

Query non valida:

 SELECT account_balance FROM user_data WHERE user_name = '' OR 1=1

OWASP raccomanda le seguenti misure difensive. La tua situazione detterà ciò che è appropriato:

Difese primarie :

  1. Uso di istruzioni preparate (query parametrizzate)
  2. Uso di stored procedure
  3. Escaping di tutti gli input forniti dall'utente

Difese aggiuntive :

  • Applica anche: privilegio minimo
  • Esegui anche: Convalida inserimento lista bianca

Devi veramente controllare il sito OWASP e leggere di più su Iniezione SQL .

    
risposta data 09.09.2013 - 18:21
fonte

Leggi altre domande sui tag