Principe:
Exploiter une injection SQLite dans un bot Discord
Le challenge
Le challenge nous demande de faire cracher un flag à un bot
(les
commandes utilisées sont ici
, mais je n'ai pas
les sources du bot)
Le bot
Envoyons un MP au bot sur le serveur (et pas à mhackthemhacktic4s!)
Le bot nous donne alors des commandes
La commande "chercher" semble être la seule ayant réellement un effet utile
On peut chercher "tout"
(% étant souvent un wildcard de LIKE, * marche aussi parfois),
mais à part un premier RickRoll, on ne trouve rien
Injection de commande?
J'ai alors opté pour une injection de commande, potentiellement en SQLite,
mais pas grand chose n'en ressort
Pourquoi? Parce que les bots Discord sont souvent auto-portants, et que SQLite permet
de stocker la DB (avec le flag) sur la même instance que le code du bot. Et souvent,
les bots passent les commandes utilisateurs via la CLI à leur backend (autoporté)
Donc, ça se tentait
SQLite ?
Je teste alors une injection SQL(ite) simple: ça passe, le "1" du UNION apparait en fin de liste
Il faut donc maintenant trouver dans quelle table est stockée le flag
Avant de creuser à l'aveugle, mieux vaut savoir quel SGDB est utilisé…
et en fait, il s'agit de MariaDB! (= MySQL, en gros)
Exploiter l'injection SQL
On cherche donc la Database où peut se trouver le flag
Puis la table
Puis la colonne
Et on va SELECT cette valeur pour avoir le flag:
404CTF{D1sc0rd_&_injection_SQL}
Un calembour gratuit, pour finir ce writeup