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...
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.
Användaren som utför denna attack kan göra en hel del, t.ex.:
Det enda han/hon behöver är en webbläsare och en internet uppkoppling. Och självklart lite kunskap om detta.
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å.
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'
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? =)
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.
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:
Listan är lång.
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.
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'
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.
http://sida.se/index.asp?id=10 UNION SELECT TOP 1 anvandarnamn FROM medlemmar--
http://sida.se/index.asp?id=10 UNION SELECT TOP 1 losenord FROM medlemmar where anvandarnamn='Shadi'--
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)