Als we de kwetsbaarheden in webapplicaties opsommen die de grootste impact hebben gehad vanwege de mate van ernst die ze kunnen veroorzaken, zullen we ongetwijfeld de SQL injectie. Deze kwetsbaarheid het kan de aanvaller zelfs toestaan om van het weergeven van de inhoud van de database naar volledige toegang tot de server te gaanLaten we eens kijken waar het uit bestaat.
De voorwaarde injectie, verwijst naar het injecteren of toevoegen van SQL-instructies in een query die de applicatie uitvoert naar de database, dit wordt uitgevoerd door gebruik te maken van alle gegevensinvoer die de applicatie direct of indirect van de gebruiker vraagt, we verwijzen rechtstreeks naar velden, bijvoorbeeld van formulieren waar de gebruiker bepaalde gegevens invoert, kunnen dit indirect parameters zijn die via URL (GET) worden doorgegeven. Het doel van het injecteren van SQL-instructies in de query is om de logica van de query of het resultaat dat door de database wordt geretourneerd, te wijzigen.
Dit is een typische vorm waarbij een gebruikersnaam en wachtwoord worden gevraagd om toegang te krijgen tot een privégedeelte. De server-side code die de query vormt, zou er ongeveer als volgt uit kunnen zien:
$ gebruikersnaam = $ _POST ['gebruikersnaam']; $ wachtwoord = $ _POST ['wachtwoord']; $ sql = "SELECTEER * FROM gebruikers WHERE gebruikersnaam = '$ gebruikersnaam' EN wachtwoord = '$ wachtwoord'";Zoals we kunnen zien, worden eerst de gebruikersnaam en het wachtwoord die zijn ingevoerd in de gebruikersnaam- en wachtwoordvariabelen respectievelijk opgeslagen, waarna deze waarden worden opgenomen in de query die naar de database wordt verzonden om te controleren of de gebruiker bestaat. Stel dat in ons voorbeeld de gebruiker invoert als gebruikersnaam admin en wachtwoord pas123, wanneer het formulier wordt verzonden, zal de gevormde vraag de volgende zijn:
SELECT * FROM gebruikers WHERE gebruikersnaam = 'admin' EN wachtwoord = 'pass123'Zoals we kunnen zien, staan deze tussen de enkele aanhalingstekens wanneer de invoergegevens worden geplaatst om aan te geven dat het een tekenreeks is. Deze query wordt naar de database verzonden en retourneert een resultaat met de gegevens van de gebruiker, als deze bestaat, en toegang tot het privégedeelte wordt toegestaan, anders wordt een leeg resultaat geretourneerd en wordt de toegang geweigerd.
Zoals we eerder vermeldden, SQL injectie Het bestaat uit het toevoegen van SQL-code aan een query, en dit formulier laat het toe door de invoervelden, zodat we een applicatie hebben die kwetsbaar is voor SQL-injectie.
Kwetsbaarheid uitbuiten
Het doel van het misbruiken van dit beveiligingslek is om toegang te krijgen tot het privégedeelte zonder de juiste gebruikersnaam of het juiste wachtwoord te kennen, en om het beveiligingslek te misbruiken. Dus wat we moeten bereiken is om SQL-code te injecteren om een query te vormen die een geldig resultaat retourneert.
Laten we eens kijken hoe de query wordt gevormd als we de volgende SQL-code in het wachtwoordveld injecteren:
Wanneer de query wordt gevormd, ziet deze er als volgt uit:
SELECTEER * FROM gebruikers WHERE gebruikersnaam = 'hacker' EN wachtwoord = '' of 1 = 1 # 'Belangrijke aandacht moet worden besteed aan het feit dat de ingevoegde code tussen de enkele aanhalingstekens staat die het wachtwoord omsluiten, het enkele aanhalingsteken aan het begin van de ingevoegde code is verantwoordelijk voor het invullen van het open aanhalingsteken in het wachtwoord = 'part of the query, op deze manier krijgen we tijdelijk de volgende query:
SELECT * FROM gebruikers WHERE gebruikersnaam = 'hacker' EN wachtwoord = ''Deze query levert op dit moment geen resultaten op, omdat er geen dergelijke gebruiker is met deze inloggegevens, maar laten we de rest van de ingevoegde code analyseren:
of 1 = 1 #Zin of 1 = 1 verandert de logica van de query radicaal, want zoals we weten in een query die wordt gevormd door de voorwaardelijke OF Het zal true retourneren wanneer ten minste één van de twee expressies is vervuld, in ons geval is de eerste expressie gebruikersnaam = 'hacker' EN wachtwoord = '' , en de tweede of 1 = 1 , de laatste is altijd waar, dat wil zeggen, 1 is altijd gelijk aan 1, omdat de query een geldig resultaat oplevert.
Ten slotte moeten we het aanhalingsteken dat de zin afsluit, verwijderen, hiervoor kunnen we de opmerkingen gebruiken in SQL: #, - (dubbel streepje), O goed /* */ . dus de volledige vraag is:
SELECTEER * FROM gebruikers WHERE gebruikersnaam = 'hacker' EN wachtwoord = '' of 1 = 1 # 'Alles na de # wordt als commentaar in aanmerking genomen en maakt geen deel uit van de zoekopdracht.
Om een geldig resultaat te krijgen zijn er veel andere variaties in de code die we kunnen invoegen, bijvoorbeeld: