HAKATEMIA
02Haasteet

URL-injektio + Epäturvalliset tietoturvakontrollit

Keskitaso45MIN

Syvennä osaamistasi ja yritä ohittaa sovellukseen sisäänrakennettu turvamekanismi. Tämän jälkeen voit suorittaa klassisen URL-injektio hyökkäyksen ja ratkaista labran. Kyseinen labra perustuu oikean elämän sovellukseen, jossa kehittäjät käyttivät samanlaisia suojamekanismeja, tietämättä näiden olevan täysin murrettavissa.

Lue blogi täältä, jos jäät jumiin!

Sovelluksen lähdekoodit löytyvät alla.

PY
1import os
2import hmac
3import flask
4import requests
5
6from urllib.parse import urlparse
7from flask import Flask, render_template, request, flash, abort, jsonify
8from modules import database
9from modules import variables
10
11app = Flask(__name__)
12db = database.Database()
13
14@app.route("/internal-api/v1/reseptit", methods=['GET'])
15def recipes_api():
16    ip_address = flask.request.remote_addr
17    if ip_address not in ('127.0.0.1', '::1', 'localhost'):
18        abort(404)
19    
20    return jsonify({
21        'reseptit': [
22            {
23                'Salainen resepti': [
24                    'Sokeria',
25                    'Jauhoja',
26                    'Hakatemia lippu %s' % os.environ['FLAG']
27                ]
28            }
29        ]
30    })
31
32@app.route("/api/user/<user_mail>")
33def user_api(user_mail):
34    ip_address = flask.request.remote_addr
35    if ip_address not in ('127.0.0.1', '::1', 'localhost'):
36      abort(404)
37    user_mail = request.view_args["user_mail"]
38    ret_user = db.get_user(user_mail)
39    if ret_user != None:
40      return jsonify({ 'Sposti vapaa': 'False' })
41    else:
42      return jsonify({ 'Sposti vapaa': 'True' })
43
44@app.route("/varmista", methods=['POST'])
45def varmista():
46  sposti = request.form.get("sposti")    
47  allekirjoitus = request.headers.get('X-Signature')
48  if laskeAllekirjoitusJaVertaa(sposti, allekirjoitus):
49    resp = requests.get("http://127.0.0.1:5000/api/user/"+sposti)
50    return jsonify(resp.json())
51  else:
52    return jsonify({'Allekirjoitus':'Virheellinen'}) 
53
54@app.route("/", methods=['GET'])
55def index():
56  return render_template("index.html")
57
58# Apufunktio joka laskee ja vertaa allekirjoituksen annettuun arvoon
59def laskeAllekirjoitusJaVertaa(sposti, allekirjoitus):
60  try:
61    key = variables.secret
62    hmac_value = hmac.new(key=key.encode(), msg=sposti.encode(), digestmod="sha256")
63    calculated_signature = hmac_value.digest().hex()
64    if calculated_signature == allekirjoitus:
65      return True
66
67    return False
68  except Exception as e:
69    print(e)
70    return False
71
72if __name__ == '__main__':
73  app.run(debug=False, host='0.0.0.0', port=5000)
74
1 / 2
Hakatemia Pro

Hakkeroinnin oppiminen alkaa tästä

Sadat interaktiiviset kurssit, virtuaalilabrat ja CTF-haasteet selaimessasi. Aloita ilmainen kokeilu ilman korttitietoja.