SÉCURITÉ
Web, sécurité et Laravel : exemples et cas d'usage [2/3]
Par Aubin Puyoou, publié le 22/09/2021 à 00:46.
Toujours muni de ma machine de test, voici aujourd'hui quelques exemples relatifs aux failles de Cross-Site Scripting (XSS) et de téléversement non contrôlé de fichiers. Nous verrons également quelques exemples classiques d'exploitation de ces failles et des vulnérabilités qu'elles peuvent engendrer.
XSS
Injection de code Javascript
Ce type de faille pourtant bien connu est encore présent dans grand nombre de sites. Certes les frameworks modernes fournissent pour la plupart des outils de maquettage HTML, et incluent directement un nettoyage des chaînes de caractères pour s'en prémunir. Mais lorsqu'il est possible d'en exploiter, celles-ci peuvent s'avérer redoutables : récupération de cookies de session, exécution d'actions non souhaitées par l'utilisateur principal, validation de formulaires ...
Exemple de détection de faille
La plupart du temps, lorsqu'il est possible de saisir des valeurs depuis des formulaires, des données
mal nettoyées peuvent laisser place à de l'injection de code. Ainsi, en manipulant
leur contenu, il est facile d'y ajouter certaines commandes. La meilleure façon de vérifier cela est
d'ajouter une balise script
qui nous permettrait d'effectuer des traitements à l'insu d'un l'utilisateur, où
même d'un administrateur de site.
Dans notre exemple ci-dessus, la donnée saisie ici est ensuite stockée dans une base de données de façon à fournir une liste affichables aux yeux de tous les utilisateurs. Ainsi, le champ stocké étant du code Javascript, celui-ci se retrouvera interprété sur chaque page où notre valeur apparaîtra à l'écran.
Exemple de détection de faille
Ainsi, suite à notre injection de code, le champ texte précédemment stocké est interprété par le navigateur, et nous affiche donc les cookies de notre session. Pouvoir les afficher grâce à un formulaire reste un moyen de démontrer qu'un site est vulnérable aux failles XSS.
Il est ainsi facile d'imaginer un scénario où ces cookies sont ensuite envoyés via une requête HTTP à un site tiers, ou même d'aisément transmettre d'autre types d'informations plus importantes
Templates Blade contre PHP natif
Laravel fournit directement des outils permettant de contrer ce type de faille, en nettoyant
systématiquement les variables qu'il affiche. Contrairement au système PHP natif, qui nous obligerait à contrôler
chaque variable, les directives Blade "{{ }}
"
incluent directement des fonctionnalités de purification de variables, contre les failles XSS.
Dans de rares cas, il peut être voulu d'interpréter du code directement dans notre page. Dans ces cas précis, mieux vaut s'assurer que les variables traitées ainsi n'aient pas été ajoutées par un tiers. Ce type de failles pouvant mener à diverses exploitations malicieuses, suivant le niveau de connaissance de votre site par celui-ci.
Import de fichiers non contrôlé
Import et exploitation de fichiers contenant du code source
L'import de fichier dans une application peut donner accès à des vulnérabilités critiques de votre système. Il est ainsi primordial de contrôler systématiquement les fichiers entrants, en analysant au miminum leur taille, leur type, et en s'assurant de leur contenu.
Petit exemple d'exploitation d'une telle faille...
En déposant un peu de code PHP
Pour cet exemple, l'exploitation de la faille a été grandement simplifié pour la démonstration. De manière à bien démontrer l'étendue de la vulnérabilité. Le formulaire ci-contre nous permet d'importer un fichier vers notre serveur, tentons donc d'y insérer un fichier PHP, avec le contenu suivant :
<?php
print_r(file_get_contents('/etc/passwd'));
Une fois le fichier déposé, il nous reste encore à trouver où celui-ci a été placé dans notre système de fichiers, et s'il est accessible. Dans notre cas, l'exercice est facilité, le chemin étant directement indiqué.
Exploitation du fichier
Rendons-nous donc à l'emplacement du fichier :
http://localhost/hackable/uploads/hacked.php
Certes récupérer le contenu du fichier /etc/passwd
ne permet pas d'affecter directement la machine
en soi, mais cela permet d'indiquer qu'une machine est vulnérable.
Protection par validation
De manière à pouvoir éviter ce type de faille, Laravel inclue un validateur permettant d'évaluer facilement les fichiers envoyés. Lorsqu'un formulaire inclue un fichier, assurez-vous systématiquement que le contrôleur en amont vérifie ses propriétés.
Validator::make($request->all(), [
'photo' => 'mimes:jpg,bmp,png|max:10240' //de manière à vérifier type et taille
]);
Évidemment, même malgré tous les bons outils, il est toujours recommandé de s'assurer soi-même de la validité d'un fichier téléversé, via d'autres bibliothèques adaptées aux types de fichiers que vous traitez; l'exploitation de ce type de faille pouvant être la porte vers une attaque directe à votre système.