Ressources pour développeur web

Théme de la semaine : Outils Pentest

Exercices cybersécurité : Trouver la faille de codes PHP vulnérables

Temps de lecture estimé : 4 minutes
Accueil CyberSécurité Exercices cybersécurité : Trouver la faille de codes PHP vulnérables

La sécurité web n’est pas un sujet réservé aux experts en cybersécurité. Au contraire, elle doit faire partie des réflexes de base de tout développeur. C’est justement ce que nous allons travailler avec ces exercices sous forme de jeu pédagogique. Vous allez analyser des extraits de code PHP et tenter de repérer la faille avant de découvrir la correction.

Bienvenue dans ces exercices de cybersécurité spécial développeurs web. L’objectif est simple : observer, réfléchir et apprendre à détecter les erreurs avant qu’elles ne deviennent de véritables problèmes.

Pourquoi apprendre à repérer les failles est essentiel

Lorsque vous développez un site web, vous manipulez constamment des données venant de l’utilisateur :

  • formulaires
  • paramètres d’URL
  • cookies
  • fichiers uploadés
  • etc…

Et le problème est simple : l’utilisateur peut envoyer n’importe quoi.

Un pirate peut injecter du code, modifier des paramètres ou tester des milliers de combinaisons. Si votre code ne vérifie pas correctement ces données, il devient vulnérable.

👉 Découvrez Comment vérifier si votre site web a été piraté.

C’est pour cette raison que les développeurs expérimentés passent beaucoup de temps à analyser leur propre code comme un attaquant le ferait. Ils se posent des questions comme :

  • Que se passe-t-il si l’utilisateur modifie cette valeur ?
  • Peut-il injecter du code ?
  • Peut-il accéder à des données qui ne lui appartiennent pas ?

Ce type de raisonnement s’apprend avec la pratique. Et c’est exactement ce que vous allez faire ici avec des exercices de sécurité web de niveau progressif. Aucun outil de pentesting ne sera utile et utilisé.

👉 Pour aller plus loin : Les 10 Failles les plus courantes

Comment fonctionne ces exercices de sécurité web

Dans chaque section vous trouverez :

  1. un extrait de code PHP volontairement vulnérable
  2. une question : saurez-vous trouver la faille ?
  3. une explication détaillée
  4. une version corrigée du code

La difficulté augmente progressivement. Les premiers exercices sont très simples, puis les failles deviennent plus subtiles.

Jeu et exercices de cybersécurité web

Prenez le temps d’observer le code avant de lire la réponse. Même si vous ne trouvez pas tout de suite, ce type d’exercice cybersécurité est extrêmement efficace pour progresser. Amusez vous bien !

Exercice de cybersécurité web N°1

Le code suivant permet d’afficher un utilisateur depuis la base de données.

Saurez-vous repérer la faille ?

$id = $_GET['id'];
$query = "SELECT * FROM users WHERE id = $id";
$result = mysqli_query($conn, $query);
Afficher la réponse

La faille vient du paramètre :

$_GET['id']

Cette valeur vient directement de l’URL. Par exemple :

site.com/profil.php?id=5

Le problème est que cette valeur est utilisée directement dans la requête SQL.

Un attaquant pourrait envoyer ceci :

?id=1 OR 1=1

La requête deviendrait :

SELECT * FROM users WHERE id = 1 OR 1=1

Résultat : la base de données renverrait tous les utilisateurs.

C’est une injection SQL, l’une des failles les plus connues du web.

👉 Découvrez Comment vous protéger d’une injection SQL

Correction

La solution consiste à utiliser des requêtes préparées.

$stmt = $conn->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $_GET['id']);
$stmt->execute();
$result = $stmt->get_result();

Les requêtes préparées empêchent l’injection de code SQL.

Exercice de cybersécurité web N°2

Ce code affiche le pseudo d’un utilisateur.

echo "Bienvenue " . $_GET['pseudo'];

Que peut-il se passer ?

Afficher la réponse

Encore une fois, la valeur vient de l’utilisateur. Un attaquant pourrait donc envoyer :

?pseudo=<script>alert('hack')</script>

Le navigateur exécutera alors ce script.

  • C’est une attaque XSS (Cross Site Scripting).

Elle permet par exemple de :

  • voler des cookies
  • rediriger les visiteurs
  • injecter du code malveillant

Correction

Il faut échapper les caractères HTML.

echo "Bienvenue " . htmlspecialchars($_GET['pseudo']);

La fonction htmlspecialchars() transforme les balises en texte.

Les outils tels que Dalfox ou Owasp ZAP permettent de détecter des failles XSS.

Exercice de cybersécurité web N°3

Voici un système de pages dynamique.

$page = $_GET['page'];
include($page . ".php");

Que pourrait faire un attaquant ?

Afficher la réponse

L’utilisateur contrôle le fichier à charger.

Il pourrait essayer :

?page=../../etc/passwd

ou même charger un script externe.

C’est une faille d’inclusion de fichier.

Correction

Il faut limiter les pages autorisées.

$pages = ["home", "contact", "about"];
$page = $_GET['page'];
if(in_array($page, $pages)) {
    include($page . ".php");
} else {
    echo "Page invalide";
}

Exercice de cybersécurité web N°4

$password = $_POST['password'];
mysqli_query($conn, "INSERT INTO users (email,password) VALUES ('$email','$password')");

Pourquoi ce script est dangereux ?

Formation web et informatique - Alban Guillier - Formateur

Des formations informatique pour tous !

Débutant ou curieux ? Apprenez le développement web, le référencement, le webmarketing, la bureautique, à maîtriser vos appareils Apple et bien plus encore…

Formateur indépendant, professionnel du web depuis 2006, je vous accompagne pas à pas et en cours particulier, que vous soyez débutant ou que vous souhaitiez progresser. En visio, à votre rythme, et toujours avec pédagogie.

Découvrez mes formations Qui suis-je ?
Afficher la réponse

Les mots de passe sont stockés en clair dans la base de données.

Si la base est piratée, tous les comptes sont compromis.

👉 Pour aller plus loin : Hasher un mot de passe et participer à notre Challenge : Craquer un hash

Correction

Il faut hacher les mots de passe.

$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
mysqli_query($conn, "INSERT INTO users (email,password) VALUES ('$email','$password')");

Exercice de cybersécurité web N°5

move_uploaded_file($_FILES['file']['tmp_name'],
"uploads/" . $_FILES['file']['name']);

Que pourrait faire un pirate ?

Afficher la réponse

Il pourrait uploader un fichier :

shell.php

Ensuite accéder à :

site.com/uploads/shell.php

et exécuter du code PHP.

Correction

Limiter les types de fichiers.

$allowed = ["jpg","png","gif"];
$ext = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);
if(in_array($ext, $allowed)){
    move_uploaded_file($_FILES['file']['tmp_name'],
    "uploads/" . uniqid() . "." . $ext);
}

Exercice de cybersécurité web N°6

$age = $_POST['age'];
if($age > 18){
  echo "Accès autorisé";
}

Quel est le problème ?

Afficher la réponse

Un utilisateur peut envoyer :

age=abc

ou un script.

Le code ne vérifie pas le type de donnée.

Correction

$age = filter_input(INPUT_POST, 'age', FILTER_VALIDATE_INT);
if($age !== false && $age > 18){
  echo "Accès autorisé";
}

Exercice de cybersécurité web N°7

session_start();
$_SESSION['user_id'] = $user_id;

Quelle est la faille ?

Afficher la réponse

Si l’identifiant de session est volé, un attaquant peut usurper la session.

Il faut régénérer l’ID de session après connexion.

Correction

session_start();
session_regenerate_id(true);
$_SESSION['user_id'] = $user_id;

👉 Pour en savoir plus : Sécuriser une session PHP

Exercice de cybersécurité web N°8

header("Location: " . $_GET['redirect']);

Quel est le problème avec cette redirection ?

Afficher la réponse

Un attaquant peut créer un lien :

site.com/login.php?redirect=https://site-pirate.com

Après connexion, l’utilisateur est redirigé vers un site malveillant.

Correction

Limiter les redirections autorisées.

$allowed = ["dashboard.php","profile.php"];
$redirect = $_GET['redirect'];
if(in_array($redirect,$allowed)){
  header("Location: $redirect");
}

Exercice de cybersécurité web N°9

if(isset($_POST['email'])){
  updateEmail($_POST['email']);
}

Où est la faille dans ce code PHP ?

Afficher la réponse

Un attaquant pourrait créer un formulaire caché qui modifie l’email d’un utilisateur connecté.

C’est une attaque CSRF.

Correction

Utiliser un token CSRF.

if($_POST['token'] === $_SESSION['token']){
  updateEmail($_POST['email']);
}

👉 Pour aller lus loin : Protection clickjacking et CSRF

Exercice de cybersécurité web N°10

$data = unserialize($_COOKIE['data']);

Questions difficile : Ou si situe le problème ou la faille ?

Afficher la réponse

La fonction unserialize() peut créer des objets PHP.

Un attaquant peut injecter un objet malveillant et déclencher du code.

C’est une faille très avancée appelée PHP Object Injection.

Correction

Éviter unserialize() avec des données utilisateur.

Utiliser JSON :

$data = json_decode($_COOKIE['data'], true);

👉Découvrez le cookie partitionné avec PHP 8.5 : Le Guide complet

La sécurité web n’est pas un sujet que l’on apprend en une journée. Elle se développe progressivement, à force d’observer du code, de comprendre les attaques et surtout de corriger ses propres erreurs.

Ce type d’exercice sécurité web est particulièrement efficace car il vous oblige à réfléchir comme un attaquant. Vous apprenez à vous méfier des entrées utilisateur, à valider les données et à adopter des pratiques de développement plus sûres.

Si vous souhaitez vraiment progresser, je vous conseille d’analyser votre propre code avec un regard critique. Avec le temps, vous verrez apparaître un réflexe presque instinctif : celui de vous demander, à chaque ligne importante, « que se passerait-il si quelqu’un essayait de détourner ce code ? ».

Et croyez-moi : ce simple réflexe fait toute la différence entre un développeur qui code… et un développeur qui code en sécurité.