ik weet niet of jullie mij kunnen helpen, maar ik kan altijd proberen.

ik moet voor school een site maken die kwetsbaar is voor sql injection. als ik op het internet ga kijken vind ik enkel wat sql injection is en hoe je je ertegen moet beschermen. maar daar ben ik weinig mee, php beschermd de site zowizo tegen sql injection.
Ik denk niet dat dat echt de insteek is: een site net zo lang misconfigureren totdat alles zo lek is als een mandje. Het zou zinniger zijn (maar nog steeds een beetje raar) om met de default settings iets te creëren wat niet veilig is. Dit doet de docent waarschijnlijk om je bewust te maken van de gevaren, zij het op een wat onorthodoxe wijze.

Je moet het als volgt zien.

Gegeven de volgende query:
SELECT * FROM users

Hier valt niet zoveel aan te hacken. Deze bestaat enkel uit SQL.

Maar, wat nu als je inlogt via een script. Dan zal er wat user DATA in aangebracht moeten worden:
SELECT * FROM users
WHERE user = '<username>'
AND pass = '<password>'

(even er vanuitgaande dat geen encryptie gebruikt wordt voor wachtwoorden).

Je hebt nu zowel SQL code alsmede DATA van een externe bron, bijvoorbeeld <username> en <password> zijn afkomsting uit een formulier ($_POST).

Hoe kun je hier nu SQL injectie op los laten? Eerst moet je weten wat SQL injectie precies is, en wanneer dit mogelijk is. Wanneer je query niet beveiligd is tegen SQL injectie dan is het mogelijk dat DATA wordt geïnterpreteerd als SQL. Hiermee kun je effectief de werking van de query aanpassen.

In de bovenstaande query zou je dus graag in willen kunnen loggen als persoon X zonder dat je weet wat zijn wachtwoord is. Dit zou je als volgt kunnen doen:

Voor de gebruikersnaam <username> vul je de gebruikersnaam in waarmee je wilt inloggen (zeg X). En voor <password> het volgende:
' OR 'a' = 'a

Of equivalent.

De uiteindelijke query wordt dan:
SELECT * FROM users
WHERE user = 'X'
AND pass = '' OR 'a' = 'a'

Hiermee heb je effectief de werking van de query veranderd. SQL injectie geslaagd.

Wat ik niet helemaal snap is dat dit dan precies de opdracht is. Dit vertelt je namelijk niets over hoe je dit kunt voorkomen.

Je voorkomt SQL injectie door uit te sluiten dat DATA die je in je query invoegt geïnterpreteerd kan worden als SQL, oftewel, je moet de DATA die je invoegt ontdoen van enige mogelijke speciale betekenis (binnen SQL). Dit doe je met escaping-functies voor de SQL-context in combinatie met quotes om de te escapen delen. Het een zonder het ander is niet veilig. Zie bijvoorbeeld de real_escape() functie voor MySQLi.

Het strippen van een mogelijk speciale betekenis van DATA binnen een bepaalde context wordt ook wel output escaping genoemd. Dit concept bestaat ook in andere contexten en hier zijn ook functies voor, bijvoorbeeld htmlspecialchars() voor de HTML-context.

Oftewel: SQL injectie is vaak/meestal/altijd? mogelijk door een verkeerde of onvolledige escaping van output (de "externe input" in je query).

Een alternatief is de gebruikmaking van prepared statements, maar als je dat spel niet volgens de regels speelt is dit even vatbaar voor SQL injectie als de variant zonder prepared statement laag.
>>>Ik denk niet dat dat echt de insteek is: een site net zo lang misconfigureren totdat alles >>>zo lek is als een mandje. Het zou zinniger zijn (maar nog steeds een beetje raar) om met de >>>default settings iets te creëren wat niet veilig is.

ik vind het even raar als jij, maar ik wil er eigenlijk gewoon door zijn.

ik heb veel bijgeleerd van je uitleg, waarvoor dank :)

Reageren