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.

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.
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.
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.
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 = 1LIMIT 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.
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.
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 — ]
- 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.
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:
- SQLMap – http://sqlmap.org/
- jSQL-injektion – https://www.kali.org/tools/jsql/
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.
Ovanstående verktyg kan användas för att bedöma sårbarheten hos en webbplats eller applikation.








