Added XSS exercises

Paul Wagener 11 years ago
parent a66240eda3
commit db59273825
  1. 2
      securityquiz/urls.py
  2. 14
      static/css/style.css
  3. 39
      templates/base.html
  4. 29
      templates/sql.html
  5. 117
      templates/xss.html
  6. 14
      views.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'),
)

@ -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 {

@ -0,0 +1,39 @@
<!DOCTYPE html>
<html>
<head>
<title>Security 1</title>
<link href="/static/css/bootstrap.min.css" rel="stylesheet" type="text/css">
<link href="/static/css/style.css" rel="stylesheet" type="text/css">
</head>
<body>
<form method="POST">
{% csrf_token %}
<div class="row-fluid">
<div class="well span2" style="position: fixed">
<p>Ingelogd als <strong>{{ user }}</strong>.</p>
<ul>
<li><a href="/sql">SQL Injection</a></li>
<li><a href="/xss">Cross-site Scripting</a></li>
</ul>
<a href="/logout" class="btn">Uitloggen</a>
<button class="btn-primary" type="submit">Opslaan</button>
</div>
<div id="quiz" class="span8 offset2">
{% if messages %}
{% for message in messages %}
<div class="alert alert-info">{{ message }}</div>
{% endfor %}
{% endif %}
{% block content %}{% endblock %}
</div>
</div>
</form>
<body>
</html>

@ -1,21 +1,6 @@
<!DOCTYPE html>
<html>
<head>
<title>Security 1</title>
<link href="/static/css/bootstrap.min.css" rel="stylesheet" type="text/css">
<link href="/static/css/style.css" rel="stylesheet" type="text/css">
</head>
<body>
Ingelogd als <strong>{{ user }}</strong>. <a href="/logout">Uitloggen</a>
<form method="POST">
{% csrf_token %}
{% if messages %}
{% for message in messages %}
<div class="alert alert-info">{{ message }}</div>
{% endfor %}
{% endif %}
{% extends "base.html" %}
{% block content %}
<h1>SQL Injection</h1>
<h2>Bank</h2>
@ -34,7 +19,7 @@
<p><strong>Hint 3:</strong> Bekijk de broncode achter de site: <a href="https://github.com/Avans/Security-Workshop/blob/master/bank/index.php#L51">https://github.com/Avans/Security-Workshop/blob/master/bank/index.php#L51</a>
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.</p>
<img src="/static/img/poespas.png" style="width: 70%">
<img src="/static/img/poespas.png" style="width: 70%" class="center-block">
<div class="question">
<span class="question-string">Hoeveel geld heeft Alice op haar rekening staan?</span>
@ -132,8 +117,4 @@
<textarea class="question-input" name="answer_sql_hackinglab_explain">{{answers.answer_sql_hackinglab_explain}}</textarea>
</div>
<button class="btn-primary" type="submit">Opslaan</button>
</form>
<body>
</html>
{% endblock %}

@ -0,0 +1,117 @@
{% extends "base.html" %}
{% block content %}
<h1>Cross-site Scripting</h1>
<p>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</p>
<p>Zorg dat je de VM op NAT zet zodat deze de de laatste opdrachten kan dowloaden.</p>
<h2>Bank</h2>
<p>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.</p>
<p>Ga naar de "Bank (xss)" pagina voor de volgende opdrachten.</a>
<div class="question">
<span class="question-string">Maak een URL die Javascript aan de pagina toevoegd zodat deze 'XSS' in een alert-dialoog weergeeft.</span>
<div class="points"><span class="question-points">5</span> punten</div>
<input class="question-input" name="answer_xss_add_alert" value="{{answers.answer_xss_add_alert}}">
</div>
<div class="question">
<span class="question-string">Maak een URL die een nep inlogformulier laat zien. Bij het verzenden van dit formulier wordt de informatie naar jouw eigen website verstuurd!</span>
<div class="points"><span class="question-points">10</span> punten</div>
<input class="question-input" name="answer_xss_fake_form" value="{{answers.answer_xss_fake_form}}">
</div>
<div class="question">
<span class="question-string">Bekijk de broncode: <a href="https://github.com/Avans/Security-Workshop/blob/master/bank/message.php#L38">https://github.com/Avans/Security-Workshop/blob/master/bank/message.php#L38</a> Voeg een fix toe om deze aanval te voorkomen.</span>
<div class="points"><span class="question-points">10</span> punten</div>
<textarea class="question-input" name="answer_xss_fix_bank">{{answers.answer_xss_fix_bank}}</textarea>
</div>
<h2>Webshop</h2>
<p>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.</p>
<p>De website heeft nu ook PHP session cookies waar jij als hacker natuurlijk erg in geïnteresseerd bent.</p>
<p>Verander de pagina zodat deze automatisch de cookie naar jouw eigen website toestuurt.</p>
<p><strong>Hint 1:</strong> Bekijk de HTML, zoek naar plekken waar de parameter uit de URL worden gebruikt</p>
<p><strong>Hint 2:</strong> Cookies kan je in JavaScript uitlezen met document.cookie</p>
<p><strong>Hint 3:</strong> Onderzoek het 'onload' attribuut van een img tag in HTML.</p>
<p><strong>Hint 4:</strong> Als de src niet naar een geldige afbeelding wijst zal de onload niet uitgevoerd worden</p>
<p><strong>Hint 5:</strong> 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</p>
<div class="question">
<span class="question-string">Met welke URL kan je de sessie cookies van gebruikers ontfutselen? (Dus doorsturen naar je eigen site)</span>
<div class="points"><span class="question-points">10</span> punten</div>
<input class="question-input" name="answer_xss_url_redirect" value="{{answers.answer_xss_url_redirect}}">
</div>
<div class="question">
<span class="question-string">Verander de url naar image_zoom_escapehtml.php. Alle speciale HTML tekens (&lt;&gt;"&amp;) 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.</span>
<div class="points"><span class="question-points">10</span> punten</div>
<input class="question-input" name="answer_xss_url_redirect_escape" value="{{answers.answer_xss_url_redirect_escape}}">
</div>
<div class="question">
<span class="question-string">Bekijk de broncode op <a href="https://github.com/Avans/Security-Workshop/blob/master/webshop/image_zoom_escapehtml.php#L55">https://github.com/Avans/Security-Workshop/blob/master/webshop/image_zoom_escapehtml.php#L55</a> 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 <a href="http://php.net/htmlspecialchars">http://php.net/htmlspecialchars</a> )</span>
<div class="points"><span class="question-points">10</span> punten</div>
<textarea class="question-input" name="answer_xss_webshop_fix">{{answers.answer_xss_webshop_fix}}</textarea>
</div>
<h2>Nieuws</h2>
<p>We gaan nu een aanval doen op een populaire nieuwssite. Ga naar de "Nieuws" pagina voor de volgende opdrachten.</p>
<p>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.</p>
<p>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</p>
<p>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).</p>
<p>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.</p>
<p>4. Bekijk opnieuw de reactiepagina. Je bent nu ingelogd als de administrator!</p>
<p>Tip: op /nieuws/reset.php is een speciale pagina die al het commentaar wist. Dit is handig als je jouw aanval wil verbeteren.</p>
<p>(Let op dat je de VM op NAT hebt ingesteld zodat deze verbinding kan maken naar het internet)</p>
<div class="question">
<span class="question-string">Welke reactie heb je geplaatst waardoor je achter de cookie van de administrator kwam?</span>
<div class="points"><span class="question-points">10</span> punten</div>
<textarea class="question-input" name="answer_xss_news_reaction">{{answers.answer_xss_news_reaction}}</textarea>
</div>
<div class="question">
<span class="question-string">Wat is de geheime code die alleen administrators kunnen zien?</span>
<div class="points"><span class="question-points">5</span> punten</div>
<input class="question-input" name="answer_xss_news_secret_code" value="{{answers.answer_xss_news_secret_code}}">
</div>
<div class="question">
<span class="question-string">Plak het script dat je op je eigen website hebt gebruikt waarmee je de cookie van de admin hebt vastgelegd.</span>
<div class="points"><span class="question-points">10</span> punten</div>
<textarea class="question-input" name="answer_xss_news_script">{{answers.answer_xss_news_script}}</textarea>
</div>
<h2>Hacking Lab</h2>
<p>Maak de opgave "6112 - OWASP 2010 - A2 - Cross-Site Scripting" uit het OWASP Top Ten event.</p>
<div class="question">
<span class="question-string">Beschrijf hoe je de aanval hebt uitgevoerd. Hoe had deze aanval voorkomen kunnen worden?</span>
<div class="points"><span class="question-points">15</span> punten</div>
<textarea class="question-input" name="answer_xss_hacking_lab">{{answers.answer_xss_hacking_lab}}</textarea>
</div>
{% endblock %}

@ -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})

Loading…
Cancel
Save