diff --git a/static/img/security_banner.jpg b/static/img/security_banner.jpg new file mode 100644 index 0000000..21a5550 Binary files /dev/null and b/static/img/security_banner.jpg differ diff --git a/static/img/shield.png b/static/img/shield.png new file mode 100644 index 0000000..d505a51 Binary files /dev/null and b/static/img/shield.png differ diff --git a/static/img/sql_injectie.png b/static/img/sql_injectie.png new file mode 100644 index 0000000..1e03883 Binary files /dev/null and b/static/img/sql_injectie.png differ diff --git a/templates/base.html b/templates/base.html index 1be21ab..2926f67 100644 --- a/templates/base.html +++ b/templates/base.html @@ -13,15 +13,13 @@ {% csrf_token %}
-
+

Ingelogd als {{ user }}.

@@ -33,11 +31,11 @@ Uitloggen - {% if CLOSED %}
Inzendingen kunnen niet meer worden ingezonden{% else %}{% endif %} + {% if CLOSED %}
Inzendingen kunnen niet meer worden ingezonden{% else %}{% endif %}
-
+
{% if messages %} {% for message in messages %}
{{ message }}
diff --git a/templates/sql.html b/templates/sql.html index b33630c..a1128a2 100644 --- a/templates/sql.html +++ b/templates/sql.html @@ -2,30 +2,100 @@ {% block content %} -

SQL Injection

+ -

Voordat je gaat beginnen, voor welk vak maak je de opgave?

+

Security 1

- +

Welkom bij Security 1! Dit vak gaan we ons richten op het hacken van websites. En met die zin komen we meteen bij onze gouden regel voor dit vak:

+
Het hacken van websites zonder toestemming is niet toegestaan
+ +

Om de opdrachten te kunnen maken krijg je van ons toestemming om de websites in de VM te mogen hacken ;). + We gaan in dit vak verschillende manieren bekijken om in te breken op een website. Aan jullie de taak om die tijdens + de workshop in de praktijk te brengen

+ + + +

SQL injection

+ +

We beginnen deze week bij één van de meest veelvoorkomende beveiligingslekken die er bij webapplicaties voorkomen. Dagelijks nog zijn er nieuwsberichten van websites die hun code niet goed op orde hebben en kwetsbaar zijn tegen deze aanval. Deze week gaan we kijken hoe deze aanval werkt en hoe je er tegen kunt beveiligen.

+ +

In bijna alle webapplicatie projecten heb je te maken met een database waar je mee communiceert via SQL. Een typische query die wordt uitgevoerd is bijvoorbeeld deze:

+ + SELECT * FROM leden WHERE naam='paul' AND heeftbetaald='ja' + +

Waarbij het groene gedeelte invoer is uit bijvoorbeeld een GET parameter ('?naam=paul'). Er lijkt niks aan de hand, maar als we de invoer niet zorgvuldig filteren geven de gebruiker de kans om de query op onbedoelde manier te veranderen.

+ +
Commentaar
+

Met -- (streepje, streepje, spatie) is het in SQL mogelijk om commentaar te zetten in je query, hetzelfde wat je in PHP met // zou doen. Met een slim gekozen invoer kunnen we de query er zo uit laten zien:

+ + SELECT * FROM leden WHERE naam='paul' -- ' AND heeftbetaald='ja' + +

De database voert de query uit, maar niet zoals de gebruiker hem heeft bedoeld: alles achter de -- wordt genegeerd als commentaar. De query zal dus ook rijen teruggeven waar heeftbetaald niet op 'ja' staat, wat afhankelijk van de code van de website kan betekenen dat we gratis dingen kunnen kopen :)

+ +
AND, OR
+ +

Een andere manier om queries te veranderen is om nieuwe logica (AND, OR) te injecteren in de SQL. We kunnen bijvoorbeeld de volgende query maken met de juiste invoer:

+ + SELECT * FROM leden WHERE naam='paul' OR 'bla'='' AND heeftbetaald='ja' + +

Deze query maakt weer het heeftbetaald='ja' gedeelte nutteloos. Als de naam al overeenkomt maakt het niet uit wat er achter de OR staat, het resultaat is altijd true (de haakjes worden als volgt geplaatst: . OR ( . AND . )). + +

Meerdere queries
+

Eén van de meest gevaarlijke is als het mogelijk is om compleet nieuwe queries uit te kunnen voeren op de database. Bedenk eens wat er gebeurt als de gebruiker deze invoer geeft:

+ + SELECT naam FROM leden WHERE id=0; DROP TABLE leden; + +

Met ; geven we aan dat we een nieuwe query beginnen, waarna we vervolgens vrij zijn om elke query uit te voeren die we maar willen. Let wel dat het uitvoeren van meerdere queries met bijvoorbeeld mysqli_query() is iets wat standaard uit staat. Deze techniek is extra gevaarlijk omdat deze immuun is tegen escapen als het invoer is die niet tussen quotejes staat.

+ +
UNION
+ +

We kunnen met behulp van de UNION operator ook informatie halen uit andere tabellen in de database:

+ + SELECT naam FROM leden WHERE id=0 UNION SELECT wachtwoord FROM admins + +

De query haalt nu namen van leden op, samen met wachtwoorden uit de admins tabel. Belangrijk voor de UNION is dat beide queries evenveel kolommen teruggeven.

+ + +

Countermeasures

+ +

Het is niet moeilijk om bovenstaande aanvallen te voorkomen, met een paar simpele aanpassingen kan je ervoor zorgen dat je SQL altijd wordt uitgevoerd zoals je die bedoeld hebt.

+ +
Stored procedures
+

Je slaat de SQL op als stored procedure in de database en roept deze aan vanuit je code. Omdat de SQL in de database staat in plaats op de server is SQL injectie niet mogelijk

+ +
Prepared statements
+

De meest gebruikte veilige manier, met vraagtekentjes geef je aan op welke plekken de invoer moet komen en vul die later in. De SQL wordt altijd uitgevoerd zoals je hem hebt bedoeld, en ook hier is SQL injectie onmogelijk. Lees hier verder

+ +
Escaping
+

Je kan ook alle invoer zelf escapen met functies zoals mysqli_real_escape_string(). Zorg ervoor dat je dan consequent alle strings escaped met die functie en alle getallen cast naar int's voordat je ze in je SQL plakt. Als je er ook maar eentje mist heb je al een SQL injection mogelijkheid op je website!

+ +

Op deze site kan je het allemaal extra nalezen. Maar voor nu genoeg theorie, let's HACK!

+ +

Bank

Bob is al jaren trouwe klant en gebruikt de site dagelijks om te kijken hoeveel geld er op zijn rekening staat. Achter op zijn poespas pas heeft hij met een viltstift „Niet vergeten: Bob 123456” geschreven. Gebruik de site om te kijken hoeveel geld Bob op zijn rekening heeft staan.

Alice is ook klant van de bank en wij willen ook graag weten hoeveel geld zij op haar rekening heeft staan. We gaan daarom haar rekening hacken met behulp van SQL.

-

Lees op deze website de verschillende SQL injectie technieken: http://www.sqltutorial.nl/artikelen/sqlinjections/soorten_sql_injection.html -

Ga nu aan de slag en hack het account van Alice!

Hint 1: Kijk eerst eens wat er gebeurt als je inlogt met een enkele quote in de gebruikersnaam (').

Hint 2: Met -- (twee streepjes gevolgd door een spatie) kan je commentaar achter een regel zetten in SQL.

-

Hint 3: Bekijk de broncode achter de site: https://github.com/Avans/Security-Workshop/blob/master/bank/index.php#L51 +

Hint 3: Bekijk de broncode achter de site: https://github.com/Avans/Security-Workshop/blob/master/bank/index.php#L51 De code beschouwt een gebruiker als ingelogd als de query een rij uit de gebruikerstabel teruggeeft. Manipuleer de query zodat deze de gegevens van Alice teruggeeft, zonder dat je het wachtwoord hoeft te weten.

@@ -53,7 +123,7 @@

Hint: Maak er een query van die alle gebruikers teruggeeft, de site logt dan in als de eerste gebruiker. Het maakt voor de opdracht niet uit als wie je inlogt.

- Bekijk de PHP broncode en los het probleem op. Type de regels code die je verbeterd hebt in onderstaand tekstveld. (denk terug aan je mysql WEBS2 practicum) + Bekijk de PHP broncode en los het probleem op. Type de regels code die je verbeterd hebt in onderstaand tekstveld. (denk terug aan je mysql WEBS2 practicum)
15 punten
@@ -72,11 +142,11 @@

Inloggen in een ander account is leuk. Maar echte hackers stelen kostbare data uit een website. Dat gaan we nu doen met de webshop van Leaky's.

-

Je kan de broncode vinden op: https://github.com/Avans/Security-Workshop/blob/master/webshop/product_detail.php#L62 +

Je kan de broncode vinden op: https://github.com/Avans/Security-Workshop/blob/master/webshop/product_detail.php#L62 -

Zoals je ziet hebben ze hier gebruik gemaakt van mysql_real_escape_string(). Je kan dus geen gebruik meer maken van rare quotejes om de query aan te passen.

+

Zoals je ziet hebben ze hier gebruik gemaakt van mysqli::real_escape_string(). Je kan dus geen gebruik meer maken van rare quotejes om de query aan te passen.

-

Maar met behulp van de UNION techniek kunnen we alsnog data stelen uit de website. Lees in de tutorial hoe je deze techniek kan toepassen om data uit andere tabellen te lezen.

+

Maar met behulp van de UNION techniek kunnen we alsnog data stelen uit de website.

In de database is er nog een tabel "gebruikers" waar gebruikersnamen en wachtwoorden in staan. Steel deze informatie uit de database!

@@ -97,7 +167,7 @@
- Bekijk de broncode en verbeter deze zodat je geen SQL injection meer kan gebruiken. + Bekijk de broncode en verbeter deze zodat je geen SQL injection meer kan gebruiken.
15 punten
@@ -112,20 +182,22 @@
-

Hacking Lab

+

Wereldwijs

+ +

Ga in de VM naar de Wereldwijs pagina. Op deze pagina kunnen studenten op spelenderwijs leren over de wereld. Maar deze site heeft een diep donker geheim die het niet toont aan de wereld, er is een geheime pagina met id 0.

-

Ga aan de slag met hacking-lab.com. Volg de instructies op de site en begin met de A1 Injection opdracht. Deze staat in de OWASP Top Ten event.

+

Geen hints en geen broncode deze keer. Aan jullie de taak om de site te hacken. (meerdere manieren mogelijk)

- Wat is het creditcardnummer van "hacker10"? + Wat is het onderwerp van de geheime pagina?
5 punten
- +
- Beschrijf hoe je de aanval hebt uitgevoerd. + Met welke URL heb je de website de geheime pagina laten tonen?
10 punten
- +
{% endblock %} \ No newline at end of file