Compare commits
7
Commits
80dd9e0d07
..
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8cbf30aa0d | ||
|
|
fc244f4009 | ||
|
|
0f8ac914f8 | ||
|
|
5c8f930bbd | ||
|
|
5b31b09881 | ||
|
|
d6bb65aa7f | ||
|
|
e1e357e3ef |
No files matched your search
@@ -2,3 +2,4 @@
|
||||
__pycache__
|
||||
/venv
|
||||
db.sqlite3
|
||||
/securityquiz/secrets.py
|
||||
@@ -1,3 +1,5 @@
|
||||
django
|
||||
django-oauth-toolkit
|
||||
django-cors-headers
|
||||
pyopenssl
|
||||
psycopg2
|
||||
@@ -0,0 +1,4 @@
|
||||
DB_HOST = ''
|
||||
DB_NAME = ''
|
||||
DB_USER = ''
|
||||
DB_PASSWORD = ''
|
||||
@@ -9,7 +9,10 @@ https://docs.djangoproject.com/en/1.6/ref/settings/
|
||||
"""
|
||||
|
||||
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
|
||||
import os, sys
|
||||
import os
|
||||
import sys
|
||||
from . import secrets
|
||||
|
||||
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
|
||||
|
||||
CLOSED = False
|
||||
@@ -26,7 +29,7 @@ DEBUG = False
|
||||
if 'runserver' in sys.argv:
|
||||
DEBUG = True
|
||||
|
||||
ALLOWED_HOSTS = ['websec.paulwagener.nl']
|
||||
ALLOWED_HOSTS = ['websec.paulwagener.nl', '127.0.0.1']
|
||||
|
||||
|
||||
# Application definition
|
||||
@@ -43,7 +46,7 @@ INSTALLED_APPS = (
|
||||
'corsheaders',
|
||||
)
|
||||
|
||||
MIDDLEWARE_CLASSES = (
|
||||
MIDDLEWARE = (
|
||||
'django.contrib.sessions.middleware.SessionMiddleware',
|
||||
'django.middleware.common.CommonMiddleware',
|
||||
'django.middleware.csrf.CsrfViewMiddleware',
|
||||
@@ -64,8 +67,11 @@ WSGI_APPLICATION = 'securityquiz.wsgi.application'
|
||||
|
||||
DATABASES = {
|
||||
'default': {
|
||||
'ENGINE': 'django.db.backends.sqlite3',
|
||||
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
|
||||
'ENGINE': 'django.db.backends.postgresql',
|
||||
'NAME': secrets.DB_NAME,
|
||||
'USER': secrets.DB_USER,
|
||||
'PASSWORD': secrets.DB_PASSWORD,
|
||||
'HOST': secrets.DB_HOST
|
||||
}
|
||||
}
|
||||
|
||||
@@ -101,7 +107,6 @@ TEMPLATES = [
|
||||
'django.template.context_processors.debug',
|
||||
'django.template.context_processors.request',
|
||||
'django.contrib.auth.context_processors.auth',
|
||||
'securityquiz.settings.closed',
|
||||
'django.contrib.messages.context_processors.messages',
|
||||
],
|
||||
},
|
||||
@@ -111,6 +116,3 @@ TEMPLATES = [
|
||||
STATICFILES_DIRS = (
|
||||
PROJECT_PATH + '/static',
|
||||
)
|
||||
|
||||
def closed(request):
|
||||
return {'CLOSED': CLOSED}
|
||||
+9
-14
@@ -1,17 +1,12 @@
|
||||
-----BEGIN PGP MESSAGE-----
|
||||
|
||||
owEBXgKh/ZANAwACAdVV8vX6nhxaAawuYglwbGFpbi50eHRVdLQaVGhlIE5hcndo
|
||||
YWwgQmFjb25zIGF0IE1pZG5pZ2h0CokCHAQAAQIABgUCVXS0GgAKCRDVVfL1+p4c
|
||||
Wl31EACZ0itLnfLQrkFYGEa8DxgG6O101oc350JekBI7mIm1x556M3dIkyDTSqPd
|
||||
1gY+5wE3iklSnqPAfRSskclQ5SahK7mIjRw8NoCpWGRdFT/2u15lZofqGMV23T1R
|
||||
hEuxxNlZwcWEWDg2Ixx6OqE836Qm+ITaS12ok5qDZFxj4hd4C7uinAv5CWKIyvwl
|
||||
l5ZwwWB4p+NT6JxY6p5Pw0J5xPVCE+pAFesPUwAYydQ5CabgdfRyjc6iMQz+GRFD
|
||||
Qs7kWuZ2JKPWm+2h0UQa38Id66fd4l38x16+rerIEG8XTMlfiXgtCPT9Rkdxb8lD
|
||||
bZQJefupCPP/EAQnZOPzHFbZ32PaOnp0DTLi641W24rb0hwD2LPHIRh+KPWfwaVl
|
||||
+1BSEGE3STDjN0CGaTE1KDM5p5TEhML4/LwRucdp+y8c3f1gyWNd8ChnA9aCFr5w
|
||||
h4FIpE1gAd6XANkVGCIHlZ0Lzxu022zjNFPW2sQeFJy1ZEqBAAwaOlnceztTyx6c
|
||||
J+TNey4lYy2F4hVn/QxYF5kMUIEw22y4tMmwX4tOVkgg5I0X+mf2Csosbfz7Xsn3
|
||||
0i4utcTqwmVov3obPQj1QprBeSMXoYSJMyUCO7eIE9eqeGy0uMO6xkG3Z2QGsZNS
|
||||
aAzu9msSLIc5cQWx9Pva9pafC/sFIyJWudBlf8UEkeIFSll9FQ==
|
||||
=h6Mi
|
||||
owEBdgGJ/pANAwAIAQXMoUhwzjSpAawvYgpzZWNyZXQudHh0W7KUz1RoZSBOYXJ3
|
||||
aGFsIEJhY29ucyBhdCBNaWRuaWdodAqJATMEAAEIAB0WIQTUzObaA3ShseyNi1AF
|
||||
zKFIcM40qQUCW7KUzwAKCRAFzKFIcM40qQd2B/sEA5s/TiXM7GFplw2ocxegoIJS
|
||||
TfqeGJoYJt0r5W6j+p2TQ07nH0vadqBpqEIgK9f3VQvUL89Triq0PLp6AgNdB+GR
|
||||
a2M29x8hCEAZQX+Aj74YKfnso0F0EqP3e+Oj5oDrixstnPoy/hXlVbtnR9zvIJXh
|
||||
Eme/pxHkIHnc4a2JojEQQIxu7WvYoXKcrGYPyX0/pvyWGAHIKcPtFNcnO2oF3rp7
|
||||
GRzhc3tydqkIwevosHOsf4T0UoDb/4PAUvkfgbnSdbvGhAdLQtAMWl860lQRQ/WG
|
||||
oJaWC0hUOxzbSoHZeBH8+J8871e+jwE+j+6vk9lVj6Bz4c6O3mUOhxL+dkTw
|
||||
=FLte
|
||||
-----END PGP MESSAGE-----
|
||||
+4
-4
@@ -30,15 +30,15 @@
|
||||
<li>
|
||||
<a href="/wachtwoorden">Wachtwoorden</a>
|
||||
</li>
|
||||
<!--<li>
|
||||
<li>
|
||||
<a href="/oauth">OAuth</a>
|
||||
</li>-->
|
||||
</li>
|
||||
<li>
|
||||
<a href="/certificaten">Certificaten</a>
|
||||
</li>
|
||||
<!-- <li>
|
||||
<li>
|
||||
<a href="/encryptie">Encryptie</a>
|
||||
</li>-->
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
Moeilijkheidsgraad:
|
||||
|
||||
@@ -224,7 +224,7 @@
|
||||
<p>
|
||||
|
||||
<p>Haal van de keyserver onze publieke sleutel op met sleutel-ID
|
||||
<b>B69F77232CE5546445137725D555F2F5FA9E1C5A</b> (GPG noemt dit ook wel de user-ID). We hebben met onze private sleutel
|
||||
<b>D4CCE6DA0374A1B1EC8D8B5005CCA14870CE34A9</b> (GPG noemt dit ook wel de user-ID). We hebben met onze private sleutel
|
||||
een tekst versleuteld in
|
||||
<a href="static/secret.txt.asc" target="_blank">dit bestand</a>. Gebruik de publieke sleutel om dit bestand te ontsleutelen.</p>
|
||||
|
||||
@@ -282,7 +282,7 @@
|
||||
<p>Op die manier ontstaat er een web van vertrouwensrelaties. En als jij Tony vertrouwd, en Tony vertrouwd Steve. Dan
|
||||
kan je indirect ervan uitgaan dat de naam van de sleutel van Steve klopt. Op die manier kan je indirect een hele
|
||||
hoop sleutels vertrouwen. Op onze keyserver zie je bijvoorbeeld
|
||||
<a href="http://websec.paulwagener.nl:11371/pks/lookup?op=vindex&search=0XB69F77232CE5546445137725D555F2F5FA9E1C5A" target="_blank">wie er allemaal direct onze sleutel vertrouwd.</a>
|
||||
<a href="http://websec.paulwagener.nl:11371/pks/lookup?op=vindex&search=0XD4CCE6DA0374A1B1EC8D8B5005CCA14870CE34A9" target="_blank">wie er allemaal direct onze sleutel vertrouwd.</a>
|
||||
</p>
|
||||
|
||||
<img src="static/img/web_of_trust.gif">
|
||||
@@ -292,7 +292,7 @@
|
||||
sleutel weer opnieuw te versturen naar de keyserver.</p>
|
||||
|
||||
<div class="question">
|
||||
<span class="question-string">Gebruik je eigen sleutel om onze sleutel (sleutel-ID: B69F77232CE5546445137725D555F2F5FA9E1C5A) en de sleutel van
|
||||
<span class="question-string">Gebruik je eigen sleutel om onze sleutel (sleutel-ID: D4CCE6DA0374A1B1EC8D8B5005CCA14870CE34A9) en de sleutel van
|
||||
drie medestudenten te ondertekenen. Upload je ondertekening terug naar de keyserver. Plak je eigen sleutel-ID als
|
||||
antwoord hier.</span>
|
||||
{% include "points.html" with points=answers.answer_encryption_sign_keys.points max="5" %}
|
||||
@@ -310,3 +310,5 @@
|
||||
<a href="http://xkcd.com/364/" target="_blank">
|
||||
<img src="http://imgs.xkcd.com/comics/responsible_behavior.png">
|
||||
</a>
|
||||
|
||||
{% endblock %}
|
||||
@@ -29,11 +29,13 @@
|
||||
<li>
|
||||
<a href="/?wachtwoorden">Wachtwoorden</a>
|
||||
</li>
|
||||
|
||||
<!--
|
||||
<li>
|
||||
<a href="/?certificaten">Certificaten</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/?oauth">OAuth</a>
|
||||
</li>
|
||||
<!--
|
||||
<li>
|
||||
<a href="/?certificaten">Certificaten</a>
|
||||
</li>
|
||||
|
||||
+9
-31
@@ -111,12 +111,6 @@
|
||||
<img src="static/img/oauth_register.png" style="width: 50%">
|
||||
</figure>
|
||||
|
||||
<div class="question">
|
||||
<span class="question-string">Wat is de client_id die je hebt geregistreerd?</span>
|
||||
{% include "points.html" with points=answers.answer_oauth_client_id.points max="5" %}
|
||||
<input class="question-input" name="answer_oauth_client_id" value="{{ answers.answer_oauth_client_id.string }}"></input>
|
||||
</div>
|
||||
|
||||
<p>Elke OAuth server heeft twee endpoints (lees: URL's): de authorisatie endpoint en de token endpoint. Hieronder zie je de
|
||||
endpoints van een aantal bekende servers:</p>
|
||||
|
||||
@@ -128,8 +122,8 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Deze cursus</td>
|
||||
<td>http://websec.paulwagener.nl/o/authorize/</td>
|
||||
<td>http://websec.paulwagener.nl/o/token/</td>
|
||||
<td>https://websec.paulwagener.nl/o/authorize/</td>
|
||||
<td>https://websec.paulwagener.nl/o/token/</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>GitHub</td>
|
||||
@@ -179,13 +173,11 @@
|
||||
|
||||
<p>Voor deze site is de authorisatie URL:
|
||||
<br>
|
||||
<span class="url">http://websec.paulwagener.nl/o/authorize/?client_id=(CLIENT_ID)&response_type=token</span>
|
||||
<span class="url">https://websec.paulwagener.nl/o/authorize/?client_id=(CLIENT_ID)&response_type=token</span>
|
||||
</p>
|
||||
|
||||
<div class="question">
|
||||
<span class="question-string">Authoriseer met je eigen client id. Welke access token heb je gekregen?</span>
|
||||
{% include "points.html" with points=answers.answer_oauth_implicit_access_token.points max="5" %}
|
||||
<input class="question-input" name="answer_oauth_implicit_access_token" value="{{ answers.answer_oauth_implicit_access_token.string }}"></input>
|
||||
</div>
|
||||
|
||||
<p class="hint">
|
||||
@@ -194,8 +186,6 @@
|
||||
|
||||
<div class="question">
|
||||
<span class="question-string">Hoeveel seconden is deze token code geldig?</span>
|
||||
{% include "points.html" with points=answers.answer_oauth_implicit_access_token_expires.points max="5" %}
|
||||
<input class="question-input" name="answer_oauth_implicit_access_token_expires" value="{{ answers.answer_oauth_implicit_access_token_expires.string }}"></input>
|
||||
</div>
|
||||
|
||||
<p>De access token kan je nu gebruiken om een request te doen naar
|
||||
@@ -211,8 +201,6 @@
|
||||
|
||||
<div class="question">
|
||||
<span class="question-string">Wat is de geheime code die gestuurd wordt als je de API aanroept?</span>
|
||||
{% include "points.html" with points=answers.answer_oauth_api_hello.points max="10" %}
|
||||
<input class="question-input" name="answer_oauth_api_hello" value="{{ answers.answer_oauth_api_hello.string }}"></input>
|
||||
</div>
|
||||
|
||||
<p class="hint">
|
||||
@@ -246,8 +234,6 @@
|
||||
|
||||
<div class="question">
|
||||
<span class="question-string">Welke authorisatie code heb je gekregen?</span>
|
||||
{% include "points.html" with points=answers.answer_oauth_authorization_code.points max="5" %}
|
||||
<input class="question-input" name="answer_oauth_authorization_code" value="{{ answers.answer_oauth_authorization_code.string }}"></input>
|
||||
</div>
|
||||
|
||||
<img src="static/img/oauth_authorization_code.png" style="width: 25%; float: right">
|
||||
@@ -283,8 +269,6 @@
|
||||
|
||||
<div class="question">
|
||||
<span class="question-string">Copy paste de response die je hebt gekregen waar de refresh token in staat</span>
|
||||
{% include "points.html" with points=answers.answer_oauth_refresh_token.points max="5" %}
|
||||
<textarea class="question-input" name="answer_oauth_refresh_token">{{ answers.answer_oauth_refresh_token.string }}</textarea>
|
||||
</div>
|
||||
|
||||
<img src="static/img/oauth_refresh_token.png" style="float: right; width: 25%">
|
||||
@@ -300,9 +284,9 @@
|
||||
<p>Bij Google hebben we een OAuth client geregistreerd en de volgende gegevens gekregen:</p>
|
||||
|
||||
<code style="display: block;">
|
||||
Client id: 799427728270-ahr6bg713mtkh2htskbmqko8hpheq1md.apps.googleusercontent.com<br>
|
||||
Client secret: 3W9FcQefBmhX7CT1FgzqiCdR<br>
|
||||
Refresh token: 1/WfdEEjWgj5Lm8p6wZzoTCeirQz7e4hMDIxvOkdvSjsU<br></code>
|
||||
Client id: 507532281075-92u6kon3r2kpesqbadmt29cnlvtpjbkh.apps.googleusercontent.com<br>
|
||||
Client secret: yTmMOl9GfCFl-F4QoESfi7HT<br>
|
||||
Refresh token: 1/EpIRGrHcCV8wi54zGwJoKUklSTkndrJvj1mixqNrgkY"<br></code>
|
||||
|
||||
<p>Met deze gegevens kunnen we weer een POST doen naar de token endpoint (voor Google: https://accounts.google.com/o/oauth2/token)
|
||||
om een access token te genereren. Dit keer hoeven we geen redirect_uri mee te sturen en moeten we de grant_type parameter
|
||||
@@ -314,16 +298,14 @@
|
||||
<img src="static/img/oauth_google_refresh.png" class="screenshot" style="width: 70%; margin: 20px; display: block">
|
||||
|
||||
<p>Gebruik de access token die je krijgt om een API call te doen naar
|
||||
<span class="url">https://www.googleapis.com/calendar/v3/calendars/websecpaulwagener@gmail.com/events</span>. Vergeet niet weer de juiste
|
||||
Authorization header te gebruiken om je access token in te zetten! Als je het goed doet krijg je alle events uit onze Google
|
||||
Calender te zien in JSON formaat.</p>
|
||||
<span class="url">https://www.googleapis.com/calendar/v3/calendars/websec.paulwagener@gmail.com/events</span>. Vergeet niet weer de juiste Authorization
|
||||
header te gebruiken om je access token in te zetten! Als je het goed doet krijg je alle events uit onze Google Calender
|
||||
te zien in JSON formaat.</p>
|
||||
|
||||
<img src="static/img/oauth_google_call_api.png" class="screenshot" style="width: 70%; margin: 20px; display: block">
|
||||
|
||||
<div class="question">
|
||||
<span class="question-string">Wat is de code die in de Geheime afspraak staat? </span>
|
||||
{% include "points.html" with points=answers.answer_oauth_calendar_secret_code.points max="10" %}
|
||||
<input class="question-input" name="answer_oauth_calendar_secret_code" value="{{ answers.answer_oauth_calendar_secret_code.string }}"></input>
|
||||
</div>
|
||||
|
||||
<p>Genoeg tutorial, tijd voor het echte werk! We gaan handmatig het hele OAuth proces doorlopen voor een Google API. Dat mag
|
||||
@@ -350,8 +332,6 @@
|
||||
<div class="question">
|
||||
<span class="question-string">Beschrijf de HTTP requests die je hebt gemaakt om de token te krijgen EN de API te gebruiken (en ook de uitkomst van die
|
||||
requests). Gevoelige data mag je met ***** censureren.</span>
|
||||
{% include "points.html" with points=answers.answer_oauth_google_requests.points max="15" %}
|
||||
<textarea class="question-input" name="answer_oauth_google_requests" style="height: 200px">{{ answers.answer_oauth_google_requests.string }}</textarea>
|
||||
</div>
|
||||
|
||||
<h3>Mini webapp</h3>
|
||||
@@ -364,8 +344,6 @@
|
||||
|
||||
<div class="question">
|
||||
<span class="question-string">Plak de broncode van je webapplicatie in het tekstvak</span>
|
||||
{% include "points.html" with points=answers.answer_oauth_web_app.points max="20" %}
|
||||
<textarea class="question-input" name="answer_oauth_web_app" style="height: 200px">{{ answers.answer_oauth_web_app.string }}</textarea>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
@@ -6,9 +6,25 @@ from quiz.models import LetsEncryptChallenge
|
||||
from oauth2_provider.views.generic import ProtectedResourceView
|
||||
import datetime
|
||||
import pytz
|
||||
from django.contrib.auth import login
|
||||
from django.contrib.auth.models import User
|
||||
|
||||
|
||||
def home(request, url):
|
||||
|
||||
if not request.user.is_authenticated:
|
||||
|
||||
try:
|
||||
user = User.objects.get()
|
||||
except User.DoesNotExist:
|
||||
user = User.objects.create_user(
|
||||
'cursist', 'cursist@websec.paulwagener.nl', 'cursist')
|
||||
user.save()
|
||||
|
||||
login(request, user)
|
||||
|
||||
# Make sure there is always a user
|
||||
|
||||
if url == 'sql' or url == '':
|
||||
template = 'sql.html'
|
||||
elif url == 'xss':
|
||||
|
||||
Reference in new issue
Block a user