Iniezione SQL
Una virgoletta in un campo di ricerca riscrive la query.
Cos’è Iniezione SQL?
Una stringa fornita dall'utente viene concatenata in una query e tale stringa può modificare ciò che la query richiede. Ogni richiesta qui viene eseguita su un vero database incorporato, quindi nulla è falso. Spezzerai un modulo di ricerca dell'account con una virgoletta singola, restituirai l'intera tabella dei membri con ' OR '1'='1 , quindi utilizzerai UNION SELECT e information_schema per estrarre da esso le email dell'amministratore e gli hash delle password. La correzione associa il valore come parametro in modo che la grammatica SQL non analizzi mai l'input come codice. Non la sanificazione, non una blocklist del firewall.
Cosa imparerai in Iniezione SQL
- Riconoscere la tautologia dell'SQL injection da manuale 'OR '1'='1 e spiegare perché una condizione sempre vera ignora un filtro WHERE
- Traccia il modo in cui un endpoint di ricerca su riga singola diventa una lettura di tabella completa quando il relativo parametro viene concatenato nella stringa SQL
- Utilizza UNION SELECT per enumerare le tabelle del database tramite information_schema ed estrarre righe da una tabella che il modulo non avrebbe mai dovuto esporre, come admin_users
- Distinguere le query parametrizzate (la difesa affidabile) dalle difese legate alla manipolazione delle stringhe come blocklist, escape e regole WAF e spiegare perché vale solo l'approccio parametrizzato
- Leggere un gestore di database vulnerabile abbastanza bene da individuare il bug di concatenazione, quindi confermare la correzione parametrizzata eseguendo nuovamente il payload esatto sull'endpoint con patch e visualizzando zero righe
Iniezione SQL — Fasi della formazione
-
Trova il modulo di destinazione
Bob ha nel mirino Vantyr , un servizio di abbonamento con una pagina pubblica di ricerca dell'account . Nessun accesso, solo un campo e-mail che restituisce il piano di un membro. È qui che iniziano gli attacchi web: una forma ordinaria che comunica silenziosamente con un database.
-
Invia una ricerca normale
Per prima cosa, guarda come si comporta normalmente il modulo. Inserisci l'e-mail di un membro reale e invia. Il pannello Network del browser si apre e registra la richiesta, esattamente ciò che uno sviluppatore vede in DevTools.
-
Ispeziona la richiesta
C'è la richiesta. L'e-mail digitata viene inviata al server nella richiesta payload e la risposta restituisce l'unico membro corrispondente. Niente di sbagliato ancora. Ecco come dovrebbe funzionare la funzionalità.
-
Leggi il codice del gestore
Ora la parte interessante: il codice del server che gestisce questa richiesta. Costruisce la query SQL incollando la tua email direttamente nella stringa di query . Quella sola affermazione è l’intero problema.
-
Individua la linea vulnerabile
Quell'unica affermazione è l'intera vulnerabilità: il tuo input è incollato nella stringa SQL e il commento mostra l'esatta query inviata al database, ricostruita in tempo reale da qualunque cosa tu digiti.
-
Interrompilo con una citazione
Il campo contiene ancora morgan.lee@example.com dalla tua prima ricerca. Il tuo input arriva all'interno di una stringa tra virgolette, quindi cosa succede quando invii una citazione? Aggiungi una virgoletta singola alla fine e invia, quindi osserva il commento della query eseguita nel codice ricostruito durante la digitazione: la tua citazione inserisce all'interno della stringa e la interrompe. Non stai più inviando dati. Stai modificando la query.
-
Leggere l'errore del database
Il server ha restituito un 500 con un errore reale del database. Quella virgoletta aggiuntiva terminava anticipatamente la stringa e lasciava la query in formato non corretto. Il database ha provato a eseguirlo e si è bloccato. Un errore come questo è il via libera di un utente malintenzionato: l'input raggiunge il motore SQL.
-
Bypassare il filtro
Ora fai in modo che la query faccia qualcosa di utile per te. Chiudi tu stesso la stringa, aggiungi una condizione che sia sempre vera e il filtro WHERE interrompe il filtraggio. Il classico: ' OR '1'='1 .
-
Guarda il dump completo
Il filtro è sparito. Invece di un membro, la risposta è la tabella dei membri interi : ogni email e piano di Vantyr. Hai chiesto un account e il database li ha consegnati tutti.
-
Verifica della conoscenza
Hai appena visto un payload restituire l'intera tabella. Blocca il perché.
Copertura dei framework di sicurezza
OWASP Top 10
- A05:2025 Injection
- A03:2021 Injection
CWE
- CWE-89 Improper Neutralization of Special Elements used in an SQL Command
CIS Controls
- CIS 16 Application Software Security
NIST CSF
- PR.AT-02 Individuals in specialized roles are provided with awareness and training so that they possess the knowledge and skills to perform relevant tasks with cybersecurity risks in mind
- PR.PS Platform Security