Writeup du Dojo #37 de YesWeHack — injection SQL en aveugle temporelle sur un forum, exploitation via INSERT plutôt que SELECT.

Description

L’injection SQL (SQLi) est une vulnérabilité de sécurité web permettant à un attaquant d’interférer avec les requêtes d’une base de données. Les impacts potentiels incluent la lecture de données non autorisées, la modification de contenu ou la suppression d’informations.

Code Vulnérable

Le challenge Dojo #37 — Hacker Forum expose le pattern suivant :

$db->exec(
    sprintf("UPDATE users SET banned = 1 WHERE username = '%s'", $comment['author'])
);

La requête est vulnérable car elle concatène directement la valeur $comment['author'] sans utiliser de requête préparée.

Proof of Concept

Les payloads de blind time-based injection classiques ont été testés en premier. L’approche via INSERT s’est révélée plus efficace dans les contraintes du challenge.

La technique clé consiste à injecter des données traitées par la fonction fetchArray(), permettant l’extraction d’informations sensibles via la sortie de addComment().

Flag obtenu

Impacts

Une injection SQL permet à un attaquant de :

Mitigation

Utiliser des requêtes paramétrées (prepared statements) au lieu de la concaténation de chaînes.

Vulnérable :

SELECT * FROM products WHERE category = '" + input + "'

Sécurisé :

PreparedStatement stmt = conn.prepareStatement(
    "SELECT * FROM products WHERE category = ?"
);
stmt.setString(1, input);
← retour aux articles