Blind SQL Injection Techniques Tutorial

Blind SQL Injection Techniques Tutorial

Hva er SQL -injeksjon?

SQL -injeksjon er en type databaseangrep der en angriper prøver å stjele informasjon fra en webapplikasjonsdatabase. Dette kan til og med resultere for ekstern kodeutførelse avhengig av webapplikasjonsmiljø og databaseversjon.

SQL -injeksjon skjer på grunn av dårlig desinfisering av brukerinngang. Hvis du tar innspill fra bruker på noe kodingsspråk (PHP, ASP.Nett) og send den direkte til serverens database uten å bruke noe filter på inngangen, dette kan føre til SQL -injeksjonssårbarhet.

Følgende PHP -kode er for eksempel sårbar for SQL -injeksjonsangrep fordi den direkte overfører brukerinngangen til databasen. Angriper kan lage sin egen ondsinnede database -spørring for å trekke ut data fra databasen.

// Brukerinput er lagret i ID -variabel
$ id = $ _get ['id'];
// Brukerinput er direkte utført i databasen
$ getid = "velg first_name, last_name fra brukere der user_id = '$ id'";
// I tilfelle feil eller suksess, returneres resultatene til brukeren
$ resultat = mysql_query ($ getid) eller dø ('
' . mysql_error () . '
');
$ num = mysql_numrows ($ resultat);

På den annen side er det gitt et sikkert kodeeksempel på slik kode som skal samhandle med databasen. Det tar brukerinngang og filtrerer eventuelle ondsinnede tegn fra den, og sender den deretter til databasen.

$ id = $ _get ['id'];
$ id = stripeslash ($ id);
$ id = mysql_real_escape_string ($ id);

Normal vs blind SQL -injeksjon

Normal SQL -injeksjon

I normal SQL -injeksjon, hvis en angriper prøver å sette et enkelt sitat (') som input, når dette enkelt sitatet blir utført i databasen, svarer databasen med en feil. Feilen er skrevet ut i angriperens nettleser.

Koden som er ansvarlig for denne feilen er

// Hvis databasen svarer med en feil, blir "eller dør ()" -funksjonen utført
For å skrive ut feilen
$ resultat = mysql_query ($ getid) eller dø ('
' . mysql_error () . '
');

I normal SQL -injeksjon kan angriper se feilresultatene og det er lett å identifisere og utnytte.

Blind SQL -injeksjon

Når det.

Backend -koden som er ansvarlig for dette er gitt nedenfor

$ resultat = mysql_query ($ getid); // fjernet 'eller dø' for å undertrykke mysql -feil

I blind SQL -injeksjon kan angriper ikke se de komplette resultatene, og derfor er denne typen SQLI vanskelig å identifisere og utnytte, men den har samme risikonivå som for normal SQLI.

Teknikker for å oppdage blind SQL -injeksjon

Mens normal SQL -injeksjon kan oppdages ved å sende enkelt sitat (') som inngang og undersøke utgangsfeilen, kan ikke blind SQL -injeksjon oppdages ved hjelp av denne teknikken fordi den ikke viser noen SQL -feil. Det er mange teknikker for å oppdage en blind SQL -injeksjon, noen av dem blir gitt som følger

Sann og falsk basert påvisning

En av egenskapene til databaser inkludert MySQL er den forskjellige oppførselen ved sanne og falske uttalelser. Selv om databasen ikke viser noen feil, kan vi bestemme oss for bruk av sanne og falske uttalelser. Tenk på følgende scenario,

Følgende side er sårbar for blind SQL -injeksjon, og gir den en ekte uttalelse vil vise alle oppføringer i databasen

1 'eller 1 = 1#

Å gi en falsk spørring som innspill vil ikke vise noen data.

1 'eller 1 = 2#

Selv websiden viser ingen feil, forskjellen mellom de to sidene forteller at spørsmålene våre blir utført i databasen.

Tidsbasert deteksjon

Det er en funksjon i databaser inkludert MySQL, MS-SQL og andre for forsinkelser. Vi kan bruke søvn () -funksjonen i spørringen vår, hvis databasens svar er treg, betyr det at spørringen vår utføres vellykket og websiden er sårbar for blind SQL -injeksjon.

1 'og sove (15)#

Det er en annen tidkrevende funksjon "Benchmark" som kan brukes til å utsette databasesvaret

1 'og benchmark (10000000, SHA1 (1337))#

Ovennevnte linje vil utføre SHA1 () -funksjonen 10000000 ganger i databasen, som vil legge til en betydelig forsinkelse som svar.

Tidsbasert blind SQL -injeksjon i andre databaser

MS SQL: Id = 1; vent for forsinkelse '0: 0: 10'-

Oracle SQL: Og [randnum] = dbms_pipe.Mottaks_message ('[randstr]', [sleeptime])

PostgreSql: Og [randnum] = (velg [randnum] fra pg_sleep ([sleeptime]))

Sqlite: Og [randnum] = som ('abcdefg', øvre (hex (randomblob ([sleeptime] 00000000/2)))))

Puttradere databaseinformasjon

Det første trinnet med å trekke ut databasen er å bestemme kolonnetall i databasen. Prøv deretter å finne sårbare kolonner for å trekke ut ytterligere data.

Blind SQL -injeksjon oppfører seg annerledes med forskjellige kolonnetall i "Order by" -spørsmål.

1 'Bestill med 1#

Ovennevnte uttalelse er sant fordi minst 1 kolonne alltid eksisterer i en database. Prøv nå med et veldig stort antall.

1 'Bestill med 10000#

Databasesvaret er annerledes enn den forrige. Prøv nå med 2 kolonner.

Uttalelsen fungerte, det betyr at databasen har to eller flere kolonner. Prøv nå med 3 kolonner.

1 'Bestill med 3#

Databasen har ikke sendt noe svar, det betyr at databasen bare har 2 kolonner. Nå skal vi prøve å dumpe listen over tabeller i databasen, vi bruker følgende spørsmål for det

1 'Union alle velger 1, group_concat (tabellnavn) fra informasjon_schema.
tabeller der tabell_schema = database ()#

Det er to tabeller i backend -databasen "Guestbook & Users". Tabellen "brukere" kan inneholde brukernavn og passord. For å trekke ut kolonnenavn fra tabellen, sett inn følgende spørsmål.

1 'Union alle velger 1, group_concat (kolonne_navn) fra informasjon_schema.
Kolonner der tabell_schema = database ()#

Nå har vi trukket ut kolonnenavn, dette inkluderer bruker- og passordkolonner. Disse kolonnene lagrer kundenes brukernavn og passord.

Nå vil vi prøve å trekke ut dataene ved å bruke følgende spørsmål

1 'Union velger alle 1, group_concat (bruker, passord) fra brukere#

Og det er slik du kan utnytte blind SQL -injeksjon uten å stole på feil. Utgangspassord hash mesteparten av tiden, som kan dekrypteres ved hjelp av verktøy som John the Ripper eller Hashcat.

Konklusjon:

Blind SQL -injeksjon er typen SQLI som ikke viser databasefeil eller svarer med en veldig generisk melding. Derfor er det veldig vanskelig å identifisere blind SQL -injeksjonssårbarhet på en webside. Når du er oppdaget, kan du utnytte den enkelt ved manuell eller automatisert prosess ved hjelp av SQLMAP.