Diventa Autore per CoreTech | Scopri di più





Il bigino su SQL Injection per sviluppatori

31/07/20 CoreTech Blog

In questo bigino, supponiamo che:

  • Sei uno sviluppatore o conosci la programmazione
  • Hai una conoscenza limitata della sicurezza delle applicazioni web
  • Devi sapere come si verificano gli attacchi di iniezione SQL
  • Devi sapere come risolvere i problemi di iniezione SQL nel tuo codice

In questo bigino imparerai:

  • In che modo gli hacker malintenzionati conducono attacchi di iniezione SQL
  • Come correggere il codice che presenta vulnerabilità nell'iniezione SQL
  • Come evitare le vulnerabilità dell'iniezione SQL per il futuro

1. Attacchi di iniezione SQL

1.1. Informazioni generali sull'iniezione di SQL

Le iniezioni di SQL si verificano quando:

  • Il codice utilizza dati non analizzati dall'input dell'utente nelle istruzioni SQL
  • Un utente malintenzionato include elementi SQL nell'input in modo complicato
  • Il codice esegue questi elementi SQL come parte di istruzioni SQL legittime

1.1.1. Domande frequenti sull'iniezione SQL

  • Quali server SQL sono interessati dalle iniezioni di SQL?
    Tutti i server SQL possono essere interessati da iniezioni di SQL: MySQL, MSSQL, Oracle, PostgreSQL e altri.
  • Quali linguaggi di programmazione sono interessati dalle iniezioni di SQL?
    Iniezioni di SQL possono verificarsi in qualsiasi linguaggio di programmazione.
  • Quali possono essere le conseguenze di un'iniezione SQL?
    Un'iniezione SQL può causare perdite di dati,ma può anche portare a un completo compromesso del sistema .
  • Quanto sono comuni le iniezioni di SQL?
    Iniezioni di SQL sono state rilevate da Acunetix in media nell'8% delle applicazioni web.
  • I firewall per applicazioni Web (WAF) proteggono dalle iniezioni di SQL?
    No, i WAF rendono solo più difficile per l'attaccante l'invio di payload di iniezione SQL.

1.1.2. Esempio di iniezione SQL semplice

Il tuo codice in PHP:

<?PHP

  $userid = $_GET["userid"];

Banner

  $query  = "SELECT user FROM users WHERE userid = $userid;";

  $result = pg_query($conn, $query);

?>

 

Richiesta di attaccante:

http://www.example.com/test.php?userid=0; ELIMINA DAGLI utenti DOVE 1

Il codice elabora la seguente query SQL:

$query  = "SELECT user FROM users WHERE userid = 0; DELETE FROM users WHERE 1;";

Di conseguenza, se l'utente corrente (utente del database corrente) dispone delle autorizzazioni appropriate, l'intera tabella degli utenti viene cancellata.

 

1.2. Tipi di iniezione SQL

1.2.1. Iniezione SQL in banda: iniezione SQL basata su errori

  • L'attaccante crea l'iniezione SQL per rendere un errore la visualizzazione del back-end
  • Il back-end restituisce un errore all'attaccante
  • L'attaccante utilizza le informazioni contenute nell'errore per intensificare l'attacco
  • Questo tipo di iniezione SQL viene utilizzato per accedere a informazioni riservate come tipo di database, nomi di file e altro

Esempio:

  • Payload:
    http://testphp.vulnweb.com/listproducts.php?cat=1 ′
  • Risultato: l'applicazione Web visualizza il seguente errore nel browser:
    Errore: si è verificato un errore nella sintassi SQL; controlla il manuale corrispondente alla versione del tuo server MySQL per la sintassi corretta da usare vicino "" alla riga 1 Avvertenza: mysql_fetch_array () si aspetta che il parametro 1 sia una risorsa, valore booleano fornito in /hj/var/www/listproducts.php sulla riga 74

1.2.2. Iniezione SQL in-band: iniezione SQL basata su Union

  • L'attaccante utilizza una clausola UNIONnel payload
  • Il motore SQL combina informazioni riservate con informazioni legittime che l'applicazione Web deve visualizzare
  • L'applicazione Web visualizza informazioni riservate

Esempio:

1.2.3. Iniezione SQL cieca: iniezione SQL su base booleana

  • L'attaccante invia molti payload che fanno sì che l'applicazione Web restituisca un risultato diverso a seconda che la query SQL restituisca VERO o FALSO
  • L'attaccante trae una conclusione dal comportamento dell'applicazione Web per ciascun payload
  • Questo tipo di iniezione SQL viene spesso utilizzato per verificare se sono possibili altre iniezioni SQL, ma può anche essere utilizzato per accedere a informazioni riservate

Esempio:

Banner

1.2.4. Iniezione SQL cieca: iniezione SQL basata sul tempo

  • Se l'applicazione Web non restituisce errori e le informazioni restituite sono le stesse per i payload basati su booleani, l'attaccante invia un payload che include un comando di ritardo come SLEEP, che ritarda l'intera risposta
  • L'attaccante trae una conclusione dal comportamento dell'applicazione Web e ripete il processo il più volte possibile con argomenti diversi
  • Questo tipo di iniezione SQL viene spesso utilizzato per verificare se sono possibili altre iniezioni SQL
  • Questo tipo di iniezione SQL può anche essere utilizzato, ad esempio, per indovinare il contenuto di una cella di database un carattere alla volta utilizzando valori ASCII diversi in combinazione con un ritardo

Esempio:

1.2.5. Iniezione SQL fuori banda:

  • Questo tipo di iniezione SQL è possibile solo per alcuni database, ad esempio Microsoft SQL Server e Oracle.
  • L'attaccante include un comando di database speciale nel payload: questo comando provoca una richiesta a una risorsa esterna (controllata dall'attaccante)
  • L'aggressore monitora i tentativi di contattare la risorsa esterna, ad esempio ricerche DNS o registri di richieste HTTP della risorsa esterna
  • Se è in arrivo una richiesta una volta eseguito il payload, ciò conferma che è possibile l'iniezione di SQL
  • L'aggressore accede alle informazioni del database e può inviarlo alla risorsa esterna

Esempio (Oracle):

  • Payload:
    1 || UTL_HTTP.request ('http://example.com/')
  • Risultato: viene inviata una richiesta a com: è possibile monitorare tali richieste se si controlla example.com .

2. Difesa dell'iniezione SQL

2.1. Query con parametri (istruzioni preparate)

  • Questa tecnica è disponibile in molti linguaggi di programmazione
  • Invece di formare la query utilizzando funzioni come concat o altre forme di concatenazione di stringhe, la stringa di query include parametri
  • La libreria di istruzioni preparate sostituisce questi parametri con valori forniti dall'utente e disinfettati, in modo che i comandi SQL e l'input dell'utente (parametri) vengano passati separatamente

2.1.1. Esempio di PHP

Utilizzo di PHP Data Objects (PDO):

$dbh = new PDO('mysql:host=localhost;dbname=database', 'dbuser', 'dbpasswd');

$query = "SELECT column_name FROM table_name WHERE id = :id order by column_name desc";

$sth = $dbh->prepare($query);

$sth->bindParam(':id', $_GET[“id”]);

$sth->execute();

$result = $sth->fetchColumn();

2.1.2. Esempio Java

int id = Integer.parseInt(id);

String query = "SELECT column_name FROM table_name WHERE id = ? order by column_name desc";

PreparedStatement stmt = connection.prepareStatement(query);

stmt.setInt(1,id);

ResultSet results = stmt.executeQuery();

2.2. Procedura di archiviazione

  • Utilizzare solo se il linguaggio di programmazione non supporta istruzioni preparate
  • Per evitare iniezioni di SQL, è necessario utilizzare istruzioni preparate nelle procedure memorizzate
  • Disponibile solo per i motori di database che supportano le procedure memorizzate ma la maggior parte dei motori moderni le supporta
  • La query viene preparata e memorizzata nel motore di database
  • L'applicazione chiama la procedura memorizzata e le passa le variabili

2.2.1 Esempio di MySQL

Creare la procedura:

CREATE PROCEDURE example(IN suppliedId VARCHAR(8))

BEGIN

  SELECT column_name FROM table name WHERE id = suppliedId;

END

Chiamare la procedura con id = 1:

CALL example("1");

Il payload dell'iniezione SQL non funzionerà:

CALL example("0;DELETE FROM users WHERE 1");

2.2.2 Esempio MSSQL

Creare la procedura:

CREATE PROCEDURE dbo.example @id nvarchar(8)

AS

  SELECT column_name FROM table name WHERE id = @id;

GO

Chiamare la procedura con id = 1:

EXEC database.dbo.example 1;

Il payload dell'iniezione SQL non funzionerà:

EXEC database.dbo.example 0;DELETE FROM USERS WHERE 1


Articoli su Acunetix

Trovare le vulnerabilità dei siti web prima degli HackerL'importanza della convalida delle correzioni: lezioni da GoogleSDLC agile e sicuro - Best practiceIn che misura le aziende gestiscono la sicurezza delle applicazioni Web?Cross-Origin Resource Sharing (CORS) e intestazione Access-Control-Allow-OriginCosa sono i reindirizzamenti aperti?DevSecOps: come arrivarci da DevOpsIl bigino su SQL Injection per sviluppatoriSfruttare SSTI in ThymeleafSicurezza nginx: come proteggere la configurazione del serverRafforzamento del sistema Web in 5 semplici passaggiCos'è la sicurezza del sito Web - Come proteggere il tuo sito Web dall'hackingRapporto sulle vulnerabilità delle applicazioni Web Acunetix 2020Perché l'elenco delle directory è pericoloso?Cosa sono gli hack di Google?Cosa è l'attacco BEASTWeb Shells in Action - Rilevazione e prevenzione - parte 5Web Shells in Action - parte 4Mantenere le Web Shells sotto copertura - parte 3Introduzione alle web shell - parte 2: 101 Uso di PHPIntroduzione alle web shell - parte 1Debunking 5 miti sulla postura della sicurezza informaticaIniezioni di NoSQL e come evitarleConfigurazione passo passo di Acunetix con JenkinsCosa sono i riferimenti a oggetti diretti non sicuriAnche il più forte cade: un'iniezione SQL in Sophos XG FirewallAcunetix rilascia Business Logic RecorderCome recuperare un sito Web compromessoCome difendersi dagli hacker Black Hat durante la pandemia COVID-19Che cos'è l'inclusione remota dei file (RFI)?Apache Security - 10 consigli per un'installazione sicuraUn nuovo sguardo sugli attacchi correlati al proxy inversoVulnerabilità delle password comuni e come evitarleTutto quello che devi sapere sugli attacchi Man-in-the-MiddleChe cosa sono le iniezioni HTMLRed Teaming – 5 consigli su come farlo in modo sicuroTesta le tue competenze XSS utilizzando siti vulnerabiliPerché hacker malintenzionati hanno messo gli occhi sugli ospedaliPratiche di codifica sicura – I tre principi chiaveLa maledizione delle vecchie librerie JavaMutation XSS nella ricerca GoogleIgnorare SOP utilizzando la cache del browserCome e perché evitare reindirizzamenti e inoltri non convalidati?Dirottamento di sessione e altri attacchi di sessioneCome abbiamo trovato un altro XSS in Google con AcunetixChe cos'è un buffer overflowChe cos'è l'overflow di IntegerChe cos'è HSTS e perché dovrei usarlo?Che cosa è OS Command InjectionVulnerabilità delle entità esterne XML in Internet ExplorerCoreTech assicura protezione dei siti Web con AcunetixCoreTech distributore Acunetix a fianco dei partner per la CyberSecurityCyberSecurity applicativa, nuova opportunità per voi!