OWASP Top Ten 2021 - Vulnérabilités (Version Apprenant)

Avertissement légal : Cette page présente des vulnérabilités à des fins éducatives seulement. Toute utilisation non autorisée est illégale et peut entraîner des poursuites pénales.

# OWASP Top Ten 2021 - Vulnérabilités

## 1. Broken Access Control (A01:2021)

Permet à des utilisateurs non autorisés d'accéder ou de modifier des ressources sensibles.

Exemple de code vulnérable :

<?php
if ($_GET['isAdmin'] == 'true') {
echo "Bienvenue, administrateur";
}
?>

Code corrigé :

<?php
session_start();
if (!isset($_SESSION['role']) || $_SESSION['role'] != 'admin') {
header("Location: unauthorized.php");
exit();
}
echo "Bienvenue, administrateur";
?>

## 2. Cryptographic Failures (A02:2021)

Problèmes liés à une mauvaise gestion des données sensibles.

Exemple de code vulnérable :

<?php
$token = "123456"; // Token non sécurisé
echo "Votre token : $token";
?>

Code corrigé :

<?php
$token = bin2hex(random_bytes(16));
echo "Votre token : $token";
?>

## 3. Injection (A03:2021)

Exploitation de failles dans la gestion des entrées utilisateur pour exécuter des commandes non prévues.

Exemple de code vulnérable :

<?php
$id = $_GET['id'];
$query = "DELETE FROM users WHERE id = $id";
mysqli_query($conn, $query);
?>

Code corrigé :

<?php
$id = intval($_GET['id']);
$query = "DELETE FROM users WHERE id = ?";
$stmt = $conn->prepare($query);
$stmt->bind_param("i", $id);
$stmt->execute();
?>

## 4. Insecure Design (A04:2021)

Absence de considération pour les menaces potentielles dès la phase de conception.

Illustration du processus :

Le processus vulnérable néglige les étapes critiques comme l'analyse des menaces et les tests de sécurité.

## 5. Security Misconfiguration (A05:2021)

Erreurs dans les configurations de sécurité, comme des paramètres par défaut non sécurisés.

Exemple de code vulnérable :

<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
?>

Code corrigé :

<?php
ini_set('display_errors', 0);
error_reporting(0);
?>

## 6. Vulnerable and Outdated Components (A06:2021)

Utilisation de composants obsolètes ou vulnérables exposant l'application à des attaques.

Exemple de code vulnérable :

<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.13.3</version> <!-- Version vulnérable -->
</dependency>

Code corrigé :

<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.20.0</version> <!-- Version sécurisée -->
</dependency>

## 7. Identification and Authentication Failures (A07:2021)

Failles dans les mécanismes d'authentification.

Exemple de code vulnérable :

<?php
if ($_POST['password'] == 'password123') {
echo "Authentifié !";
}
?>

Code corrigé :

<?php
if (password_verify($_POST['password'], $hashedPassword)) {
echo "Authentifié !";
}
?>

## 8. Software and Data Integrity Failures (A08:2021)

Manque de vérification des mises à jour logicielles ou des données critiques.

Exemple de code vulnérable :

<?php
$file = $_GET['file'];
include($file); // Permet l'inclusion de fichiers non sécurisés
?>

Code corrigé :

<?php
$allowed_files = ['header.php', 'footer.php'];
$file = $_GET['file'];
if (in_array($file, $allowed_files)) {
include($file);
} else {
echo "Fichier non autorisé !";
}
?>

## 9. Security Logging and Monitoring Failures (A09:2021)

Absence de journalisation ou de surveillance pour détecter les activités malveillantes.

Exemple de code vulnérable :

<?php
// Aucune journalisation en cas d'échec de connexion
if ($login_failed) {
echo "Échec de connexion";
}
?>

Code corrigé :

<?php
if ($login_failed) {
error_log("Tentative de connexion échouée pour l'utilisateur : $username", 0);
echo "Échec de connexion";
}
?>

## 10. Server-Side Request Forgery (SSRF) (A10:2021)

Permet à un attaquant de forcer un serveur à effectuer des requêtes non prévues.

Exemple de code vulnérable :

<?php
$url = $_GET['url'];
$response = file_get_contents($url); // Requête non vérifiée
echo $response;
?>

Code corrigé :

<?php
$url = $_GET['url'];
$allowed_domains = ['example.com', 'mysite.com'];
$parsed_url = parse_url($url);
if (in_array($parsed_url['host'], $allowed_domains)) {
$response = file_get_contents($url);
echo $response;
} else {
echo "Domaine non autorisé !";
}
?>