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.
import os
import hmac
import flask
import requests
from urllib.parse import urlparse
from flask import Flask, render_template, request, flash, abort, jsonify
from modules import database
from modules import variables
app = Flask(__name__)
db = database.Database()
@app.route("/internal-api/v1/reseptit", methods=['GET'])
def recipes_api():
ip_address = flask.request.remote_addr
if ip_address not in ('127.0.0.1', '::1', 'localhost'):
abort(404)
return jsonify({
'reseptit': [
{
'Salainen resepti': [
'Sokeria',
'Jauhoja',
'Hakatemia lippu %s' % os.environ['FLAG']
]
}
]
})
@app.route("/api/user/<user_mail>")
def user_api(user_mail):
ip_address = flask.request.remote_addr
if ip_address not in ('127.0.0.1', '::1', 'localhost'):
abort(404)
user_mail = request.view_args["user_mail"]
ret_user = db.get_user(user_mail)
if ret_user != None:
return jsonify({ 'Sposti vapaa': 'False' })
else:
return jsonify({ 'Sposti vapaa': 'True' })
@app.route("/varmista", methods=['POST'])
def varmista():
sposti = request.form.get("sposti")
allekirjoitus = request.headers.get('X-Signature')
if laskeAllekirjoitusJaVertaa(sposti, allekirjoitus):
resp = requests.get("http://127.0.0.1:5000/api/user/"+sposti)
return jsonify(resp.json())
else:
return jsonify({'Allekirjoitus':'Virheellinen'})
@app.route("/", methods=['GET'])
def index():
return render_template("index.html")
# Apufunktio joka laskee ja vertaa allekirjoituksen annettuun arvoon
def laskeAllekirjoitusJaVertaa(sposti, allekirjoitus):
try:
key = variables.secret
hmac_value = hmac.new(key=key.encode(), msg=sposti.encode(), digestmod="sha256")
calculated_signature = hmac_value.digest().hex()
if calculated_signature == allekirjoitus:
return True
return False
except Exception as e:
print(e)
return False
if __name__ == '__main__':
app.run(debug=False, host='0.0.0.0', port=5000)
Valmis ryhtymään eettiseksi hakkeriksi?
Aloita jo tänään.
Hakatemian jäsenenä saat rajoittamattoman pääsyn Hakatemian moduuleihin, harjoituksiin ja työkaluihin, sekä pääset discord-kanavalle jossa voit pyytää apua sekä ohjaajilta että muilta Hakatemian jäseniltä.