WordPress è il CMS più utilizzato nel mondo dello sviluppo web e di conseguenza è anche il CMS già vulnerabile; tra gli attacchi che più frequentemente interessano un sito WordPress troviamo gli SQL Injection.
Indice dei contenuti
|
Che cos’è l’attacco SQL Injection e come prevenirlo
SQL Injection è una tecnica di attacco informatico utilizzata per sfruttare le vulnerabilità nei sistemi che gestiscono database relazionali.
In particolare, un attaccante può inserire, attraverso l’interfaccia di un’applicazione web o software, del codice SQL malevolo in una query SQL, con l’obiettivo di manipolare il comportamento del database.
Come può verificarsi un attacco SQL Injection su WordPress
Plugin e Temi Vulnerabili:
- La maggior parte delle vulnerabilità di SQL Injection in WordPress deriva da plugin e temi di terze parti. Se un plugin o un tema non valida o non sanifica correttamente l’input dell’utente prima di usarlo in una query SQL, può essere vulnerabile a un attacco di SQL Injection.
- Un plugin che permette agli utenti di cercare nel database senza sanificare correttamente l’input potrebbe eseguire query SQL malevole inserite dall’utente.
Form di Input non Protetti:
- Se un modulo di input (come un modulo di contatto, una ricerca o un modulo di registrazione) non è protetto adeguatamente, un attaccante potrebbe inserire del codice SQL malevolo nei campi di input per manipolare le query SQL eseguite dal database.
Parametri URL:
- Alcuni plugin o temi potrebbero utilizzare parametri URL direttamente nelle query SQL senza sanificarli, permettendo a un attaccante di manipolare le query tramite URL malformati.
File Personalizzati:
- Se un sito WordPress ha file PHP personalizzati che eseguono query SQL senza utilizzare le API sicure di WordPress (come wpdb->prepare()), possono essere vulnerabili a SQL Injection.
Come funziona un attacco SQL Injection
Quando un’applicazione non valida correttamente gli input forniti dagli utenti, c’è il rischio che venga inserito del codice SQL malevolo nei campi di input (come campi di testo, URL, o cookie); di conseguenza questo codice viene poi eseguito dal database, permettendo all’hacker di:
- Accedere a dati non autorizzati: Leggere dati sensibili come credenziali di accesso, informazioni personali, ecc.
- Modificare o cancellare dati: Cambiare o eliminare informazioni nel database.
- Eseguire comandi amministrativi: Ad esempio, eliminare intere tabelle o database.
- Bypassare l’autenticazione: Accedere a un sistema senza conoscere le credenziali legittime.
Esempio di SQL Injection
Immagina un’applicazione che autentica un utente con una query SQL come questa:
SELECT * FROM utenti WHERE username = ‘admin’ AND password = ‘password’;
Se l’applicazione non filtra adeguatamente gli input, un hacker potrebbe inserire qualcosa come:
admin’ OR ‘1’=’1
Il risultato sarebbe una query:
SELECT * FROM utenti WHERE username = ‘admin’ OR ‘1’=’1′ AND password = ‘password’;
Questa condizione è sempre vera, consentendo all’hacker di accedere all’interno del sistema.
Come proteggere il tuo sito WordPress dagli attacchi SQL
L’SQL Injection è una delle vulnerabilità più comuni e pericolose, ma può essere prevenuta con una corretta gestione e sicurezza del codice.
- Utilizzare query parametriche: Separare il codice SQL dai dati, utilizzando prepared statements o stored procedures.
- Validare e sanificare gli input: Rimuovere o codificare i caratteri speciali dagli input forniti dagli utenti.
- Limitare i privilegi dell’utente del database: L’utente del database utilizzato dall’applicazione dovrebbe avere i minimi privilegi necessari.
- Utilizzare ORM (Object-Relational Mapping): Gli ORM astraggono il livello SQL e riducono il rischio di SQL Injection.
- Monitoraggio e logging: Implementare meccanismi di monitoraggio per rilevare e rispondere rapidamente a eventuali attacchi.
Per prevenire questi tipi di attacchi sul tuo Sito WordPress ti consigliamo di:
- Aggiornare Regolarmente WordPress, Plugin e Temi: Assicurarsi che il core di WordPress, i plugin e i temi siano sempre aggiornati alle ultime versioni, che includono patch di sicurezza per vulnerabilità note.
- Utilizzare Plugin e Temi Affidabili: Scaricare plugin e temi solo da fonti affidabili, come il repository ufficiale di WordPress, e verificare che siano mantenuti attivamente dagli sviluppatori.
- Utilizzare le API di WordPress per l’Accesso al Database: Utilizzare l’API wpdb di WordPress, in particolare il metodo wpdb->prepare(), per eseguire query SQL in modo sicuro. Questo metodo sanifica automaticamente i dati in ingresso, esempio:
global $wpdb;
$username = $_POST[‘username’];
$query = $wpdb->prepare(“SELECT * FROM utenti WHERE username = %s”, $username);
$results = $wpdb->get_results($query);
- Implementare WAF (Web Application Firewall): Un WAF può bloccare tentativi di attacco, incluso SQL Injection, analizzando il traffico in entrata e filtrando richieste sospette.
- Monitorare e Loggare le Attività: Utilizzare plugin di sicurezza per monitorare il sito e tenere traccia delle attività sospette. I log possono aiutare a identificare e rispondere rapidamente a tentativi di SQL Injection.
- Utilizzare la Convalida degli Input: Validare e sanitizzare tutti gli input dell’utente. Ad esempio, utilizzare funzioni come sanitize_text_field(), esc_sql(), e altre funzioni di escaping fornite da WordPress.
- Limitare i Privilegi del Database: L’utente del database utilizzato da WordPress dovrebbe avere solo i privilegi minimi necessari per eseguire l’applicazione. Ad esempio, evitare di usare un account con privilegi di amministrazione completa del database.
Come risolvere il problema
Per risolvere il problema dell’SQL Injection, è fondamentale adottare una serie di pratiche di sviluppo sicure che riducono o eliminano la possibilità che un attaccante possa iniettare codice SQL malevolo. Ecco alcune delle principali tecniche e strategie per prevenire l’SQL Injection:
Utilizzare Prepared Statements (Query Parametriche)
Le query parametriche separano il codice SQL dai dati, impedendo che l’input dell’utente venga interpretato come parte della query SQL. La maggior parte dei linguaggi di programmazione e delle librerie di accesso ai database supporta prepared statements.
Esempio in PHP con PDO:
$stmt = $pdo->prepare(“SELECT * FROM utenti WHERE username = :username AND password = :password”);
$stmt->execute([‘username’ => $username, ‘password’ => $password]);
In questo esempio, :username e :password sono parametri che vengono sostituiti con valori sicuri, eliminando il rischio di SQL Injection.
Utilizzare ORM (Object-Relational Mapping)
L’uso di ORM (come Hibernate per Java, Entity Framework per .NET, o SQLAlchemy per Python) può aiutare a prevenire l’SQL Injection poiché queste librerie costruiscono automaticamente le query e gestiscono la sanificazione degli input.
Esempio con SQLAlchemy in Python:
user = session.query(User).filter_by(username=username).first()
L’ORM si occupa di generare le query SQL in modo sicuro, riducendo il rischio di iniezioni SQL.
Sanificare e Validare gli Input
È importante validare e sanificare tutti gli input dell’utente, rimuovendo caratteri speciali o proibiti e assicurandosi che l’input rispetti il formato previsto.
Esempi di validazione:
- Limitare la lunghezza dei campi di input.
- Utilizzare espressioni regolari per controllare il formato dell’input (ad esempio, email, numeri di telefono).
- Escaping dei caratteri speciali come apici singoli (‘), doppi apici (“), backslash (\), …
Utilizzare Stored Procedures
Le stored procedures, se implementate correttamente, possono contribuire a ridurre il rischio di SQL Injection poiché separano il codice SQL dai dati e possono essere progettate per accettare solo parametri sicuri.
Esempio in SQL Server:
CREATE PROCEDURE GetUser
@username NVARCHAR(50),
@password NVARCHAR(50)
AS
BEGIN
SELECT * FROM utenti WHERE username = @username AND password = @password;
END
Gestire gli Errori in Modo Sicuro
Non esporre dettagli degli errori SQL all’utente finale; i messaggi di errore possono fornire indizi agli attaccanti su come è strutturato il database.
Esempio di gestione degli errori in PHP:
try {
$stmt = $pdo->prepare(“SELECT * FROM utenti WHERE username = :username”);
$stmt->execute([‘username’ => $username]);
} catch (PDOException $e) {
// Log the error but don’t show details to the user
error_log($e->getMessage());
echo “Si è verificato un errore. Riprova più tardi.”;
}
Eseguire Test di Sicurezza
Regolarmente condurre test di sicurezza, come penetration testing e code reviews, per identificare e correggere eventuali vulnerabilità di SQL Injection prima che possano essere sfruttate.
Conclusioni
Un attacco SQL Injection può essere devastante per un sito WordPress, ma seguendo queste linee guida è possibile prevenire questi attacchi e mantenere il sito sicuro.
Ti ricordiamo di effettuare sempre backup regolari del tuo sito WordPress per poter ripristinare rapidamente il sito in caso di compromissione; per esempio noi di Xlogic offriamo ai nostri clienti lo strumento di backup automatico JetBackup che permette di ripristinare un backup parziale o completo in due semplici click, per ottenere maggiori informazioni consulta questa guida –> JetBackup – Backup automatico
Inoltre noi di Xlogic offriamo ai nostri clienti un antivirus avanzato in grado di rilevare migliaia e migliaia di virus / malware ed attacchi hacker, per ottenere maggiori informazioni consulta questa pagina –> Imunify 360 – Suite di sicurezza avanzata
Se sei nostro cliente ed hai bisogno di maggiori informazioni puoi contattarci tramite il modulo di contatto, via mail o via ticket.