Soorten SQL Injection TuT - Netherland

Alle tutorials m.b.t hacken.
Dit forum wordt gemodereerd door: Moderator
Plaats reactie
CyberRat
Site Admin
Berichten: 7
Lid geworden op: 09-08-2013 09:19

Soorten SQL Injection TuT - Netherland

Bericht door CyberRat » 09-08-2013 10:23

Soorten SQL-injections

In dit hoofdstuk worden de verschillende soorten SQL-injections uitgelegd en toegelicht
Comments

Bij veel programmeertalen wordt de mogelijkheid geboden om commentaar aan een stukje code mee te geven, dit is ook het geval bij een SQL-script, dit wordt een line comment genoemd. Dit kan ook gebruikt worden voor het manipuleren van een parameter. Zo kan ervoor worden gezorgd dat een deel van een query wordt genegeerd, een line comment wordt aangegeven met “--”. Hieronder staat een voorbeeld van een line comment injection.
SELECT * FROM members WHERE username = 'admin'--' AND password = 'password'

Door het line comment wordt het 2de deel van de query niet uitgevoerd, dit houdt in dat het password niet gecontroleerd wordt. Hierdoor krijgt de gebruiker de mogelijkheid om in te loggen als de admin en hoeft daarvoor geen wachtwoord in te voeren. Door in het gebruiksnaam vak admin’-- in te voeren wordt de SQL-query zo gemanipuleerd dat de gebruikers als admin wordt ingelogd.


Incorrectly filtered escape characters

Met deze handeling wordt een query zo gemanipuleerd om zo acties met de database uit te voeren die niet toegestaan zijn. We nemen het volgende voorbeeld.
statement = "SELECT * FROM users WHERE name = '" + userName + "';"

om deze te kunnen manipuleren kunnen we een waarde toevoegen waarmee we de query kunnen manipuleren. Het volgende voegen we toe.
a' or 't'='t

Dit stukje vraagt om een gebruik a of t = t omdat dit altijd waar is wordt de query uitgevoerd. Uiteindelijk krijgen we de volgende query
SELECT * FROM users WHERE name = 'a' OR 't'='t';

Dit kan ook zo worden uitgevoerd bij een wachtwoord zodat het wachtwoord omzeild kan worden.

Je kunt de code ook zo manipuleren dat we gegevens uit een database kunnen verwijderen. Door een query de eindigen met “;” kan je er een nieuw statement achter toevoegen. Bijvoorbeeld.
DROP TABLE users

Hierdoor zal de tabel voor gebruikers verwijderd worden. De query ziet er dan als volgt uit.
SELECT * FROM users WHERE name = 'a';DROP TABLE users;


Incorrect type handling

Bij dit soort injectie wordt er niet gecontroleerd of er een juiste waarde wordt ingevoerd. Zo is het aangeraden als er alleen numerieke waarde mag worden ingevoerd, dit ook werkelijk te controleren. Anders kan kwaadwillende gebruiker de query zo manipuleren dat de gegevens in database worden aangepast of verwijderd. We nemen het volgende voorbeeld.
statement := "SELECT * FROM data WHERE id = " + a_variable + ";"

op de plek “a_variable” is het de bedoeling dat hier een numerieke waarde wordt ingevoerd, echter is dit niet verplicht omdat dit nergens gecontroleerd wordt. We kunnen om deze plek het volgende toevoegen.
1;DROP TABLE users

Doordat er niet wordt gecontroleerd geeft de applicatie geen fout aan en wordt de applicatie gewoon uitgevoerd. De uiteindelijke query ziet er dan als volgt uit.
SELECT * FROM DATA WHERE id=1;DROP TABLE users;


Union Injections

Door middel van UNION is het mogelijk om de resultaten van twee tabellen samen te voegen. Het is noodzakelijk dat in beide queries hetzelfde aantal kolommen worden geselecteerd. De reden hiervoor is dat de resultaten uit de tweede tabel onder de kolomnamen van de eerste tabel komen te staan.
SELECT id, titel, naam FROM tabel1 UNION ALL SELECT id, tekst, opmerking FROM tabel2;

De velden id, tekst en opmerking uit tabel 2 worden in het resultaat geplaatst onder de velden id, titel en naam. De typen uit beide tabellen moeten overeen zijn. Als het veld ID een integer is dan dient het eerste veld uit de tweede tabel ook van dat type te zijn.

Het risico van SQL injections is de UNION injection. Deze injection is eenvoudig te gebruiken vanuit de adresbalk. Door middel van UNION te gebruiken kunnen er gegevens opgehaald die niet voor de gebruiker bestemd zijn.

In onderstaand voorbeeld wordt aan de hand van de URL een UNION injection uitgevoerd:
?id=12349999’ UNION ALL SELECT 1,2,3,4,5,6,7 FROM [tabelnaam]--

Wat gebeurd er in deze request: ?id=12349999’ Er wordt een niet bestaand id geraden, zodat er uit de eerste tabel geen data wordt getoond. Dit ID wordt afgesloten zodat UNION in dezelfde query komt.
UNION ALL SELECT Er wordt een nieuw verzoek naar een tabel ingevoegd.
FROM [tabelnaam] [tabelnaam] kan naar eigen inzicht worden gegokt.
-- De rest van de eventuele query wordt uitgecommentarieerd.

De query die wordt uitgevoerd ziet er als volgt uit:
SELECT * FROM tabel UNION ALL SELECT 1,2,3,4,5,6,7 FROM [tabelnaam]

Echter is het nadelig dat de tabelnaam gegokt moet worden. Hier voor een de volgende mogelijkheid, waarmee het mogelijk is om tabelnamen te raden:
?id=12349999’ UNION ALL SELECT 1,TABLE_NAME,3,TABLE_ROWS,5 FROM information_schema.tables --

Dit vraagt een overzicht op van alle tabellen uit de database information_schema. In deze database wordt de structuur van alle databases, tabellen en dergelijke weergegeven. In feite is het weten van alle tabelnamen zinloos, want niet alles is direct te benaderen van uit de applicatie.

Om achter de daadwerkelijke database naam te komen kan het volgende gedaan worden:
?id=12349999’ union all select 1,2,3,4,5,6,7 from tabelnaamdienietbestaat --

Als de foutweergave is ingeschakeld dan komt de volgende fout in beeld:
1146: Table ‘databasenaam.tabelnaamdienietbestaat’ doesn’t exist

Nu de databasenaam bekend is wordt het mogelijk om daadwerkelijk tabelnamen op de vragen.
?id=12349999’ union all 1,TABLE_NAME,3,TABLE_ROWS,5,6,7 from
information_schema.tables WHERE TABLE_SCHEMA=’databasenaam’ LIMIT 1,1 --

De limit staat er in omdat er altijd maar één naam gegeven zal worden. Deze kan in de url verhoogd en verlaagd worden om de juiste tabelnaam te hanteren. Als de tabelnaam bekend is, dan wordt het mogelijk om de kolommen op te vragen:
?id=12349999’ union all select 1,COLUMN_NAME,3,PRIVILEGES,5,6,7 FROM information_schema.columns WHERE TABLE_SCHEMA= ‘databasenaam’ and TABLE_NAME=’tabelnaam’ limit 1,1--

Als de kolommen bekend zijn dan kan hieruit de data worden getoond:
?id=12349999’ union all select 1,user,3,password,5,6,7 from members LIMIT 1,1--

Op deze manier kan data worden verkregen die niet is bedoeld om door anderen gebruikt te worden. Waardoor het mogelijk wordt om bijvoorbeeld cookies over te nemen.


Blind injection

Een blind sql-injection is identiek aan een gewonen sql-injection echter wordt er op deze manier geprobeerd om bruikbare foutmelding te achterhalen. Er worden een aantal true/false statements meegegeven in de injectie waarmee een foutmelding gegenereerd wordt. Voorbeelds:
SELECT naam FROM TEST1 WHERE naam = 'thijs' AND 1=1;

In de code hierboven wordt het SQL statement correct uitgevoerd en zal de data gewoon in de applicatie te zien zijn. Terwijl in de code hieronder geen resultaat geneerd. Er zullen een aantal foutmelding op het scherm weergegeven worden
SELECT naam FROM TEST1 WHERE naam = 'thijs' AND 1=2;

Plaats reactie