writeup

404 CTF writeup - Super enQuête Libre [1/4] - SQL

22/05/2026 Mis à jour le 12/06/2026
Manipulation de base de données SQL

L'objectif de cette première mission est de retrouver l'identifiant du badge actuellement utilisé par la cible : Noel Laurent. Pour ce faire, vous devez interagir avec une base de données (généralement via une interface textuelle ou un prompt SQL après connexion au serveur) et lier les informations de plusieurs tables.

NB :

  • Il faut avoir des notions en SQL.
  • C'est du sqlite donc la syntaxe change par apport au SQL.
  • Il faut ce reconnecter souvent, car bug de déconnexion intempestive.

1. Analyse de l'objectif

La base de données recense le personnel et les étudiants d'une école. Pour trouver le badge actuel d'une personne, la structure classique d'une telle base de données implique généralement trois concepts :

  • La table des individus (pour trouver l'identifiant unique de Noel Laurent).
  • La table des badges (qui fait le lien entre un individu et un badge).
  • Un système de statut ou de date (pour savoir quel badge est actuellement actif et les salles visités.

2. Phase d'exploration (Reconnaissance SQL)

Une fois connecté au serveur via la commande sur le terminal.

nc challenge.404ctf.fr 10401

la première étape consiste à cartographier la base de données pour comprendre les tables à disposition.

Lister les tables

Selon le SGBD utilisé (souvent SQLite ou MySQL dans ce genre de défi), on cherche à lister les tables :

.tables

tables sql

Cette commande retourne les tables suivantes (noms typiques pour ce type de challenge) :

  • Person
  • badge
  • AccessLog
  • Room

C'est de c'est tables don nous avons besoin afin de rassembler toutes les infos afin de résoudre le challenge.

Inspecter la structure des tables

Il faut ensuite comprendre comment elles se lient entre elles (les clés primaires et étrangères) :

PRAGMA table_info(Person);
PRAGMA table_info(badge);

3. Stratégie de requêtage

Étape A : Trouver l'utilisateur

Il faut d'abord identifier comment est enregistré "Noel Laurent". Attention aux inversions nom/prénom dans la base de données.

SELECT * FROM Person WHERE last_name = 'Noel' AND first_name = 'Laurent';

liste des utilisateurs table sql

Cette requête vous permet d'obtenir l'identifiant unique de la cible, par exemple : user_id = 38.

Étape B : Trouver le badge actuel

Une fois l'identifiant en main, il faut chercher dans la table des badges celui qui lui est associé et qui est marqué comme actif. Les bases de données de CTF utilisent souvent un booléen (actif = 1, valide = true) ou se basent sur la date d'expiration.

Si la table badges contient directement l'ID de l'utilisateur et un statut :

SELECT * FROM badge WHERE person_id = 38;

Voici la structure de la requête finale qui permet d'obtenir directement le badge actif de Laurent Noel, ainsi que la valeur à utiliser pour votre flag.

D'après les résultats de votre exploration :

  • L'utilisateur s'appelle en réalité Laurent Noel (le nom de famille est Noel et le prénom est Laurent), son identifiant est person_id = 38.
  • La colonne qui gère le statut actif se nomme active (et non actif).

Requête SQL finale

Pour obtenir directement le bon résultat en une seule fois, vous pouvez exécuter la requête suivante :

SELECT badge_id 
FROM Badge 
WHERE person_id = 38 
  AND active = 1;

Résultat et Flag

Le résultat affiché par votre dernière commande montre deux lignes pour cet utilisateur :

  • Le badge 56 qui est expiré et inactif (active = 0).
  • Le badge 165 qui est valide jusqu'en septembre 2026 et actif (active = 1).

Le badge actuellement utilisé est donc le 165.

Le flag à soumettre est :

404CTF{165}