SQL Injection Tutorial: Lär dig med exempel

⚡ Smart sammanfattning

SQL-injektion är en attack som förgiftar dynamiska SQL-satser för att kringgå autentisering eller exponera data, och utnyttjar webbapplikationer som bygger frågor från osanerade användarinmatningar. Den här sidan visar hur attacken fungerar och hur man förhindrar den.

  • ???? Definition: SQL-injektion infogar skadlig SQL i en fråga via ett ogiltigt inmatningsfält.
  • 🔓 Inverkan: En lyckad attack kan kringgå inloggningar och läsa, ändra eller ta bort poster.
  • 🧪 Exempel: Ett alltid-sant villkor plus en kommentar förvandlar en inloggningskontroll till en kringgåelse.
  • 🛠️ Verktyg: SQLMap och jSQL automatiserar detektering och utnyttjande av injicerbara parametrar.
  • 🛡️ Förebyggande: Parameteriserade frågor, indatavalidering och konton med lägst behörighet minskar gapet.
  • 🤖 Modern kant: AI-drivna skannrar och brandväggar flaggar injektionsmönster som fixade signaturer missar.

SQL-injektionshandledning

Vad är en SQL-injektion?

SQL-injektion är en attack som förgiftar dynamiska SQL-satser för att kommentera bort vissa delar av satsen eller lägga till ett villkor som alltid kommer att vara sant. Den utnyttjar designfel i dåligt utformade webbapplikationer för att utnyttja SQL-satser för att köra skadlig SQL-kod.

Data är en av de viktigaste komponenterna i informationssystem. Databasdrivna webbapplikationer används av organisationer för att hämta data från kunder. SQL är förkortningen för Structured Query LanguageDen används för att hämta och manipulera data i databasen.

Diagram över hur en SQL-injektion manipulerar en dynamisk databasfråga

Hur fungerar en SQL-injektionsattack?

De typer av attacker som kan utföras med SQL-injektion varierar beroende på typen av databasmotor. Attacken fungerar på dynamiska SQL-satser. En dynamisk sats är en sats som genereras vid körning med hjälp av parametrar som skickas från ett webbformulär eller en URI-frågesträng.

Exempel på SQL-injektion

Låt oss betrakta en enkel webbapplikation med ett inloggningsformulär. Koden för HTML-formuläret visas nedan.

<form action=‘index.php’ method="post">

<input type="email" name="email" required="required"/>

<input type="password" name="password"/>

<input type="checkbox" name="remember_me" value="Remember me"/>

<input type="submit" value="Submit"/>

</form>

HÄR,

  • Formuläret ovan accepterar e-postadressen och lösenordet och skickar dem sedan till en PHP fil med namnet index.php.
  • Den har ett alternativ att lagra inloggningssessionen i en cookie. Vi har härlett detta från kryssrutan remember_me. Den använder post-metoden för att skicka data. Det betyder att värdena inte visas i URL.

Låt oss anta att kommandot i backend för att kontrollera användar-ID är följande.

SELECT * FROM users WHERE email = $_POST['email'] AND password = md5($_POST['password']);

HÄR,

  • Ovanstående kommando använder värdena i arrayen $_POST[] direkt utan att sanera dem.
  • Lösenordet hashas med hjälp av MD5-algoritmen.

Vi kommer att illustrera en SQL-injektionsattack med hjälp av SQL Fiddle. Öppna URL http://sqlfiddle.com/ i din webbläsare. Du kommer att få upp följande fönster.

Obs: du måste skriva SQL-satserna.

Tom SQL Fiddle fönstret är klart för schemat och frågan

Steg 1) Ange den här koden i den vänstra rutan.

CREATE TABLE `users` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `email` VARCHAR(45) NULL,
  `password` VARCHAR(45) NULL,
  PRIMARY KEY (`id`));
  
  
insert into users (email,password) values ('m@m.com',md5('abc'));

Steg 2) Klicka på Skapa schema.

Steg 3) Ange den här koden i den högra rutan.

select * from users;

Steg 4) Klicka på Kör SQL. Du kommer att se följande resultat.

SQL Fiddle resultat som visar den returnerade enskilda användarposten

Anta att en användare anger admin@admin.sys och 1234 som lösenord. Programmet som körs mot databasen skulle vara:

SELECT * FROM users WHERE email = 'admin@admin.sys' AND password = md5('1234');

Ovanstående kod kan utnyttjas genom att kommentera bort lösenordsdelen och lägga till ett villkor som alltid kommer att vara sant. Låt oss anta att en angripare anger följande inmatning i e-postadressfältet.

xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ]

xxx för lösenordet.

Den genererade dynamiska satsen blir som följer.

SELECT * FROM users WHERE email = 'xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ] AND password = md5('1234');

HÄR,

  • xxx@xxx.xxx avslutas med ett enkelt citationstecken som kompletterar strängen citationstecken.
  • OR 1 = 1 LIMIT 1 är ett villkor som alltid kommer att vara sant och begränsar de returnerade resultaten till endast en post.
  • — ' AND ... är en SQL-kommentar som eliminerar lösenordsdelen.

Kopiera ovanstående SQL-sats och klistra in den i SQL Fiddle Kör SQL-textrutan som visas nedan.

SQL Fiddle returnerar posten efter att det injicerade villkoret körts

Hackingaktivitet: SQL Injicera en webbapplikation

Vi har en enkel webbapplikation på http://www.techpanda.org/ som är sårbar för SQL-injektionsattacker, endast i demonstrationssyfte. HTML-formulärkoden ovan är hämtad från inloggningssidan. Applikationen tillhandahåller grundläggande säkerhet, såsom att rensa e-postfältet. Det betyder att vår kod ovan inte kan användas för att kringgå inloggningen.

För att komma runt det använder vi lösenordsfältet istället. Diagrammet nedan visar stegen att följa.

Flödesschema över stegen för att injicera lösenordsfältet i inloggningsformuläret

Låt oss anta att en angripare ger följande inmatning.

  • Steg 1: Ange xxx@xxx.xxx som e-postadress
  • Steg 2: Ange xxx') ELLER 1 = 1 — ]

Inloggningsformulär med inmatningssträngen angiven i lösenordsfältet

  • Klicka på knappen Skicka.
  • Du kommer att dirigeras till instrumentpanelen.

Den genererade SQL-satsen kommer att se ut som följer.

SELECT * FROM users WHERE email = 'xxx@xxx.xxx' AND password = md5('xxx') OR 1 = 1 -- ]');

Diagrammet nedan illustrerar hur påståendet genereras.

Förklaring av hur den injicerade SQL-satsen genereras

HÄR,

  • Satsen antar intelligent att md5-kryptering används.
  • Kompletterar det enkla citattecknet och den avslutande parentesen.
  • Lägger till ett villkor till påståendet som alltid kommer att vara sant.

I allmänhet kombinerar en lyckad attack flera tekniker som de som visas ovan.

Andra typer av SQL Injection Attack

SQL-injektioner kan göra mer skada än att bara kringgå inloggningsalgoritmerna. Några av attackerna inkluderar:

  • Raderar data
  • Uppdaterar data
  • Infogar data
  • Utföra kommandon på servern som kan ladda ner och installera skadliga program som trojaner
  • Exportera värdefull data som kreditkortsuppgifter, e-post och lösenord till angriparens fjärrserver
  • Hämta användarinloggningsuppgifter etc.
  • SQL-injektion baserad på cookies
  • Felbaserad SQL-injektion
  • Blind SQL-injektion

Listan ovan är inte uttömmande; den ger dig bara en uppfattning om vad SQL-injektion kan göra.

Automationsverktyg för SQL-injektion

I exemplet ovan använde vi manuella attacktekniker baserade på vår omfattande kunskap om SQL. Det finns automatiserade verktyg som kan hjälpa dig att utföra attackerna mer effektivt och på kortast möjliga tid. Dessa verktyg inkluderar:

Hur man förhindrar SQL-injektionsattacker

En organisation kan anta följande policy för att skydda sig mot SQL Injection-attacker.

  • Användarinmatning ska aldrig litas på – Den måste alltid saneras innan den används i dynamiska SQL-satser.
  • Lagrade procedurer – dessa kan inkapsla SQL-satserna och behandla all indata som parametrar.
  • Förberedda uttalanden – förberedda satser fungerar genom att först skapa SQL-satsen och sedan behandla all inskickad användardata som parametrar. Detta påverkar inte syntaxen för SQL-satsen.
  • Vanliga uttryck – dessa kan användas för att upptäcka potentiellt skadlig kod och ta bort den innan SQL-satserna körs.
  • Användarrättigheter för databasanslutning – endast nödvändiga åtkomsträttigheter bör ges till konton som används för att ansluta till databasen. Detta kan hjälpa till att minska vad SQL-satserna kan utföra på servern.
  • Felmeddelanden – dessa bör inte avslöja känslig information eller exakt var ett fel inträffade. Enkla anpassade felmeddelanden som ”Tyvärr upplever vi tekniska fel. Det tekniska teamet har kontaktats. Försök igen senare” kan användas istället för att visa de SQL-satser som orsakade felet.

Hackingaktivitet: Använd Havij för SQL Injection

I det här praktiska scenariot använder vi programmet Havij Advanced SQL Injection för att skanna en webbplats efter sårbarheter.

Obs: Havij är ett gammaldags, ounderhållet Windows verktyg — SQLMap ovan är den nuvarande standarden med öppen källkod.

Obs: Ditt antivirusprogram kan flagga det på grund av dess natur. Du bör lägga till det i undantagslistan eller pausa din antivirusprogram.

Bilden nedan visar huvudfönstret för Havij.

Huvudfönstret i Havij SQL-injektionsverktyg

Ovanstående verktyg kan användas för att bedöma sårbarheten hos en webbplats eller applikation.

Vanliga frågor

Endast med webbplatsägarens skriftliga tillstånd. Att testa en applikation som du inte äger är olagligt enligt lagar som den amerikanska lagen om datorbedrägeri och missbruk (Computer Fraud and Abuse Act). Bug-bounty-omfattningar definierar vad som är tillåtet.

Ja. I OWASP:s topp 10-lista: 2025 rankas injektion som nummer 05, och testning hittar fortfarande injektion i nästan alla applikationer. Med tusentals nya SQL-injektions-CVE:er per år är det fortfarande en ledande webbrisk.

MD5 är en snabb hash, inte kryptering, och angripare knäcker den snabbt med regnbågstabeller och GPU:er. Använd istället en långsam, saltad algoritm som bcrypt eller Argon2 för lösenord.

Alla databaser som efterfrågas via dynamiskt byggd SQL — MySQL, PostgreSQL, Microsoft SQL Server, Oracleoch SQLiteBristen ligger i hur applikationen sammanfogar användarinmatning till frågor, inte i databasmotorn.

AI-drivna brandväggar och skannrar lär sig normala trafikmönster och flaggar sedan avvikande indata, såsom injicerade villkor eller kommentarer, i realtid. Maskininlärningsmodeller upptäcker obfuskerade nyttolaster som fasta signaturer missar.

AI-assistenter som GitHub Copilot kan föreslå parametriserade frågor och inmatningsvalidering, men de reproducerar också osäkra mönster. Behandla varje förslag som ett utkast och para ihop det med en säkerhetsinterception och granskning.

SQL-injektion riktar sig mot databasen genom att injicera SQL i serversidiga frågor. Cross-site scripting riktar sig mot andra användare genom att injicera skript som körs i deras webbläsare. Den ena exponerar data; den andra kapar sessioner.

En ORM (objektrelationsmappare) bygger frågor från kodobjekt med parametrisering som standard, vilket förhindrar de flesta SQL-injektioner. Den är inte idiotsäker – råa frågor och osäkra metoder läcker fortfarande, så validering är fortfarande viktigt.

Sammanfatta detta inlägg med: