URL-injektio

URL-injektio + Epäturvalliset tietoturvakontrollit

Keskitaso
45 min

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)

Tehtävät

Flag

Löydä lippu (flag) labraympäristöstä ja syötä se alle.

hakatemia pro

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ä.