.. | ||
extra | ||
lib | ||
templates | ||
article_list.php | ||
article_view.php | ||
comment_create.php | ||
csrf.html | ||
README.md | ||
user_create.php | ||
user_login.php | ||
web_security.txt |
Introduction à la sécurité des applis web en PHP.
Le tp utilise une application de mini-blog. Le code PHP est volontairement simplifié et suffisamment laxiste pour illustrer les failles de sécurité abordées en cours.
Le site est à télécharger et déployer sur votre site local.
Il utilise un base de données sql. Vous pouvez directement
l'importer (répertoire extra
). Les paramètres (à modifier) pour l'accès à la base
de données sont dans lib/common.php
.
Avant de démarrer, consultez les pages existantes, créez un compte et authentifiez-vous.
Formulaires et html
Modification de contenu
-
Postez un commentaire sur un article.
-
Modifiez votre commentaire. Modifiez le commentaire d'un autre utilisateur.
Aide
Regardez l'url ! -
Sécurisez l'écriture du formulaire
comment_create.php
afin qu'on ne puisse pas accéder à un commentaire d'un autre utilisateur.Aide
Dans la requête de modification d'un commentaire, ajoutez à la clause WHERE la vérification du user. -
Le client peut-il modifier le formulaire, en changeant par exemple l'id du commentaire à modifier ? comment ?
Aide
Il suffit d'écrire son propre formulaire, avec la possibilité de saisir le champ id du commentaire ! -
Pour se prémunir contre cela, on va, dans le formulaire, rajouter un code d'authentification (hash avec une clé secrète) du champ
id_comment
pour être sur que les données proviennent du formulaire de l'application. Utilisez la fonction hash_mac. Rajoutez, dans le formulaire, un hash que vous pourrez comparé au hash re-calculé après l'envoie des données.Aide
générez un hash avec une clé secrète : $hashCode = hash_hmac("sha256",$_REQUEST['id_comment'],"Ma clé"); echo ''; Au moment du traitement du formulaire, quand on reçoit le champ `id_comment`, on recalcule et compare le hash avec celui reçu.
XSS
-
Ajoutez un commentaire qui masque tout ce qui suit son affichage (uniquement de l'html svp !). Revenez à un fonctionnement normal.
Aide
Pensez à fermer des balises, et à en ouvrir une qui cachera tout le reste au moyen d'une propriété css. -
Ajoutez un commentaire qui modifie le titre
h1
de la page de l'article.Aide
Le javascript permet de modifier le contenu HTML d'un élément : document.querySelector("h1").innerHTML = "hey !!!!"; -
Empêchez la saisie de balises HTML (les supprimer) pour éviter les attaques ci-dessus. Est-ce suffisant ?
-
Echappez (protéger) les textes affichés dans le html (htmlspecialchars).
-
Créez un compte en donnant une url de façon à exploiter une faille XSS sur la page
article_view.php
.Aide
javascript:alert(/XSS !/); -
Proposez une url vers la page
user_login.php
qui affiche dans un popup les login/mots de passe saisies dans le formulaire (cela pourrait être plus dangereux, en les envoyant sur un serveur par exemple ...)Aide
La valeur de la variable login est écrite dans le formulaire, dans l'attribut value du champ texte correspondant. Il donc tout à fait possible d'injecter du code javascript via un attribut html, par exemple onchange ...
CSRF
Les vunérabilités de type CSRF (Cross-Site Request Forgery) consiste à forger de fausses requêtes à partir d'url authentifiées et à pousser le client à exécuter des actions sans le savoir.
Le client authentifié exécute à son insu une requête (suppression par exemple) par un formulaire dissimuler ou une balise image contrôlée par du javascript.
- Se rendre sur la page
csrf.html
(soyez authentifié). Que s'est-il passé ? - Passer les données en POST résoudra le problème précédent. Malheureusement, on pourra quand même créer une attaque avec du javascript. (vous verrez l'année prochaine qu'on peut faire une requête http à partir de javasscript.
- Résoudre le problème en utilisant un token unique dans le formulaire.
Injection SQL
-
Sur la page
user_login.php
, connectez-vous sans mot de passe, juste avec un login valide. -
connectez-vous sans mot de passe ni login.
-
"Sécurisez" avec la méthode
quote
de PDO. -
Sur la page
comment_create.php
, malgré l'échappement SQL, prouvez que l'on peut toujours modifier les commentaires d'autrui.Aide
Regerdez la clause WHERE dans la requête d'update d'un commentaire. -
Utilisez le filtrage en entrée des données.
-
Sécurisez la page
comment_create.php
avec des requêtes préparées.
Sessions
- Utilisez une faille XSS pour afficher le contenu du cookie. Volez alors la session associée. (Il suffit d'écrire depuis un autre navigateur la valeur du cookie récupéré)