2008-01-22, 22:41
#1
Jag läste precis artikeln "Hålet bakom hackarvågen" (http://www.idg.se/2.1085/1.141415) och blir som vanligt lite irriterad på hur säkerhetsexperter och media lägger fram sql-injections. Direkt det pratas om sql-injections så är det nått otroligt enkelt som vilken person som helst kan göra. Nu vet jag iof inte hur attackerna som diskuteras i artikeln gick till men de behöver inte varit enkla därför att man har injekterat sql-kommandon till databasen.
"En sql injection betyder att utvecklaren bakom webbapplikationen har glömt – eller struntat i – att kontrollera den data som användaren kan skicka via formulär eller adressfältet."
Det finns absolut ingenting som säger att de har struntat eller glömt att filtrera datan. En sql-injection kan vara riktigt knepig. De kan beror på dålig filtrering som går att komma förbi. De kan bero på att att två funktioner efter varandra slår ut grundfiltreringen. Det kan bero på att i php, t.ex mbstring är påslagen på en funktion och inte på den andra. De kan bero på hur webservern tolkar inputdatat. Det kan bero på att folk förlitar sig på trasiga filter som t.ex mod_security. Det kan bero på olika charsets i webservern och databasen, de kan beror på de tusentals bypasses som finns tack vare unicode. I PHP kanske de använder ereg felaktigt? De kanske försöker typa input-datan och inte riktigt förstår vad som händer i bakgrunden? (http://www.secweb.se/en/blog/mysql-and-dangerous-cast/). Det finns så otroligt många bypasses, felkonfigurationer, trasiga funktioner osv och en injection behöver inte vara enkel bara därför att den kan vara enkel.
Jag har spelat tusentals wargames och jag minns en level jag aldrig kommer att glömma. Input-datan var riktigt bra filterad för endast \(\)a-z0-9\s, själva injectionen låg i en insert into a values(type int(1), hacker_input int(1)) och type och hacker_input var sammansatta till en annan tabell så det enda man kunde stoppa in som resultat var type (1-3) och hacker_input (1-9), målet var att ta fram en md5()-sträng som låg i en annan tabell som varchar(32). Enkelt? nej, men det gick.
"En sql injection betyder att utvecklaren bakom webbapplikationen har glömt – eller struntat i – att kontrollera den data som användaren kan skicka via formulär eller adressfältet."
Det finns absolut ingenting som säger att de har struntat eller glömt att filtrera datan. En sql-injection kan vara riktigt knepig. De kan beror på dålig filtrering som går att komma förbi. De kan bero på att att två funktioner efter varandra slår ut grundfiltreringen. Det kan bero på att i php, t.ex mbstring är påslagen på en funktion och inte på den andra. De kan bero på hur webservern tolkar inputdatat. Det kan bero på att folk förlitar sig på trasiga filter som t.ex mod_security. Det kan bero på olika charsets i webservern och databasen, de kan beror på de tusentals bypasses som finns tack vare unicode. I PHP kanske de använder ereg felaktigt? De kanske försöker typa input-datan och inte riktigt förstår vad som händer i bakgrunden? (http://www.secweb.se/en/blog/mysql-and-dangerous-cast/). Det finns så otroligt många bypasses, felkonfigurationer, trasiga funktioner osv och en injection behöver inte vara enkel bara därför att den kan vara enkel.
Jag har spelat tusentals wargames och jag minns en level jag aldrig kommer att glömma. Input-datan var riktigt bra filterad för endast \(\)a-z0-9\s, själva injectionen låg i en insert into a values(type int(1), hacker_input int(1)) och type och hacker_input var sammansatta till en annan tabell så det enda man kunde stoppa in som resultat var type (1-3) och hacker_input (1-9), målet var att ta fram en md5()-sträng som låg i en annan tabell som varchar(32). Enkelt? nej, men det gick.
