Hur SQL Injection -attacken fungerar

Innehållsförteckning

Om vi ​​listar sårbarheterna i webbapplikationer som har haft störst effekt på grund av svårighetsgraden de kan orsaka, kommer vi utan tvekan att hitta SQL -injektion. Detta sårbarhet det kan till och med låta angriparen gå från att lista innehållet i databasen till att få full åtkomst till servernLåt oss se vad det består av.

Termen injektion, avser att injicera eller lägga till SQL -satser i en fråga som programmet kör till databasen, detta utförs med fördel av eventuell datainmatning som programmet begär direkt eller indirekt från användaren, vi hänvisar direkt till fält, till exempel formulär där användaren anger viss data kan det indirekt vara parametrar som skickas via URL (GET). Målet med att injicera SQL -satser i frågan är att modifiera logiken för frågan eller resultatet som kommer att returneras av databasen.

Detta är en typisk form där ett användarnamn och lösenord begärs för att komma åt ett privat område. Koden på serversidan som bildar frågan skulle vara ungefär följande:

 $ användarnamn = $ _POST ['användarnamn']; $ lösenord = $ _POST ['lösenord']; $ sql = "VÄLJ * FRÅN användare VAR användarnamn = '$ användarnamn' OCH lösenord = '$ lösenord'"; 
Som vi kan se lagras först användarnamnet och lösenordet som anges i användarnamn respektive lösenordsvariabler, sedan ingår dessa värden i frågan som kommer att skickas till databasen för att kontrollera om användaren finns. Anta att användaren i vårt exempel anger som användarnamnadministratör och lösenord pass123, när formuläret skickas kommer frågan som bildas att vara följande:
 VÄLJ * FRÅN användare VAR användarnamn = 'admin' OCH lösenord = 'pass123'
Som vi kan se, när inmatningsdata placeras, är dessa mellan de enskilda citattecken för att representera att det är en textsträng. Denna fråga skickas till databasen och returnerar ett resultat med data från användaren, om den finns, och åtkomst till det privata området kommer att tillåtas, annars returnerar det ett tomt resultat och åtkomst nekas.

Som vi nämnde tidigare, SQL -injektion Den består av att lägga till SQL -kod till en fråga, och det här formuläret tillåter det genom inmatningsfälten, så att vi har ett program som är sårbart för SQL -injektion.

Utnyttjar sårbarhet
Målet med att utnyttja denna sårbarhet är att få tillgång till det privata området utan att veta rätt användarnamn eller lösenord, och att utnyttja sårbarheten. Så det vi måste uppnå är att injicera SQL -kod för att bilda en fråga som returnerar ett giltigt resultat.

Låt oss se hur frågan bildas om vi injicerar följande SQL -kod i lösenordsfältet:

När frågan bildas kommer den att vara följande:

 VÄLJ * FRÅN användare VAR användarnamn = 'hacker' OCH lösenord = '' eller 1 = 1 # '
Viktig uppmärksamhet måste ägnas åt det faktum att den infogade koden ligger mellan de enda citattecken som innehåller lösenordet, det enda citattecknet i början av den infogade koden är ansvarigt för att fylla i det öppna citattecknet i lösenordet = 'del av fråga, på så sätt får vi tillfälligt följande fråga:
 VÄLJ * FRÅN användare VAR användarnamn = 'hacker' OCH lösenord = ''
Den här frågan ger för närvarande inga resultat eftersom det inte finns någon sådan användare med dessa referenser, men låt oss analysera resten av den infogade koden:
 eller 1 = 1 #
Mening eller 1 = 1 radikalt ändrar frågans logik, eftersom som vi vet i en fråga som bildas av villkorlig ELLER Det kommer att återgå till sanning när minst ett av de två uttrycken är uppfyllt, i vårt fall är det första uttrycket användarnamn = 'hacker' OCH lösenord = '' och den andra eller 1 = 1 , det senare är alltid sant, det vill säga 1 är alltid lika med 1, eftersom frågan returnerar ett giltigt resultat.

Slutligen måste vi bli av med citattecknet som stänger meningen, för detta kan vi använda kommentarerna som används i SQL: #, - (dubbelstreck), Nåväl /* */ . alltså den fullständiga frågan är:

 VÄLJ * FRÅN användare VAR användarnamn = 'hacker' OCH lösenord = '' eller 1 = 1 # '
Allt efter # kommer att beaktas som en kommentar och kommer inte att vara en del av frågan.

För att få ett giltigt resultat finns det många andra variationer i koden som vi kan infoga, till exempel:

wave wave wave wave wave