O desafio consiste em uma espécie de colisão de hash. Temos acesso ao código do servidor HTTP rodando.
app.py
from flask import Flask,render_template,request, redirect
import sqlite3
import hashlib
app = Flask(__name__)
@app.route("/")
def mainHandler():
return render_template("index.html")
@app.route("/review")
def reviewHandler():
con = sqlite3.connect("shopping.db")
cur = con.cursor()
item = request.args.get("item")
if item == "Flag":
return("Blacklisted term detected")
hash = hashlib.md5(item.encode()).hexdigest()
result = cur.execute("SELECT * FROM items WHERE id=?", (hash[0:6],))
try:
result = result.fetchone()
item = result[1]
except:
return (redirect("/"))
return render_template("review.html",placeholder=item,price=result[2],desc=result[3],img=result[4])
if __name__=="__main__":
app.run(host="0.0.0.0",port=8000,debug=False)
Podemos observar que não é possível buscar o termo Flag na rota de /review, e o item é passado em uma função hash, transformado uma string hexadecimal e os 6 primeiros caracteres são o ID do item.
app.py
item = request.args.get("item")
if item == "Flag":
return("Blacklisted term detected")
hash = hashlib.md5(item.encode()).hexdigest()
result = cur.execute("SELECT * FROM items WHERE id=?", (hash[0:6],))
Como somente os 6 primeiros caracteres são levados em conta, podemos tentar achar uma string cujo hash comece com os mesmos 6 caracteres do hash de Flag.