Zoeken…
Invoering
SQL-injectie is een poging om toegang te krijgen tot de databasetabellen van een website door SQL in een formulierveld te injecteren. Als een webserver niet beschermt tegen SQL-injectieaanvallen, kan een hacker de database misleiden om de extra SQL-code uit te voeren. Door hun eigen SQL-code uit te voeren, kunnen hackers hun accounttoegang upgraden, de privéinformatie van iemand anders bekijken of andere wijzigingen in de database aanbrengen.
Voorbeeld van SQL-injectie
Ervan uitgaande dat de oproep naar de inloghandler van uw webapplicatie er als volgt uitziet:
https://somepage.com/ajax/login.ashx?username=admin&password=123
Nu lees je in login.ashx deze waarden:
strUserName = getHttpsRequestParameterString("username");
strPassword = getHttpsRequestParameterString("password");
en doorzoek uw database om te bepalen of er een gebruiker met dat wachtwoord bestaat.
Dus u maakt een SQL-queryreeks:
txtSQL = "SELECT * FROM Users WHERE username = '" + strUserName + "' AND password = '"+ strPassword +"'";
Dit werkt als de gebruikersnaam en het wachtwoord geen citaat bevatten.
Als een van de parameters echter een citaat bevat, ziet de SQL die naar de database wordt verzonden er als volgt uit:
-- strUserName = "d'Alambert";
txtSQL = "SELECT * FROM Users WHERE username = 'd'Alambert' AND password = '123'";
Dit resulteert in een syntaxisfout, omdat het citaat na de d
in d'Alambert
de SQL-string beëindigt.
U kunt dit corrigeren door aanhalingstekens in gebruikersnaam en wachtwoord te ontsnappen, bijvoorbeeld:
strUserName = strUserName.Replace("'", "''");
strPassword = strPassword.Replace("'", "''");
Het is echter geschikter om parameters te gebruiken:
cmd.CommandText = "SELECT * FROM Users WHERE username = @username AND password = @password";
cmd.Parameters.Add("@username", strUserName);
cmd.Parameters.Add("@password", strPassword);
Als u geen parameters gebruikt en vergeet om citaat in een van de waarden te vervangen, kan een kwaadwillende gebruiker (ook wel hacker genoemd) dit gebruiken om SQL-opdrachten in uw database uit te voeren.
Als een aanvaller bijvoorbeeld slecht is, stelt hij / zij het wachtwoord in op
lol'; DROP DATABASE master; --
en dan ziet de SQL er als volgt uit:
"SELECT * FROM Users WHERE username = 'somebody' AND password = 'lol'; DROP DATABASE master; --'";
Helaas voor u is dit geldige SQL en de DB zal dit uitvoeren!
Dit type exploit wordt een SQL-injectie genoemd.
Er zijn veel andere dingen die een kwaadwillende gebruiker zou kunnen doen, zoals het stelen van het e-mailadres van elke gebruiker, het wachtwoord van iedereen stelen, creditcardnummers stelen, elke hoeveelheid gegevens in uw database stelen, enz.
Dit is waarom je altijd aan je touwtjes moet ontsnappen.
En het feit dat je dit steevast vroeg of laat vergeet te doen, is precies waarom je parameters moet gebruiken. Want als u parameters gebruikt, dan zal uw programmeertaalframework alle noodzakelijke ontsnappingen voor u doen.
eenvoudig injectiemonster
Als de SQL-instructie als volgt is opgebouwd:
SQL = "SELECT * FROM Users WHERE username = '" + user + "' AND password ='" + pw + "'";
db.execute(SQL);
Dan kan een hacker uw gegevens ophalen door een wachtwoord op te geven zoals pw' or '1'='1
; de resulterende SQL-instructie is:
SELECT * FROM Users WHERE username = 'somebody' AND password ='pw' or '1'='1'
Deze passeert de wachtwoordcontrole voor alle rijen in de tabel Users
omdat '1'='1'
altijd waar is.
Gebruik SQL-parameters om dit te voorkomen:
SQL = "SELECT * FROM Users WHERE username = ? AND password = ?";
db.execute(SQL, [user, pw]);