diff --git a/securityquiz/urls.py b/securityquiz/urls.py index 0f816aa..b02ebe9 100644 --- a/securityquiz/urls.py +++ b/securityquiz/urls.py @@ -5,9 +5,9 @@ admin.autodiscover() urlpatterns = patterns('', # Examples: - url(r'^$', 'views.home', name='home'), url(r'^callback$', 'views.avans_callback'), url(r'^logout$', 'views.avans_logout'), url(r'^pull$', 'views.pull'), url(r'^admin/', include(admin.site.urls)), + url(r'^(.*)$', 'views.home', name='home'), ) diff --git a/static/css/style.css b/static/css/style.css index 6a892cd..71b5ed3 100644 --- a/static/css/style.css +++ b/static/css/style.css @@ -1,12 +1,10 @@ body { background-color: #e8eef7; + padding: 2em; } -form { - display: block; - margin: 0.5em auto 2.5em; +#quiz { padding: 1em; - width: 45em; background-color: white; border: 1px solid #ccc; } @@ -19,9 +17,15 @@ form { font-weight: bold; } +.center-block { + display: block; + margin-left: auto; + margin-right: auto; +} + textarea { width: 75%; - height: 7em; + height: 9em; } input { diff --git a/templates/base.html b/templates/base.html new file mode 100644 index 0000000..a914fac --- /dev/null +++ b/templates/base.html @@ -0,0 +1,39 @@ + + + + Security 1 + + + + +
+ {% csrf_token %} + +
+
+

Ingelogd als {{ user }}.

+ + + + Uitloggen + +
+ +
+ {% if messages %} + {% for message in messages %} +
{{ message }}
+ {% endfor %} + {% endif %} + + {% block content %}{% endblock %} + + +
+
+
+ + diff --git a/templates/index.html b/templates/sql.html similarity index 91% rename from templates/index.html rename to templates/sql.html index ed136ed..52f9482 100644 --- a/templates/index.html +++ b/templates/sql.html @@ -1,21 +1,6 @@ - - - - Security 1 - - - - - Ingelogd als {{ user }}. Uitloggen - -
- {% csrf_token %} - - {% if messages %} - {% for message in messages %} -
{{ message }}
- {% endfor %} - {% endif %} +{% extends "base.html" %} + +{% block content %}

SQL Injection

Bank

@@ -34,7 +19,7 @@

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.

- +
Hoeveel geld heeft Alice op haar rekening staan? @@ -132,8 +117,4 @@
- - -
- - +{% endblock %} \ No newline at end of file diff --git a/templates/xss.html b/templates/xss.html new file mode 100644 index 0000000..7480c7c --- /dev/null +++ b/templates/xss.html @@ -0,0 +1,117 @@ +{% extends "base.html" %} + +{% block content %} +

Cross-site Scripting

+

Voor veel van deze opdrachten heb je een eigen website nodig. Als je niet een eigen website hebt kan je natuurlijk ook gebruik maken van de student.aii.avans.nl webruimte

+ +

Zorg dat je de VM op NAT zet zodat deze de de laatste opdrachten kan dowloaden.

+ +

Bank

+

We gaan opnieuw kijken naar de Bank website. Ze hebben tijdelijk hun login formulier uitgeschakeld, maar daarmee zijn ze nog steeds niet veilig van hun beveiligingsproblemen.

+ +

Ga naar de "Bank (xss)" pagina voor de volgende opdrachten. + +

+ Maak een URL die Javascript aan de pagina toevoegd zodat deze 'XSS' in een alert-dialoog weergeeft. +
5 punten
+ +
+ +
+ Maak een URL die een nep inlogformulier laat zien. Bij het verzenden van dit formulier wordt de informatie naar jouw eigen website verstuurd! +
10 punten
+ +
+ +
+ Bekijk de broncode: https://github.com/Avans/Security-Workshop/blob/master/bank/message.php#L38 Voeg een fix toe om deze aanval te voorkomen. +
10 punten
+ +
+ +

Webshop

+

Leaky heeft zijn webshop uitgebreid: je kan nu op de product pagina's doorklikken op de plaatjes voor een grote ingezoomde afbeelding. Op deze pagina is echter ook een XSS beveiligingslek.

+ +

De website heeft nu ook PHP session cookies waar jij als hacker natuurlijk erg in geïnteresseerd bent.

+ +

Verander de pagina zodat deze automatisch de cookie naar jouw eigen website toestuurt.

+ +

Hint 1: Bekijk de HTML, zoek naar plekken waar de parameter uit de URL worden gebruikt

+ +

Hint 2: Cookies kan je in JavaScript uitlezen met document.cookie

+ +

Hint 3: Onderzoek het 'onload' attribuut van een img tag in HTML.

+ +

Hint 4: Als de src niet naar een geldige afbeelding wijst zal de onload niet uitgevoerd worden

+ +

Hint 5: Als je in een URL het + tekentje gebruikt wordt dit vertaald naar een spatie. Als je ook echt een + wilt gebruiken moet je de url encoded versie gebruiken: %2B

+ +
+ Met welke URL kan je de sessie cookies van gebruikers ontfutselen? (Dus doorsturen naar je eigen site) +
10 punten
+ +
+ +
+ Verander de url naar image_zoom_escapehtml.php. Alle speciale HTML tekens (<>"&) zijn nu geëscapet. Maar het is nog steeds mogelijk om een aanval uit te voeren! Maak een nieuwe URL die de sessie cookie naar je eigen website verstuurd. Let goed op de quotejes. +
10 punten
+ +
+ +
+ Bekijk de broncode op https://github.com/Avans/Security-Workshop/blob/master/webshop/image_zoom_escapehtml.php#L55 Voeg een simpele fix toe die dit probleem oplost. Je kan dit op twee manieren doen: 1. HTML aanpassen 2. PHP aanpassen (lees documentatie op http://php.net/htmlspecialchars ) +
10 punten
+ +
+ + +

Nieuws

+ +

We gaan nu een aanval doen op een populaire nieuwssite. Ga naar de "Nieuws" pagina voor de volgende opdrachten.

+ +

Deze site heeft geen plekken waar we via de URL's javascript aan de pagina kunnen toevoegen. Bovendien zijn de administrators van deze site veel te slim om op rare links te klikken in vage e-mailtjes. We gaan het via een stored XSS attack te doen.

+ +

1. Voeg via de reacties javascript aan de pagina toe die cookies steelt. Je moet deze cookies nu ook echt naar een eigen server sturen om de opdracht te kunnen maken. Zet op een eigen website een scriptje die alle requests in een bestandje/database logt zodat je daar later de cookies kunt uitlezen. Voorbeeld: student.aii.avans.nl/ICT/pwagener/logcookie.php?PHPSESSID=2394fh3dk

+ +

2. Je kan nu een ingelogde administrator naar de pagina (met jouw javascript) laten kijken door een melding te maken. Onderaan de reactiepagina staat een link (je kan ook rechtstreeks naar /nieuws/admincheck.php).

+ +

3. Als het goed is heb je nu de cookie van de administrator gestolen. Verander in de browser jouw eigen cookie naar de cookie van de administrator. Zoek naar een browserplugin als je dit niet al kan met jouw browser.

+ +

4. Bekijk opnieuw de reactiepagina. Je bent nu ingelogd als de administrator!

+ +

Tip: op /nieuws/reset.php is een speciale pagina die al het commentaar wist. Dit is handig als je jouw aanval wil verbeteren.

+ +

(Let op dat je de VM op NAT hebt ingesteld zodat deze verbinding kan maken naar het internet)

+ +
+ Welke reactie heb je geplaatst waardoor je achter de cookie van de administrator kwam? +
10 punten
+ +
+ +
+ Wat is de geheime code die alleen administrators kunnen zien? +
5 punten
+ +
+ +
+ Plak het script dat je op je eigen website hebt gebruikt waarmee je de cookie van de admin hebt vastgelegd. +
10 punten
+ +
+ +

Hacking Lab

+ +

Maak de opgave "6112 - OWASP 2010 - A2 - Cross-Site Scripting" uit het OWASP Top Ten event.

+ +
+ Beschrijf hoe je de aanval hebt uitgevoerd. Hoe had deze aanval voorkomen kunnen worden? +
15 punten
+ +
+ + + + +{% endblock %} \ No newline at end of file diff --git a/views.py b/views.py index 9be81e5..85b067e 100644 --- a/views.py +++ b/views.py @@ -1,6 +1,7 @@ from django.shortcuts import render from django.http import HttpResponse from django.http import HttpResponseRedirect +from django.http import HttpResponseNotFound from django.contrib.auth import authenticate, login, logout from django.contrib.auth.models import User from django.contrib import messages @@ -76,7 +77,7 @@ def pull(request): return HttpResponseRedirect('/') -def home(request): +def home(request, url): if not request.user.is_authenticated(): return avans_login(request) @@ -88,11 +89,18 @@ def home(request): answer.save() messages.add_message(request, messages.INFO, 'Je antwoorden zijn opgeslagen') - return HttpResponseRedirect('/') + return HttpResponseRedirect('/' + url) answers = Answer.objects.filter(user=request.user) answers_dict = {} for answer in answers: answers_dict[answer.question] = answer.string - return render(request, 'index.html', {'answers': answers_dict}) + if url == 'sql' or url == '': + template = 'sql.html' + elif url == 'xss': + template = 'xss.html' + else: + return HttpResponseNotFound('404') + + return render(request, template, {'answers': answers_dict})