Missions et directives publiques

Le développement sécurisé en pratique

Explorez nos directives de développement sécurisé pour comprendre et atténuer les vulnérabilités logicielles telles que l'OWASP Top 10, et plongez dans des missions de formation guidées pour vous exercer sur des simulations d'applications réelles.

Réserver une démo

Parcourir toutes les missions

Voir plus
Évolutif et engageant

Injection SQL

Un utilisateur nous a signalé avoir exploité une vulnérabilité par injection SQL dans la fonctionnalité de recherche de transactions de notre solution bancaire en ligne. Il a indiqué être parvenu à consulter les transactions d'autres utilisateurs et a souligné que cette faille pourrait permettre à un attaquant d'effectuer des actions malveillantes sur la base de données, telles que la suppression de tables, la consultation de données provenant d'autres tables ou l'insertion de données. Tentez de reproduire les actions de cet utilisateur dans cette mission.

essayer maintenant
Évolutif et engageant

Spring MvcRequestMatchers

En mars 2023, Spring a publié un correctif pour une vulnérabilité découverte en interne, référencée CVE-2023-20860, où l'utilisation d'un double joker ** dans mvcRequestMatchers pouvait entraîner une discordance de modèle entre Spring Security et Spring MVC. Cela pouvait permettre à des utilisateurs d'obtenir un accès non autorisé à certains points de terminaison. Nous avons mis en place une application bancaire simplifiée dotée de quelques points de terminaison. Suivez les instructions et essayez de reproduire l'impact de cette vulnérabilité de contrôle d'accès.

essayer maintenant
Évolutif et engageant

Signatures psychiques - Utilisation de composants vulnérables connus

La CVE-2022-21449 possède l'alias le plus fascinant pour une vulnérabilité : les « signatures psychiques » en Java. D'où vient ce nom ? C'est une référence au papier psychique de Doctor Who. Lorsqu'il est présenté à quelqu'un, ce papier vierge affiche ce que la personne s'attend à voir. Un phénomène similaire se produisait dans l'implémentation de l'algorithme ECDSA en Java (versions 15 à 18), affectant la vérification des signatures JWT. Il était possible de soumettre une signature invalide que Java considérait comme valide. Vous voulez voir comment cela fonctionne ? C'est parti.

essayer maintenant
Évolutif et engageant

Traversée de chemin Apache - Utilisation de composants vulnérables connus

Le 4 octobre 2021, l'équipe Apache a publié la version 2.4.49 d'Apache pour corriger une vulnérabilité de traversée de chemin et d'exécution de code à distance dans Apache 2.4.48, connue sous le nom de CVE-2021-41773. Le 7 octobre 2021, ils ont publié la version 2.4.51, le correctif 2.4.50 s'étant avéré incomplet. Cette vulnérabilité a été répertoriée sous le nom de CVE-2021-42013. Essayez cette mission pour découvrir par vous-même comment exploiter cette faille.

essayer maintenant
Évolutif et engageant

Log4j - Utilisation de composants vulnérables connus

L'annonce début décembre 2021 d'une faille 0-day (CVE-2021-44228) dans la très populaire bibliothèque de journalisation Log4j a fait l'effet d'une bombe au sein de la communauté Java. Cette vulnérabilité, baptisée Log4Shell, affecte les versions 2.0-beta9 à 2.14.1 de Log4j v2 et peut permettre l'exécution de code à distance. Nous avons mis en place un environnement pour simuler cette faille afin que vous puissiez en constater l'impact par vous-même. Essayez-le dès maintenant.

essayer maintenant
Évolutif et engageant

Trojan Source - Utilisation de composants provenant de sources non fiables

L'un de nos développeurs chez Viking Bank a copié par mégarde du code provenant d'une source internet non fiable pour mettre en place une vérification d'autorisation administrateur sur la gestion des cartes bancaires. Ce code contient potentiellement des composants vulnérables. Nous avons constaté que des utilisateurs parviennent à modifier leur plafond de carte bancaire, alors que ce privilège est réservé aux administrateurs. Nous pensons que le problème vient de ce code. Lancez la mission pour enquêter.

essayer maintenant
Évolutif et engageant

Codestashbin - Fonction de réinitialisation de mot de passe non sécurisée

CodeStashBin est l'un des plus grands hébergeurs de contrôle de version de code au monde. La rumeur court que la procédure de mot de passe oublié présente une faille de sécurité liée à une fonction de réinitialisation non sécurisée. Il serait possible de modifier le mot de passe d'un utilisateur privilégié pour accéder à son compte. Lancez-vous dans cette mission pour enquêter sur ce problème.

essayer maintenant
Évolutif et engageant

Cross-site scripting (XSS) dans « ChatterGPT »

Cette mission dévoile l'interface familière d'un LLM populaire et utilise un véritable extrait de code généré fin novembre 2023. Les utilisateurs peuvent interpréter cet extrait et étudier les failles de sécurité potentielles s'il était utilisé aux fins prévues.

essayer maintenant

Parcourir toutes les directives

Parcourir par :
Masquer les filtres
Sélection
Afficher les filtres  
Sélection
Effacer les filtres
Étiquette
Super icône [★]
Sujet
Voir plus

Journalisation et surveillance insuffisantes

Meilleures pratiques :

Auditer la journalisation des fonctions sensibles
Journalisation des erreurs
Centraliser le stockage des journaux
Conserver les journaux pendant une durée définie
Auditer régulièrement les journaux à la recherche d'informations personnelles

La journalisation et la surveillance sont souvent reléguées au second plan une fois qu'un problème est survenu, mais leur absence peut s'avérer très coûteuse. D'un côté, lorsqu'un incident se produit (qu'il soit lié à la sécurité ou non), l'absence ou l'insuffisance de journaux rend impossible la compréhension des faits. De l'autre, une journalisation excessive peut entraîner des violations de la vie privée et des sanctions réglementaires. Consultez nos recommandations pour adopter les meilleures pratiques et éviter une journalisation et une surveillance insuffisantes.

voir les directives

Utilisation de composants présentant des vulnérabilités connues

{
 "dependencies": {
   "foo": "1.0.0 - 2.9999.9999",
   "bar": ">=1.0.2 <2.1.2"
 }
}

La plupart des applications utilisent un grand nombre de composants tiers. Ces derniers assurent diverses fonctions, de la journalisation au templating, en passant par l'accès aux bases de données. Si cela facilite grandement le développement logiciel et permet un gain de temps considérable, ces composants sont créés par des humains et peuvent donc inévitablement contenir des vulnérabilités. Consultez nos directives pour en savoir plus.

voir les directives

Injection SQL

import mysql.connector
db = mysql.connector.connect
#Mauvaise pratique. À éviter ! Exemple à but pédagogique uniquement.
(host="localhost", user="newuser", passwd="pass", db="sample")
cur = db.cursor()
name = raw_input('Entrez le nom : ')
cur.execute("SELECT * FROM sample_data WHERE Name = '%s';" % name) for row in cur.fetchall(): print(row)
db.close()

L'injection SQL (SQLi) consiste à injecter du code dans des instructions SQL pour attaquer une application et en extraire des données sensibles. Il s'agit d'une vulnérabilité de sécurité web courante, utilisée pour manipuler des bases de données et dérober des informations critiques.

voir les directives

Configuration de sécurité incorrecte

De nombreux frameworks proposent également des points de terminaison activables permettant de surveiller l'application, que ce soit en environnement de production ou de test/développement.

Métriques (Prometheus)
Journaux
Informations sur l'environnement
Mappages de chemins/URL

La mauvaise configuration de sécurité est un terme générique qui regroupe des vulnérabilités courantes liées aux paramètres de configuration d'une application, plutôt qu'à un code défectueux. Il s'agit d'un sujet vaste qui dépend fortement de facteurs tels que votre pile technologique. Bien que la résolution de ces problèmes semble souvent simple, comme la modification d'un fichier de configuration ou d'une seule ligne de code, l'impact et les conséquences de ces vulnérabilités peuvent être graves. Consultez notre guide pour en savoir plus sur cette vulnérabilité et sur la manière de l'atténuer.

voir les directives

Falsification de requête côté serveur

ts
let url = request.params.url;

let response = http.get(url);
let render = response.render();

return render.export();

Les vulnérabilités de type Server-Side Request Forgery (SSRF) surviennent lorsqu'un utilisateur est en mesure de pousser une application à effectuer des requêtes HTTP vers un domaine déterminé par un attaquant. Si une application a accès à des réseaux privés ou internes, un attaquant peut également forcer l'application à effectuer des requêtes vers des serveurs internes. Nous examinerons cela plus en détail avec quelques exemples dans ce guide pour mieux comprendre à quoi cela ressemble en pratique.

voir les directives

Stockage des mots de passe

Feature Cryptographic hash Password hash Speed Very fast Intentionally slow Work factor can be adjusted No Yes

Si votre application authentifie des utilisateurs, il est fort probable qu'elle doive gérer des mots de passe. La gestion des mots de passe est une responsabilité majeure, et les traiter correctement l'est encore plus. Il est difficile d'imaginer pire scénario qu'une application piratée dont les mots de passe des utilisateurs se retrouvent exposés sur Internet. Comment stocker les mots de passe en toute sécurité et selon les meilleures pratiques ? Examinons quelques méthodes.

voir les directives

Affectation de masse

html
<form method="POST">
<input name="Id" type="hidden" value="666">
<input name="Name" type="text" value="Bad guy">
<input name="EmailAddress" type="text" value="hacker@attacker.com">
<input name="IsAdmin" type="hidden" value="true">
<input type="submit">
</form>

L'assignation de masse (Mass Assignment) est une vulnérabilité qui survient lorsque les points de terminaison d'une API ne restreignent pas les propriétés d'un objet pouvant être modifiées par un utilisateur. Cette faille peut se produire lors de l'utilisation d'une bibliothèque ou d'un framework permettant la liaison automatique de paramètres HTTP à un modèle, lequel est ensuite utilisé sans aucune validation. Bien que la liaison automatique d'une requête à un objet puisse s'avérer très utile, elle peut entraîner des problèmes de sécurité si le modèle contient des propriétés qui ne sont pas destinées à être accessibles par l'utilisateur. Consultez les directives pour plus de détails.

voir les directives

Erreur de configuration de sécurité - XXE détaillé

xml
<?xml version="1.0" ?>
<!DOCTYPE outerElement [
   <!ENTITY externalEntity SYSTEM  "file:///etc/passwd" > ]>
<outerElement>&externalEntity;</outerElement>

La classe de vulnérabilité « XML eXternal Entities » (XXE) est une mauvaise configuration de sécurité impliquant les analyseurs XML. La norme XML inclut des moyens de référencer des « entités », telles que des fichiers et des URL. Il est fréquent que les analyseurs résolvent par défaut les entités externes, ce qui signifie que les documents XML peuvent entraîner la divulgation de fichiers et d'autres informations sensibles à des attaquants potentiels. Consultez le guide complet pour plus d'informations.

voir les directives

Injection - Path Traversal

pseudo
let baseFolder = "/var/www/api/documents/"; 
let path = baseFolder + request.params.filename;

return file.read(path);

Le Path Traversal est une autre vulnérabilité par injection très courante. Elle survient généralement lorsque la construction d'un URI (qu'il s'agisse d'une URL, d'un chemin de fichier ou autre) ne garantit pas correctement que le chemin résolu ne pointe pas en dehors de la racine prévue. L'impact d'une telle vulnérabilité dépend fortement du contexte et du niveau de sécurisation global. Consultez le guide pour en savoir plus.

voir les directives

Authentification et autorisation

cs

// S'assurer que le comportement par défaut authentifie les requêtes et vérifie les droits d'administrateur
[Authenticate]
[Authorize("Admin")]
public class SecureController : Controller
{

}

public class MyController : SecureController
{

    // Remplace l'attribut Authorize hérité pour permettre à tout utilisateur d'accéder à la page

voir les directives

Injection - XSS

```html
<!--- NON SÉCURISÉ : Le htmlSnippet sera interprété sans aucun échappement --->
@Html.Raw(htmlSnippet)
```

Le Cross-Site Scripting, ou XSS, est un autre type de vulnérabilité par injection qui conduit à l'exécution d'un script contrôlé par un attaquant dans le navigateur d'un autre utilisateur. Le XSS peut également être considéré comme une vulnérabilité d'injection HTML/JavaScript. Examinons les types de XSS que vous pourriez rencontrer.

voir les directives

Les injections : les bases

Parmi les types d'injections les plus courants, on trouve :

Injection SQL
Cross-Site Scripting (injection HTML/Javascript)
Path Traversal (injection de chemin/URL)
Injection de commandes
Injection de code

Les vulnérabilités par injection comptent parmi les plus connues, et sans surprise, l'exemple incontournable reste l'injection SQL. Difficile d'échapper au sujet dans le monde de la tech, alors autant en parler directement. Poursuivez votre lecture pour une brève introduction aux failles par injection.

voir les directives

Téléchargement de fichier

public string UploadProfilePicture(FormFile uploadedFile)
{
    // Générer le chemin d'enregistrement du fichier
    var path = $"./uploads/avatars/{request.User.Id}/{uploadedFile.FileName}";

    // Enregistrer le fichier
    var localFile = File.OpenWrite(path);
    localFile.Write(uploadedFile.ReadToEnd());
    localFile.Flush();
    localFile.Close();

    // Mettre à jour la photo de profil
    UserProfile.UpdateUserProfilePicture(request.User, path)

    return path;
}

Il est très courant qu'une application doive, à un moment ou à un autre, permettre aux utilisateurs de télécharger un fichier (pour l'utiliser ou simplement le stocker). Bien que cela semble simple, la mise en œuvre de cette fonction est critique en raison des risques liés à la gestion des fichiers. Consultez les directives pour en savoir plus.

voir les directives

Injection de commandes

let ip = request.params.ipAddress;

system("ping " + ip);

Intéressons-nous à l'injection de commandes. Nous allons nous concentrer sur quelques exemples pour mieux visualiser le phénomène. Pour rappel, les vulnérabilités par injection de commandes surviennent lorsqu'une entrée utilisateur est intégrée à une commande système. Consultez le guide pour en savoir plus.

voir les directives