SQL injection
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.
Die kwetsbaar is voor SQL-injectie of die juist niet kwetsbaar is?
>> php beschermd de site zowizo tegen sql injection.
PHP doet zelf niets tegen SQL-injectie. Zodra je PHP data rechtstreeks aan een database laat doorgeven, zonder de data te filteren en controleren, is het geheel kwetsbaar voor SQL-injectie. Tenminste, als de database SQL gebruikt.
Begin hier maar eens:
https://www.owasp.org/index.php/SQL_Injection
Hij doet niks voor je, tenzij je exact zegt hoe hij het moet doen.
Wanneer je een website moet maken die niet beveiligd is tegen SQL Injectie, dan moet je je eerst verdiepen in de term SQL Injectie. Wat is dat nou precies? Wat kan je er mee en wat niet? Als je weet wat het doet kan je je verdiepen in de vraag hoe je een beveiliging tegen SQL Injectie van toepassen op je website. Maar dan weet je ook hoe de website absoluut gevoelig kan maken voor SQL Injectie.
Quote:
als ik op het internet ga kijken vind ik enkel wat sql injection is en hoe je je ertegen moet beschermen
Dat zijn toch precies de twee dingen die je moet begrijpen om iets te maken wat vatbaar is voor SQL injection:
- weten wat het inhoudt en hoe je dit soort lekken uit kunt buiten, en
- geen (of niet de juiste) veiligheidsmaatregelen treffen om dit te voorkomen
?
En, zoals aangegeven, PHP doet zelf niets aan het voorkomen van SQL injectie. Het doen van zo'n aanname (zelfs als deze waar is) lijkt mij onverstandig. Als het om veiligheid gaat zou er continue waakzaamheid moeten zijn.
Gewijzigd op 24/05/2016 14:23:48 door Thomas van den Heuvel
query in code:
"INSERT INTO Songs(Song, Artist) VALUES('" . $_GET['song'] . "', '" . $_GET['artist'] . "')"
in song vul ik gewoon een waarde in. en in artist vul ik dit in:
Stromae'); UPDATE Songs SET Artist = 'lol2' WHERE 1=1
als ik dat rechtstreeks via sql doe werkt dit maar via mijn website doet die dat niet. kunnen jullie mij dan vertellen wat ik fout doe?
Gewijzigd op 24/05/2016 14:36:05 door Thomas van den Heuvel
enig idee hoe ik dat kan uitzetten? want nu kan je er wel iets mee doen maar niet echt veel.
Welke PHP versie draai je?
Als je een kwetsbare site moet maken maak je gewoon een formulier zonder validatie die de gegevens rechtstreeks in een database stopt.
@L de query van hierboven gaat rechtstreeks de databank in.
Voer eens een ' apostrof in, in een onbeveiligde query. Krijg je dan een error van MySQL/PHP? Of komt het gewoon in de database te staan?
Je moet het als volgt zien.
Gegeven de volgende query:
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:
(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:
Of equivalent.
De uiteindelijke query wordt dan:
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.
Gewijzigd op 24/05/2016 23:20:16 door Thomas van den Heuvel
ik vind het even raar als jij, maar ik wil er eigenlijk gewoon door zijn.
ik heb veel bijgeleerd van je uitleg, waarvoor dank :)