SQL Injection: Guida Completa su Funzionamento, Rischi e Prevenzione

SimoneAttaccoHackerToolYesterday106 Views

Introduzione: Perché gli SQL Injection Sono Ancora una Minaccia?

Nel panorama della sicurezza informatica, gli attacchi web rappresentano una delle minacce più insidiose. Tra questi, spiccano:

  • Cross-Site Scripting (XSS)
  • Remote Code Execution (RCE)
  • SQL Injection

L’SQL Injection è particolarmente pericoloso perché colpisce direttamente i database relazionali, consentendo agli hacker di:
🔓 Rubare dati sensibili (credenziali, informazioni personali)
📝 Modificare o cancellare dati
🛑 Prendere il controllo completo del sistema

Nonostante sia noto da decenni, molti siti web rimangono vulnerabili a causa di codice mal progettato o mancanza di validazione degli input.


Come Funziona un Attacco SQL Injection?

Cos’è l’SQL?

SQL (Structured Query Language) non è solo un linguaggio di interrogazione, ma include:

  • DDL (Data Definition Language): crea/modifica tabelle
  • DML (Data Manipulation Language): gestisce i dati
  • DQL (Data Query Language): esegue query
  • DCL (Data Control Language): controlla gli accessi

Esempio di Vulnerabilità

Consideriamo un form di login vulnerabile:

$user = $_POST['username'];
$pass = $_POST['password'];
$sql = "SELECT * FROM users WHERE username = '$user' AND password = '$pass'";
$result = $conn->query($sql);

Se un hacker inserisce:

  • Username: ' OR 1=1 --
  • Password: (vuoto)

La query diventa:

SELECT * FROM users WHERE username = '' OR 1=1 --' AND password = ''

Risultato:
1=1 è sempre vero → bypassa l’autenticazione!
-- commenta il resto del codice → ignora il controllo della password.

SQL Injection

Dimostrazione Pratica: Database e Codice Vulnerabile

1. Creazione del Database

CREATE DATABASE IF NOT EXISTS test_db;
USE test_db;

CREATE TABLE IF NOT EXISTS users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  username VARCHAR(50) NOT NULL,
  password VARCHAR(255) NOT NULL
);

INSERT INTO users (username, password) VALUES 
('user1', 'password1'),
('user2', 'password2'),
('user3', 'password3'),
('user4', 'password4'),
('user5', 'password5');

2. Codice PHP Vulnerabile

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "test_db";

$conn = new mysqli($servername, $username, $password, $dbname);

if ($conn->connect_error) {
  die("Connessione fallita: " . $conn->connect_error);
}

if ($_SERVER["REQUEST_METHOD"] == "POST") {
  $user = $_POST['username'];
  $pass = $_POST['password'];

  $sql = "SELECT * FROM users WHERE username = '$user' AND password = '$pass'";
  $result = $conn->query($sql);

  if ($result->num_rows > 0) {
    echo "Login eseguito con successo!";
  } else {
    echo "Username o password errati.";
  }
}

$conn->close();
?>

3. Come un Hacker Sfrutta la Vulnerabilità

Un attaccante può:

  1. Bypassare il login con ' OR 1=1 --
  2. Estrarre tutti i dati con:
   ' UNION SELECT 1, username, password FROM users --
  1. Eliminare tabelle con:
   '; DROP TABLE users; --

Come Prevenire gli SQL Injection?

1. Prepared Statements (Query Parametrizzate)

$stmt = $conn->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt->bind_param("ss", $user, $pass);
$stmt->execute();
$result = $stmt->get_result();

2. Validazione degli Input

  • Filtrare caratteri speciali con mysqli_real_escape_string()
  • Usare espressioni regolari per limitare input (es., solo lettere e numeri)

3. Least Privilege Principle

  • Limitare i permessi del DB (es., un utente di login non dovrebbe poter eliminare tabelle).

4. Web Application Firewall (WAF)

Strumenti come ModSecurity bloccano richieste SQL malevole.


SQLMap: Lo Strumento per Testare le Vulnerabilità

Installazione

git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev
cd sqlmap-dev
python3 sqlmap.py --help

Analisi di una Pagina Vulnerabile

  1. Intercettare la richiesta POST (usando Chrome DevTools → Network tab).
  2. Eseguire SQLMap:
   python3 sqlmap.py -u "http://localhost/test-sql.php" --data "username=pippo&password=plutopassword" --batch
  1. Estrarre i dati:
   sqlmap -u "http://localhost/test-sql.php" --data "username=pippo&password=plutopassword" -D test_db -T users --dump

Conclusioni: Proteggersi è Obbligatorio

Mai concatenare query SQL con input utente! Usare prepared statements.
Validare tutti gli input (client-side e server-side).
Limitare i permessi del database.
Testare regolarmente con SQLMap o altri scanner.

Gli SQL Injection sono evitabili, ma richiedono consapevolezza e buone pratiche di sviluppo.

🔒 La sicurezza inizia dal codice: scrivilo bene, proteggilo sempre!

FAQ

Quali database sono più a rischio?
Tutti i database SQL (MySQL, PostgreSQL, SQL Server) se non protetti.

Come verificare se il mio sito è vulnerabile?
Usa SQLMap o servizi come Burp Suite.

Esistono SQL Injection “ciechi” (Blind)?
Sì, sfruttano risposte indirette (es., ritardi nelle query) per estrarre dati.

📢 Hai dubbi? Lascia un commento o contattaci per una consulenza sicurezza! 🚀

Segui il nostro blogHackerlog.net per rimanere aggiornato su cybersecurity, hacking etico e difesa delle infrastrutture digitali.

Advertisement

Leave a reply

Follow
  • X NetworkFollow
  • InstagramFollow
  • GithubFollow

Stay Informed With the Latest & Most Important News

I consent to receive newsletter via email. For further information, please review our Privacy Policy

Advertisement

Loading Next Post...
Follow
Search Trending
Random Posts
Loading

Signing-in 3 seconds...

Signing-up 3 seconds...

Cart
Cart updating

ShopYour cart is currently is empty. You could visit our shop and start shopping.