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, redirectimport sqlite3import hashlibapp =Flask(__name__)@app.route("/")defmainHandler():returnrender_template("index.html")@app.route("/review")defreviewHandler(): 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("/"))returnrender_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.