Forhindre SQL hack?
Jeg har lavet et loginsystem på min hjemmeside, men da jeg viste det til en kammerat, viste han mig noget..Han kunne "hacke" sig ind.. Han kunne logge ind, som den sidst oprettede bruger, UDEN brug af password og brugernavn. Han fik selvfølgelig lov! ;)
Men han viste mig dette, som er fundet på nettet:
-------------------------------------------------------
SQL Hacking
--------------------------------------
Mange webprogrammoerer taenker sig ikke om naar de skriver kode.
Mange firmaer ansaetter folk der er selvlaerte og som ikke har
nogen reel erfaring med virkelige systemer. Derfor opstaar der
til tider kode der ikke er gennemtaenkt. Jeg vil i denne artikel
gennemgaa hvordan man udnytter det mest ugennemtaenkte hul.
Mange dynamiske sider der er lavet i asp, php eller lign.
vil have et administrations modul. For at faa adgang til dette
modul skal man indtaste et brugernavn og en adgangskode.
"Hullet" opstaar hvis brugernavn og adgangskode sendes direkte
til databasen. Lad os tage et eksempel:
Vi forestiller os at der i html koden findes to input felter,
et der hedder username og et der hedder password. Strengen der
smides efter databasen vil kunne se saaledes ud (php-like):
sqlstring = SELECT * FROM user WHERE usernm='$username' AND passwd='$password';
forklaring: vaelg alt fra tabellen "user" hvor attributen "usernm"
er lig med det indtastede i feltet "username" og attributen "passwd"
er lig med det indtastede i feltet "password". Det hele laegges ind i
streng variablen sqlstring og den sendes herefter til databasen.
Det der saa kommer tilbage vil vaere en bruger, hvis brugernavnet
eksisterer og adgangskoden er korrekt. Det ser jo alt sammen fint ud.
Problemet opstaar saa hvis man istedet for brugernavn og adgangskode
indtaster gyldig SQL. Det forventes at alt mellem ' og ' er et
brugernavn. Hvis man starter feltet "username" med en ' afsluttes
attributen "usernm" med det samme og resten af linien fortolkes
som SQL. Det samme gaelder for feltet "password".
Nu skal vi saa overveje hvad vi kan goere for at overbevise
databasen om at vi skal have noget retur, for hvis vi ikke faar
noget retur tror script sprogret ikke at brugernavnet findes.
Vi starter vores brugernavn felt med ' og tilfoejer noget der
altid vil vaere sandt. Noget vi altid kan bruge, som altid vil vaere
sandt er ingenting er lig med ingenting, eller 0=0. Nu skal vi saa
bare lige soerge for at afslutte vores brugernavn felt med en '
for at terminere vores SQL saetning. Her henledes tankerne paa ''=''
der altid vil vaere sandt. For at faa den ud af "usernm='$username'" skal vi
som sagt starte og slutte med '. Derfor vil kunne noejes med
'or''='
der vil afslutte scriptets SQL og indsaette vores, som saa vil afsluttes
til sidst, da vi nemlig opnaar:
"usernm=''or''=''"
Det vil altid vaere sandt. Det samme gaelder for adgangskode feltet.
I de fleste tilfaelde vil den foerste bruger der bliver oprettet vaere
admin eller en tilsvarende bruger med mange rettigheder. Men hvis man
vil vaere sikker paa at vaere en bestemt bruger kan man bare indtaste det
som brugernavn. For adgangskoden vil stadig altid vaere rigtig, og man
vil faa adgang som den bruger man har indtastet.
Hvis du vil undgaa at dette sker for dig, saa kan man let omgaa problemet.
Hvis man anvender php kan man udnytte metoderne addSlashes og
addHtmlSpecialChars, der vil tilfoeje esc characters og lave vores SQL
streng om til \'or\'\'=\' og derfor vil det ikke vaere gyldig SQL laengere.
En anden maade at sikre sig paa kunne vaere at man ikke sender
adgangskoden til databasen, men kun brugernavnet, og saa selv tester
for om adgangskoden er korrekt med sit script. Naar man nu er igang
kunne man overveje at tjekke for hvor mange brugere databasen returnerer.
Returnerer den mindre end 1 findes brugernavnet ikke, og returnerer den
flere end 1 er der opstaaet en fejl, under forudsaetning af at brugernavnet
er unikt. Er der flere end 1 er det man overvejer om det er et
forsoeg paa et hack.
Nu hvor vi er i gang med sikkerheden skulle man overveje enten at
lave en ssl forbindelse mellem bruger og server, eller at have
brugernavnene i databasen krypteret og kryptere adgangkoden paa klient siden
med javascript og saa undersoege om de to krypterede adgangkoder er det samme.
---------------------------------------------------------
Hvordan undgår jeg dette sker for mig?!
Jeg har prøvet og prøvet, men kan stadig "logge ind", ved at hacke mig selv
Og hvis han kan gøre det ved mig, hvad forhindrer så en anden??
