Sådan fungerer SQL Injection -angrebet

Indholdsfortegnelse

Hvis vi angiver sårbarhederne i webapplikationer, der har haft størst indflydelse på grund af sværhedsgraden, de kan forårsage, vil vi uden tvivl finde SQL -indsprøjtning. Dette sårbarhed det kan endda tillade angriberen at gå fra at angive databasens indhold til at få fuld adgang til serverenLad os se, hvad det består af.

Begrebet indsprøjtning, refererer til indsprøjtning eller tilføjelse af SQL -sætninger i en forespørgsel, som applikationen udfører til databasen, dette udføres ved at drage fordel af enhver datainput, som applikationen anmoder om direkte eller indirekte fra brugeren, refererer vi direkte til felter, for eksempel af formularer hvor brugeren indtaster visse data, kan det indirekte være parametre, der sendes via URL (GET). Formålet med at injicere SQL -sætninger i forespørgslen er at ændre logikken i forespørgslen eller det resultat, der vil blive returneret af databasen.

Dette er en typisk form, hvor der anmodes om et brugernavn og en adgangskode for at få adgang til et privat område. Koden på serversiden, der danner forespørgslen, ville være noget i retning af følgende:

 $ brugernavn = $ _POST ['brugernavn']; $ password = $ _POST ['password']; $ sql = "SELECT * FRA brugere WHERE brugernavn = '$ brugernavn' OG password = '$ password'"; 
Som vi kan se, gemmes først brugernavnet og adgangskoden, der er angivet i brugernavn- og adgangskodevariablerne, og derefter indgår disse værdier i forespørgslen, der sendes til databasen for at kontrollere, om brugeren findes. Antag, at i vores eksempel brugeren indtaster som brugernavn admin og adgangskode pass123, når formularen er sendt, vil den dannede forespørgsel være følgende:
 VÆLG * FRA brugere HVOR brugernavn = 'admin' OG adgangskode = 'pass123'
Som vi kan se, når inputdataene placeres, er disse mellem de enkelte citater for at repræsentere, at det er en tekststreng. Denne forespørgsel sendes til databasen og returnerer et resultat med brugerens data, hvis den findes, og adgang til det private område er tilladt, ellers returnerer det et tomt resultat, og adgang nægtes.

Som vi nævnte tidligere, SQL -indsprøjtning Den består af at tilføje SQL -kode til en forespørgsel, og denne formular tillader det gennem inputfelterne, så vi har et program, der er sårbart over for SQL -indsprøjtning.

Udnytter sårbarhed
Formålet med at udnytte denne sårbarhed er at få adgang til det private område uden at kende det korrekte brugernavn eller kodeord og at udnytte sårbarheden. Så hvad vi skal opnå er at injicere SQL -kode for at danne en forespørgsel, der returnerer et gyldigt resultat.

Lad os se, hvordan forespørgslen dannes, hvis vi injicerer følgende SQL -kode i adgangskodefeltet:

Når forespørgslen dannes, vil den være som følger:

 VÆLG * FRA brugere HVOR brugernavn = 'hacker' OG kodeord = '' eller 1 = 1 # '
Der skal lægges vægt på, at den indsatte kode er mellem de enkelte anførselstegn, der omslutter adgangskoden, det enkelte anførselstegn i begyndelsen af ​​den indsatte kode er ansvarlig for at udfylde det åbne anførselstegn i adgangskoden = 'del af forespørgsel, på denne måde får vi midlertidigt følgende forespørgsel:
 VÆLG * FRA brugere HVOR brugernavn = 'hacker' OG adgangskode = ''
Denne forespørgsel i øjeblikket vil ikke returnere resultater, da der ikke er en sådan bruger med disse legitimationsoplysninger, men lad os analysere resten af ​​den indsatte kode:
 eller 1 = 1 #
Dømme eller 1 = 1 ændrer radikalt forespørgslens logik, da vi som vi ved i en forespørgsel dannet af den betingede ELLER Det vil vende tilbage, når mindst et af de to udtryk er opfyldt, i vores tilfælde er det første udtryk brugernavn = 'hacker' OG adgangskode = '' , og den anden eller 1 = 1 , sidstnævnte er altid sandt, det vil sige 1 er altid lig med 1, fordi forespørgslen returnerer et gyldigt resultat.

Endelig er vi nødt til at slippe af med det anførselstegn, der lukker sætningen, til dette kan vi bruge de kommentarer, der bruges i SQL: #, - (dobbelt bindestreg), Åh /* */ . derfor er den komplette forespørgsel:

 VÆLG * FRA brugere HVOR brugernavn = 'hacker' OG kodeord = '' eller 1 = 1 # '
Alt efter # vil blive taget i betragtning som en kommentar og vil ikke være en del af forespørgslen.

For at få et gyldigt resultat er der mange andre variationer i koden, som vi kan indsætte, for eksempel:

wave wave wave wave wave