Panelen



Forumnavigering
Senast inloggade
RSS
Sponsorer
Artiklar > Säkerhet

SQL Injection - Information, skydd och exempel

Jag ska försöka att förklara för er vad SQL Injection är för något och hur man kan förhindra det. Jag kommer att ta upp exempel på hur man använder det och berätta om vilka skador det kan orsaka.
Jag kommer att koncentrera mig på ASP och MySQL, men principen är den samma för resterande databaser, det enda man behöver tänka på är vilka tecken man ska skydda sig mot.

Nu kör vi... 

Vad är SQL Injection?

Om du har goda engelska kunskaper så förstår du från att läsa orden SQL Injection att det handlar om att injicera SQL, dvs att man skickar in SQL kommandon i databasen genom hemsidor.
Tänk när du har ett inloggningsformulär, användaren får skriva in uppgifterna och sedan genereras en SQL rad som ska kontrollera att det kontot finns, eller hur? Det man kan göra när man använder SQL Injection är att man skriver SQL kommandon i forumuläret som kommer i det här fallet att utföras av ditt skript, för du har inte skyddat dig mot det.

Vad kan attacken göra?

Användaren som utför denna attack kan göra en hel del, t.ex.:

  • Hämta ut information från databasen
  • Radera hela databasen
  • Ändra på information i databasen
  • ...och mycket mer! 

Vad behöver den personen för att kunna utföra detta?

Det enda han/hon behöver är en webbläsare och en internet uppkoppling. Och självklart lite kunskap om detta.

Oj, men vad borde jag göra då, vad borde jag "hålla ögonen på"?

Först och främst bör du lära dig hur SQL fungerar, något som är ganska "enkelt". Jag menar inte att du ska lära dig alla kommandon och så, utan snarare hur vissa tecken används och till vad de används. Jag kommer att nämna dessa tecken sen.

Attackerna kan komma från olika håll och kanter, t.ex. inloggningsformulär, sökformulär, länkar med data...ja, på alla sätt där du skickar data som ska bearbetas i en SQL rad.

<form name="login" method="post" action="LoggaIn.asp">
    <input type="text" name="user" />
    <input type="password" name="pass" />
    <input type="submit" name="submit" value="logga in" />
</form>

Varje gång du ser ett formulär så ska det hela tiden "tändas en lampa" i huvudet på dig: "SQL Injection!!"
Allt som har med formulär att göra kan vara en hot, se över det!

strSQLInfo = Request.QueryString("user")

Ovanstånde kod är också en potentiell väg för SQL injection, se till att skydda alla data som ska bearbetas av databasen (SQL raden). Alla länkar som innehåller parametrar ska man hålla ett öga på.

Okey, jag vill testa min sida, hur gör jag?

Jag ska ge dig ett exempel på hur du kan "attackera" din egen sida.
Säg att du har en inloggningsruta där du ska skriva in ditt användarnamn och lösenord för att logga in. Om uppgifterna är sanna så loggas man in eller hur? Det brukar se ut som följande:

user = Request.Form("user")
pass = Request.Form("pass")

SELECT * FROM medlemmar WHERE anvandare = '" & user & "' AND losenord = '" & pass & "'

Så om vi använder Shadi som användarnamn och Domat som lösenord så blir ju SQL raden så här:

 SELECT * FROM medlemmar WHERE anvandare = 'Shadi' AND losenord = 'Domat'

Men om du skriver följande i formuläret... 

Pass:  Domat
User:  Shadi' OR 4=4--

Så kommer du förmodligen att loggas in utan att behöva korrekta uppgifter. Varför? Jo för att SQL raden har precis ändrats. Titta nedan:

SELECT * FROM medlemmar WHERE anvandare = 'Shadi' OR 4=4--' AND losenord = 'Domat'

Hmm...vad hände nu då?

Jag ska förklara för dig vad som händer.
Vi ska ju kontrollera att uppgifterna stämmer eller hur? Det vi gjorde är att vi skickade in data som var ' OR 4=4-- för att sabba det hela. Det SQL raden kommer att göra i det här fallet är att kontrollera ifall det finns ett konto med användarnamnet Shadi ELLER INTE! Alltså antingen finns det användarnamnet (vilket är ju OK) eller så är det OK också att logga in ifall 4=4.  FÖrstår du "smidigheten" i det hela? =)

Men varför --?

Som du har kanske märkt så lade jag till två bindestreck (--) efter 4=4, vet du varför? Dessa två streck säger åt SQL raden att skippa all SQL kod som är efter. Så i detta fall kommer den inte att kontrollera ifall lösenordet finns.

Är det bara sånna värden som man kan använda?

Nej, allt beror på hur SQL raden är uppbyggd, vissa jämför strängar medan andra tal eller datum osv. Så man får testa sig fram eller lista ut vilken typ av SQL injection man ska använda för att komma åt databasen. Men för dig som programmerare är det nästan ointressant så länge du skyddar dig mot SQL injection, för då kan attackeraren försöka hur mycket han/hon vill, de kommer inte att lyckas om du gjort rätt!

Men för att ge exempel på några andra metoder:

  • ' OR 1=1--
  • '' OR  1=1--
  • ') OR ('a'='a'
  • " OR "a" = "a

Listan är lång.

Hur skyddar jag mig?

Olika databaser kräver att man skyddar sig mot olika tecken. Jag ska nedan visa dig några exempel på skyddsmetoder.
Ett enkelt sätt är att ha en funktion som hela tiden skyddar dig mot de "farliga" tecknena. Det här exemplet gäller MySQL databaser:

Function antiSqlInjection(strSQL)
    strNewSql = Replace(strSQL, "'", "''")
    strNewSql = Replace(strNewSql, "\", "\\")
    antiSqlInjection = strNewSql
End Function

Ovanstående funktion gör att den tar "enkelfnutten" ( ' ) och gör om den till två st enkelfnuttar ( '' ), det samma gör den med "backslash" ( \ ) som blir till ( \\ ). Du kan ju även göra att den tar bort dessa tecken helt och hållet, det är upp till dig.

Vad kan man göra med \?

Exemplet nedan säger allt:

Pass: Domat
User:  \''; DROP TABLE medlemmar; --

Då blir SQL raden så här:

SELECT * FROM medlemmar WHERE anvandare = '\''; DROP TABLE medlemmar--' AND 'Domat'

Exempel

Artikeln är egentligen "slut" nu, men jag tänker visa er några sätt att använda SQL Injection på. Kom ihåg att detta är för inlärningssyfte så du ska få dig en uppfattning om hur detta fungerar samt hur du kan skydda dig. Använd inte detta i skadliga syften. Jag tar inte på mig ansvaret för någon annans aktioner.

  1. Hämta ut användarnamnet från tabellen:

     http://sida.se/index.asp?id=10 UNION SELECT TOP 1 anvandarnamn FROM medlemmar--


    Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
    [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'Shadi' to a column of data type int.
    /index.asp, line #
  2. Ta reda på lösenordet:

     http://sida.se/index.asp?id=10 UNION SELECT TOP 1 losenord FROM medlemmar where anvandarnamn='Shadi'--


    Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
    [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'Domat' to a column of data type int.
    /index.asp, line #

Slutord

Met än så behöver jag nog inte säga. Ta till er detta, för det är mycket viktigt!
Med reservation för stavfel.

Skapades: 2007-12-14 16:35:39
Skribent: Shadi
Lästs 11308 gånger
Betyg: 10 (totalt 6 röster)

Kommentarer

chrillemeter sa den 14 december 2007 kl 16:53:
Ett annat sätt att skydda sig är att använda stored Procedures (Lagrade procedurer), då behöver man inte ta bort farliga tecken. I en stored Procedure kan man inte ändra en SQL kod. Det är parametrar som skickas in.

Man är inte hellt skyddad. Om man använder Prepared statements i den lagrade proceduren så kan man förändra SQL:en. Men inte annars.

Så om man håler sig till fördefinierade SQL:er i lagrade procedurer så är man säker. mot SQL Injections.
Shadi sa den 14 december 2007 kl 17:50:
Precis som ice säger
Det är också det som jag kommer att gå igenom i min nästa SQL injections artikel =) Sitter o filar på den =)
Shadi sa den 14 december 2007 kl 17:57:
Jag märkte nu att du har redan skrivit en artikel om det =)
http://www.aspkoll.se/ArticlesRead.asp?id=41
chrillemeter sa den 14 december 2007 kl 18:14:
Fast jag går bara igenom vad en Stored procedure är och hur man skapar en.
Jag nämer ingenstans att den skyffdar mot SQL Injections.
Shadi sa den 14 december 2007 kl 18:18:
Jag vet, men eftersom du verkar skriva en serie så väntar jag med att skriva en ny artikel. Får vänta till dina nästa artiklar.
chrillemeter sa den 14 december 2007 kl 19:04:
Funderat på att skriva en större artikel om Stored Procedures, där jag gör en inloggningsfunktion.

Har inte börjat på den än, men ska göra det snart hade jag tänkt.
Roosweb sa den 14 december 2007 kl 20:57:
Intressant att ha en sån här artikel här, bra skrivet Shadi.
nabbiii sa den 15 december 2007 kl 03:13:
fett nice!! perfekt!
Pettersoft sa den 6 april 2008 kl 10:28:
Principerna är likadan i php.
Exempel:
<?php
function protect($string){
$string = strip_tags($string);
$string = mysql_real_escape_string($string);
$string = addslashes($string);
}
?>
}
© Copyright 2007-2009 Shadi Domat | Version 3.0 | Sidkarta | Policy