SQL-injektionsattacker utgör enorma risker för webbapplikationer som är beroende av en databasbackend för att generera dynamiskt innehåll. I denna typ av attack manipulerar hackare en webbapplikation i ett försök att injicera sina egna SQL-kommandon i de som utfärdas av databasen. För ett exempel, se artikel SQL Injection Attacks på databaser. I den här artikeln tar vi en titt på flera sätt att du kan testa dina webbprogram för att avgöra om de är sårbara för SQL-injektionsattacker.
Automatiserad SQL Injektionsskanning
En möjlighet är att använda en automatiserad sårbarhetsskanner för webbapplikationer, till exempel HPs WebInspect, IBMs AppScan eller Cenzic's Hailstorm. Dessa verktyg erbjuder alla enkla, automatiska sätt att analysera dina webbapplikationer för möjliga SQL-injektionsproblem. Men de är ganska dyra, och kostar upp till 25 000 dollar per sittplats.
Manuell SQL Injektionstest
Vad är en dålig applikationsutvecklare att göra? Du kan faktiskt köra några grundläggande tester för att utvärdera dina webbprogram för SQL Injection sårbarheter med ingenting mer än en webbläsare. För det första är ett försiktighetssök: de tester vi beskriver bara letar efter grundläggande SQL-injektionsfel. De kommer inte att upptäcka avancerade tekniker och är lite tråkiga att använda. Om du har råd med det, gå med en automatisk scanner. Men om du inte kan hantera den här prismärken är manuell provning ett utmärkt första steg.Det enklaste sättet att utvärdera om en applikation är sårbar är att experimentera med oskadliga injektionsattacker som inte kommer att skada din databas om de lyckas, men ger dig bevis för att du behöver åtgärda ett problem. Antag att du hade en enkel webbapplikation som tittar upp en person i en databas och ger kontaktinformation som ett resultat. Den sidan kan använda följande URL-format: http://myfakewebsite.com/directory.asp?lastname=chapple&firstname=mike
Vi kan anta att den här sidan utför en databasuppsökning med hjälp av en fråga som liknar följande: SELECT-telefon
FRÅN katalog
VAR SÄNDAMNAMN = 'Chapple' och förnamn = 'Mike'
Låt oss experimentera med det här lite. Med vårt antagande ovan kan vi göra en enkel ändring till webbadressen som testar för SQL-injektionsattacker: http://myfakewebsite.com/directory.asp?lastname=chapple&firstname=mike'+AND+(select+count(*)+from+fake)+%3e0+OR+'1'%3d'1
Om webbapplikationen inte har skyddats ordentligt mot SQL-injektion, sätter den helt enkelt det här falska förnamnet i SQL-deklarationen som körs ut mot databasen, vilket resulterar i: SELECT-telefon
FRÅN katalog
VAR SÄNDAMNAMN = 'Chapple' och förnamn = 'Mike'
OCH (välj räkning (*) från falska)> 0
ELLER '1' = '1'
Du märker att syntaxen ovan är lite annorlunda än den i den ursprungliga webbadressen. Vi tog befrielsen att konvertera den URL-kodade variabeln för sina ASCII-ekvivalenter för att göra det enklare att följa exemplet. Till exempel är% 3d URL-kodningen för '=' tecknet. Vi har också lagt till några radbrytningar för liknande ändamål. Testet kommer när du försöker ladda webbsidan med den URL som anges ovan. Om webbapplikationen är uppfört kommer den att radera de enskilda citaten från ingången innan den skickar förfrågan till databasen. Detta kommer helt enkelt resultera i en konstig lookup för någon med ett förnamn som innehåller en massa SQL. Du får se ett felmeddelande från programmet liknande det nedan: Fel: Ingen användare hittades med namn Mike + AND + (välj + räkna (*) + från + falska) +% 3e0 + ELLER +1% 3d1
Chapple!
Å andra sidan, om applikationen är sårbar för SQL-injektion, kommer den att överfoga uttalandet direkt till databasen, vilket resulterar i en av två möjligheter. Först, om servern har detaljerade felmeddelanden aktiverade (som du inte borde) ser du något så här: Microsoft OLE DB Provider för ODBC Drivers-felet '80040e37'
Microsoft ODBC SQL Server Driver SQL Server Ogiltigt objektnamn "falskt".
/directory.asp, rad 13
Å andra sidan, om din webbserver inte visar detaljerade felmeddelanden får du ett mer generiskt fel, till exempel: internt serverfelServern stötte på ett internt fel eller felkonfiguration och kunde inte fylla i din förfrågan.
Vänligen kontakta serverns administratör för att informera om den tid då felet inträffade och om allt du kanske har gjort som kan ha orsakat felet.
Mer information om detta fel kan vara tillgängligt i serverns felloggen.
Om du får något av de två fel ovan är din ansökan sårbar mot SQL-injektionsattack. Några steg som du kan vidta för att skydda dina applikationer mot SQL-injektionsattacker är: Utvärdering av resultaten