SQL Injection Tutorial: Hur man lär sig med exempel

Vad är en SQL-injektion?

SQL Injection är en attack som förgiftar dynamiska SQL-satser för att kommentera vissa delar av satsen eller lägga till ett villkor som alltid kommer att vara sant. Den drar fördel av designbristerna i dåligt designade webbapplikationer för att utnyttja SQL-satser för att exekvera skadlig SQL-kod.

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

SQL Injection

Hur fungerar SQL Injection Attack?

Vilka 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 parameterlösenord från ett webbformulär eller en URI-frågesträng.

Exempel på SQL-injektion

Låt oss överväga 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,

  • Ovanstående formulär accepterar e-postadressen och lösenordet skickar dem sedan till en PHP fil med namnet index.php.
  • Den har en möjlighet att lagra inloggningssessionen i en cookie. Vi har härlett detta från kryssrutan remember_me. Den använder postmetoden för att skicka in data. Det betyder att värdena inte visas i URL:en.

Låt oss anta att uttalandet i backend för kontroll av användar-ID är som följer

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

HÄR,

  • Ovanstående uttalande använder värdena för $_POST[] array direkt utan att desinficera dem.
  • Lösenordet är krypterat med MD5-algoritmen.

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

Notera: du måste skriva SQL-satserna

SQL-injektion fungerar

Steg 1) Ange denna kod 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å Bygg schema

Steg 3) Ange denna kod i den högra rutan

select * from users;

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

SQL-injektion fungerar

Antag användartillbehör admin@admin.sys och 1234 som lösenord. Uttalandet som ska köras mot databasen skulle vara

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

Ovanstående kod kan utnyttjas genom att kommentera lösenordsdelen och lägga till ett villkor som alltid kommer att vara sant. Låt oss anta att en angripare tillhandahåller följande input 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 slutar med ett enda citat som kompletterar strängcitatet
  • 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 SQL-satsen ovan och klistra in den SQL FiddleKör SQL-textrutan som visas nedan

SQL-injektion fungerar

Hackingaktivitet: SQL Injicera en webbapplikation

Vi har en enkel webbapplikation på http://www.techpanda.org/ som är sårbart för SQL Injection-attacker endast i demonstrationssyfte. HTML-formulärkoden ovan är hämtad från inloggningssidan. Applikationen ger grundläggande säkerhet 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 kan vi istället utnyttja lösenordsfältet. Diagrammet nedan visar stegen som du måste följa

SQL Injicera en webbapplikation

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

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

SQL Injicera en webbapplikation

  • Klicka på knappen Skicka
  • Du kommer att hänvisas till instrumentpanelen

Den genererade SQL-satsen blir som följer

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

Diagrammet nedan illustrerar påståendet som har skapats.

SQL Injicera en webbapplikation

HÄR,

  • Uttalandet förutsätter intelligent att md5-kryptering används
  • Kompletterar det enda citatet och avslutande parentes
  • Bifogar ett villkor till påståendet som alltid kommer att vara sant

I allmänhet försöker en framgångsrik SQL-injektionsattack ett antal olika tekniker som de som visas ovan för att utföra en framgångsrik attack.

Andra typer av SQL Injection Attack

SQL-injektioner kan göra mer skada än att bara skicka 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
  • Få användarinloggningsuppgifter etc
  • SQL-injektion baserad på cookies
  • Felbaserad SQL-injektion
  • Blind SQL-injektion

Listan ovan är inte uttömmande; det ger dig bara en uppfattning om vad SQL Injection

Automationsverktyg för SQL-injektion

I exemplet ovan använde vi manuella attacktekniker baserade på vår stora 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ändarinput ska aldrig lita på – Det måste alltid saneras innan det används i dynamiska SQL-satser.
  • Lagrade procedurer – dessa kan kapsla in SQL-satserna och behandla all indata som parametrar.
  • Förberedda uttalanden – förberedde satser för att fungera genom att först skapa SQL-satsen och sedan behandla alla inlämnade användardata som parametrar. Detta har ingen effekt på syntaxen för SQL-satsen.
  • Vanliga uttryck - dessa kan användas för att upptäcka potentiell skadlig kod och ta bort den innan SQL-satserna körs.
  • Användaråtkomsträttigheter för databasanslutning – endast nödvändiga åtkomsträttigheter bör ges till konton som används för ansluta till databasen. Detta kan hjälpa till att minska vad SQL-satserna kan utföra på servern.
  • Felmeddelanden - dessa ska inte avslöja känslig information och var exakt ett fel inträffade. Enkla anpassade felmeddelanden som "Tyvärr, vi upplever tekniska fel. Det tekniska teamet har kontaktats. Please try again later” kan användas istället för att visa SQL-satserna som orsakade felet.

Hackingaktivitet: Använd Havij för SQL Injection

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

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

Bilden nedan visar huvudfönstret för Havij

Använd Havij för SQL Injection

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

Sammanfattning

  • SQL Injection är en attacktyp som utnyttjar dåliga SQL-satser
  • SQL-injektion kan användas för att kringgå inloggningsalgoritmer, hämta, infoga och uppdatera och radera data.
  • SQL-injektionsverktyg inkluderar SQLMap, SQLPing och SQLSmack, etc.
  • En bra säkerhetspolicy när du skriver SQL-sats kan hjälpa till att minska SQL-injektionsattacker.