Sécurité des applications Web - Menaces et contre-mesures

Auteur: Mohamed CHINY Durée necessaire pour le cours de Sécurité des applications Web - Menaces et contre-mesures Niveau recommandé pour le cours de Sécurité des applications Web - Menaces et contre-mesures Supports vidéo non disponibles pour ce cours Exercices de renforcement non disponibles pour ce cours Quiz non disponibles pour ce cours

Page 6: Injection de code arbitraire

Toutes les pages

Injection de code

Définition

L'injection de code est une attaque par injection (appelée aussi injection de code arbitraire). Elle survient quand le site présente la vulnérabilité de ne pas vérifier les entrées et exécute directement ce qu'il reçoit.

Les pirates exploitent cette vulnérabilité et passent des fonctions PHP ou des bouts de code soigneusement forgés (parfois même des commandes systèmes). Quand ces codes sont exécutés ils peuvent présenter un danger éminent sur la confidentialité et l'intégrité (voir la disponibilité) du site Web. En effet, une telle pratique peut par exemple:
  • Lister des informations confidentielles comme le codes sources coté serveur
  • Supprimer et modifier des données présentes sur le site
  • Détruire ou compromettre la base de données

Exploitation

Un exemple classique de cette attaque consiste à faire exécuter par le serveur un script PHP passé à travers l'URL. C'est une utilisation non prudente mais que certains développeurs ont l'habitude de faire.

Imaginons que le code source est le suivant:
<?php
   $code=$_GET["code"];
   eval($code.";");
?>
Si le développeur n'a pas filtré ses entrées alors il se peut qu'un pirate forge la requête suivante dans la barre d'URL:
http://www.site-victime.com/pageVulnérable.php?code=phpinfo()
On se trouve donc avec la fonction phpinfo() qui sera exécutée via la fonction eval() et qui affichera toutes les informations clé de la configuration du moteur PHP. Ce qui constitue une atteinte flagrante à la confidentialité.

Comment s'en protéger?

Au niveau du code PHP

Bien entendu, la meilleure façon pour se protéger de cette attaque est d'éviter carrément cette pratique. C'est à dire, il ne faut en aucun cas passer des informations tellement critiques à travers URL ce qui donnera l'opportunité aux personnes malveillantes d'en abuser.

Si toutefois (et pour une raison quelconque) votre site est fait ainsi, alors il faut bien filtrer les entrées des utilisateurs en commençant par fixer une longueur maximale à ne pas dépasser, puis en dressant une liste de fonctions PHP autorisées (dans un fichier texte ou dans la base de données) de telle sorte à vérifier si la fonction passée figure dans la liste avant d'ordonner son exécution (par la fonction eval() ou autrement).