SQL injection

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jos Brabant

Jos Brabant

24/05/2016 13:39:38
Quote Anchor link
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.
 
PHP hulp

PHP hulp

21/09/2021 18:45:42
 
Ward van der Put
Moderator

Ward van der Put

24/05/2016 13:48:10
Quote Anchor link
>> ik moet voor school een site maken die kwetsbaar is voor 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
 
Koen Hollander

Koen Hollander

24/05/2016 13:58:22
Quote Anchor link
PHP is oliedom zeg ik altijd maar
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.
 
Thomas van den Heuvel

Thomas van den Heuvel

24/05/2016 14:10:03
Quote Anchor link
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
 
Jos Brabant

Jos Brabant

24/05/2016 14:29:14
Quote Anchor link
dus als ik het goed begrijp zou dit moeten werken:

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?
 
Thomas van den Heuvel

Thomas van den Heuvel

24/05/2016 14:32:52
Quote Anchor link
De MySQL-drivers in PHP (MySQL, MySQLi, PDO (edit: of liever gezegd PDO_MYSQL)) staan standaard niet toe dat er meerdere queries achter elkaar worden uitgevoerd (edit: in query() functies; er bestaat wel zoiets als multi_query() waarin dit wel kan maar dat is toch een beetje een handgranaat). Dat zou het beveiligen van queries ook een stuk lastiger maken.
Gewijzigd op 24/05/2016 14:36:05 door Thomas van den Heuvel
 
Jos Brabant

Jos Brabant

24/05/2016 14:36:37
Quote Anchor link
enig idee hoe ik dat kan uitzetten? want nu kan je er wel iets mee doen maar niet echt veel.
 
- Ariën -
Beheerder

- Ariën -

24/05/2016 14:59:25
Quote Anchor link
Ik vermoed dat je site magic Quotes aan heeft staan, die sinds PHP 5.4 er (eindelijk!) uitgesloopt zijn.
Welke PHP versie draai je?
 
L deB

L deB

24/05/2016 17:59:28
Quote Anchor link
Als je een kwetsbare site moet maken maak je gewoon een formulier zonder validatie die de gegevens rechtstreeks in een database stopt.
 
Jos Brabant

Jos Brabant

24/05/2016 22:19:37
Quote Anchor link
de hostsite draait versie 5.6.18

@L de query van hierboven gaat rechtstreeks de databank in.
 
- Ariën -
Beheerder

- Ariën -

24/05/2016 22:31:36
Quote Anchor link
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?
 
Thomas van den Heuvel

Thomas van den Heuvel

24/05/2016 23:10:29
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
' OR 'a' = 'a

Of equivalent.

De uiteindelijke query wordt dan:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
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.
Gewijzigd op 24/05/2016 23:20:16 door Thomas van den Heuvel
 
Jos Brabant

Jos Brabant

25/05/2016 15:55:27
Quote Anchor link
>>>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 :)
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.