Zelfstudie voor SQL-injectie: leren met voorbeelden

Wat is een SQL-injectie?

SQL-injectie is een aanval die dynamische SQL-instructies vergiftigt om bepaalde delen van de instructie te becommentariรซren of een voorwaarde toe te voegen die altijd waar zal zijn. Het maakt gebruik van de ontwerpfouten in slecht ontworpen webapplicaties om SQL-instructies te misbruiken om kwaadaardige SQL-code uit te voeren.

Gegevens zijn een van de meest vitale componenten van informatiesystemen. Database-aangedreven webapplicaties worden door de organisatie gebruikt om gegevens van klanten te verkrijgen. SQL is de afkorting voor Structured Query Language. Het wordt gebruikt om gegevens in de database op te halen en te manipuleren.

SQL Injection

Hoe werkt een SQL-injectieaanval?

De soorten aanvallen die kunnen worden uitgevoerd met behulp van SQL-injectie variรซren afhankelijk van het type database-engine. De aanval werkt op dynamische SQL-instructies. Een dynamische instructie is een instructie die tijdens runtime wordt gegenereerd met behulp van het wachtwoord van een webformulier of een URI-queryreeks.

Voorbeeld van SQL-injectie

Laten we eens kijken naar een eenvoudige webapplicatie met een inlogformulier. De code voor het HTML-formulier wordt hieronder weergegeven.

<form action=โ€˜index.phpโ€™ method="post">

<input type="email" name="email" required="required"/>

<input type="password" name="password"/>

<input type="checkbox" name="remember_me" value="Remember me"/>

<input type="submit" value="Submit"/>

</form>

HIER,

  • Het bovenstaande formulier accepteert het e-mailadres en het wachtwoord en verstuurt ze vervolgens naar een PHP bestand met de naam index.php.
  • Het heeft een optie om de loginsessie op te slaan in een cookie. We hebben dit afgeleid van het remember_me-selectievakje. Het gebruikt de post-methode om gegevens te verzenden. Dit betekent dat de waarden niet worden weergegeven in de URL.

Laten we aannemen dat de instructie aan de backend voor het controleren van de gebruikers-ID als volgt is

SELECT * FROM users WHERE email = $_POST['email'] AND password = md5($_POST['password']);

HIER,

  • De bovenstaande verklaring gebruikt de waarden van de $_POST[] direct op te stellen zonder ze te ontsmetten.
  • Het wachtwoord wordt gecodeerd met behulp van het MD5-algoritme.

We zullen een SQL-injectieaanval illustreren met behulp van sqlfiddle. Open de URL http://sqlfiddle.com/ in uw webbrowser. U krijgt het volgende venster.

Let op: u zult de SQL-instructies moeten schrijven

SQL-injectie werkt

Stap 1) Voer deze code in het linkerdeelvenster in

CREATE TABLE `users` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `email` VARCHAR(45) NULL,
  `password` VARCHAR(45) NULL,
  PRIMARY KEY (`id`));
  
  
insert into users (email,password) values ('m@m.com',md5('abc'));

Stap 2) Klik op Schema samenstellen

Stap 3) Voer deze code in het rechterdeelvenster in

select * from users;

Stap 4) Klik op Run SQL. U ziet het volgende resultaat

SQL-injectie werkt

Stel dat er gebruikersbenodigdheden zijn beheerder@admin.sys en 1234 als wachtwoord. De instructie die moet worden uitgevoerd op de database zou zijn

SELECT * FROM users WHERE email = 'admin@admin.sys' AND password = md5('1234');

De bovenstaande code kan worden misbruikt door het wachtwoordgedeelte uit te commentariรซren en een voorwaarde toe te voegen die altijd waar zal zijn. Stel dat een aanvaller de volgende invoer in het e-mailadresveld geeft.

xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ]

xxx voor het wachtwoord.

De gegenereerde dynamische instructie ziet er als volgt uit.

SELECT * FROM users WHERE email = 'xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ] AND password = md5('1234');

HIER,

  • xxx@xxx.xxx eindigt met een enkel aanhalingsteken dat het aanhalingsteken van de tekenreeks voltooit
  • OR 1 = 1 LIMIT 1 is een voorwaarde die altijd waar zal zijn en die de geretourneerde resultaten beperkt tot slechts รฉรฉn record.
  • โ€” ' AND โ€ฆ is een SQL-opmerking die het wachtwoordgedeelte elimineert.

Kopieer de bovenstaande SQL-instructie en plak deze erin SQL FiddleVoer SQL-tekstvak uit zoals hieronder weergegeven

SQL-injectie werkt

Hackactiviteit: SQL injecteert een webapplicatie

We hebben een eenvoudige webapplicatie op http://www.techpanda.org/ dat alleen voor demonstratiedoeleinden kwetsbaar is voor SQL-injectieaanvallen. De bovenstaande HTML-formuliercode is afkomstig van de inlogpagina. De applicatie biedt basisbeveiliging, zoals het opschonen van het e-mailveld. Dit betekent dat onze bovenstaande code niet kan worden gebruikt om de inlog te omzeilen.

Om dat te omzeilen, kunnen we in plaats daarvan het wachtwoordveld exploiteren. In onderstaand schema zijn de stappen weergegeven die u moet volgen

SQL Injecteer een webapplicatie

Stel dat een aanvaller de volgende invoer geeft

  • Stap 1: Voer xxx@xxx.xxx in als e-mailadres
  • Stap 2: Voer xxx') in OF 1 = 1 โ€” ]

SQL Injecteer een webapplicatie

  • Klik op de knop Verzenden
  • U wordt doorverwezen naar het dashboard

De gegenereerde SQL-instructie ziet er als volgt uit

SELECT * FROM users WHERE email = 'xxx@xxx.xxx' AND password = md5('xxx') OR 1 = 1 -- ]');

Het onderstaande diagram illustreert dat de instructie is gegenereerd.

SQL Injecteer een webapplicatie

HIER,

  • De verklaring gaat er op intelligente wijze van uit dat MD5-codering wordt gebruikt
  • Voltooit het enkele aanhalingsteken en het afsluitende haakje
  • Voegt een voorwaarde toe aan de bewering die altijd waar zal zijn

Over het algemeen probeert een succesvolle SQL-injectieaanval een aantal verschillende technieken uit, zoals hierboven gedemonstreerd, om een โ€‹โ€‹succesvolle aanval uit te voeren.

Andere typen SQL-injectieaanvallen

SQL-injecties kunnen meer kwaad doen dan alleen de login-algoritmen doorgeven. Enkele van de aanvallen zijn:

  • Gegevens verwijderen
  • Gegevens bijwerken
  • Gegevens invoegen
  • Het uitvoeren van opdrachten op de server die kwaadaardige programma's zoals Trojaanse paarden kunnen downloaden en installeren
  • Het exporteren van waardevolle gegevens zoals creditcardgegevens, e-mail en wachtwoorden naar de externe server van de aanvaller
  • Gebruikerslogingegevens etc. ophalen
  • SQL-injectie op basis van cookies
  • Foutgebaseerde SQL-injectie
  • Blinde SQL-injectie

De bovenstaande lijst is niet uitputtend; het geeft je gewoon een idee van wat SQL Injection is

Automatiseringstools voor SQL-injectie

In het bovenstaande voorbeeld hebben we handmatige aanvalstechnieken gebruikt, gebaseerd op onze uitgebreide kennis van SQL. Er zijn geautomatiseerde tools die u kunnen helpen de aanvallen efficiรซnter en binnen de kortst mogelijke tijd uit te voeren. Deze hulpmiddelen omvatten

Hoe u SQL-injectieaanvallen kunt voorkomen

Een organisatie kan het volgende beleid hanteren om zichzelf te beschermen tegen SQL-injectieaanvallen.

  • Gebruikersinvoer mag nooit worden vertrouwd โ€“ Het moet altijd worden opgeschoond voordat het wordt gebruikt in dynamische SQL-instructies.
  • Opgeslagen procedures - deze kunnen de SQL-instructies inkapselen en alle invoer als parameters behandelen.
  • Opgestelde verklaringen โ€“ bereidde instructies voor om te werken door eerst de SQL-instructie te maken en vervolgens alle ingediende gebruikersgegevens als parameters te behandelen. Dit heeft geen invloed op de syntaxis van de SQL-instructie.
  • Normale uitdrukkingen - deze kunnen worden gebruikt om potentieel schadelijke code te detecteren en deze te verwijderen voordat de SQL-instructies worden uitgevoerd.
  • Toegangsrechten voor gebruikers van databaseverbinding โ€“ alleen de noodzakelijke toegangsrechten mogen worden gegeven aan de gebruikte accounts verbinding maken met de databank. Dit kan ertoe bijdragen dat de prestaties van de SQL-instructies op de server worden verminderd.
  • Foutmeldingen - deze mogen geen gevoelige informatie onthullen en waar precies een fout is opgetreden. Eenvoudige aangepaste foutmeldingen zoals "Sorry, we ondervinden technische fouten. Het technische team is gecontacteerd. Probeer het later opnieuw" kunnen worden gebruikt in plaats van de SQL-instructies weer te geven die de fout hebben veroorzaakt.

Hackactiviteit: gebruik Havij voor SQL-injectie

In dit praktische scenario gaan we het Havij Advanced SQL Injection-programma gebruiken om een โ€‹โ€‹website te scannen op kwetsbaarheden.

Let op: jouw antivirusprogramma kan het markeren vanwege zijn aard. U moet het toevoegen aan de lijst met uitsluitingen of uw antivirussoftware pauzeren.

De onderstaande afbeelding toont het hoofdvenster voor Havij

Gebruik Havij voor SQL-injectie

Bovenstaand hulpmiddel kan worden gebruikt om de kwetsbaarheid van een website/applicatie te beoordelen.

Samenvatting

  • SQL-injectie is een aanvalstype dat misbruik maakt van slechte SQL-instructies
  • SQL-injectie kan worden gebruikt om aanmeldalgoritmen te omzeilen en gegevens op te halen, in te voegen, bij te werken en te verwijderen.
  • SQL-injectietools omvatten SQLMap, SQLPingen SQLSmack, enz.
  • Een goed beveiligingsbeleid bij het schrijven van een SQL-instructie kan SQL-injectieaanvallen helpen verminderen.

Vat dit bericht samen met: