Avec plus de 80% des sites en ligne qui fonctionnent avec PHP comme langage côté serveur, le problème de la sécurité de PHP est un point qui mérite d’être évoqué.
Le langage PHP sert à concevoir plusieurs types de programmes informatiques, mais sa grande notoriété est principalement due au fait qu’il gère le backend de la majorité des Systèmes de Gestion de Contenus, WordPress notamment.
D’ailleurs, près de 40% des sites que vous trouverez sur internet sont des WordPress.
L’impressionnante base d’utilisateurs de PHP et sa communauté active l’exposent donc à des attaques informatiques continues et à de nombreuses menaces de sécurité.
Cela est d’autant plus inquiétant lorsqu’on sait que ce langage de programmation est celui qui présente le plus grand nombre de failles de sécurité.
En effet, les sites web et autres applications qui utilisent cette technologie sont la cible de nombreuses cyberattaques et tentatives de piratage. Une statistique révèle d’ailleurs qu’en 2019, plus de 30 000 sites Web ont été piratés par jour, avec une attaque perpétrée chaque 40 secondes.
Néanmoins, malgré les nombreuses failles de sécurité de PHP, son statut de langage de programmation performant et dynamique ne peut pas être remis en question. Il a d’ailleurs une popularité grandissante dans l’univers de la technologie, de la vente en détail et du e-commerce.
Il existe différents moyens de régler les problèmes de sécurité du langage PHP. En effet, les vulnérabilités d’une application PHP peuvent être identifiées et corrigées avant qu’elles ne causent des dommages graves, voire irréversibles.
Voici alors pour vous, 9 grandes failles de sécurité de PHP et les moyens de les corriger.
Pourquoi PHP n’est-il pas si sécurisé ?
Le langage PHP comporte des failles de sécurité fondamentales dans sa conception, notamment avec l’absence du principe directeur Secure By Design.
Secure By Design consiste essentiellement à incorporer des fonctionnalités de sécurité de base pour faciliter la vie aux programmeurs et aux utilisateurs finaux. Avec ce principe, ces derniers ne seraient pas obligés de se gêner pour sécuriser ou offrir un bon niveau de sécurité au code PHP.
En fait, toutes les applications et librairies développées en PHP ont des vulnérabilités au niveau de leur système de sécurité. Par exemple, une fonctionnalité de base manquante peut compromettre la protection face à diverses potentielles attaques.
En pratique, de nombreuses fonctions PHP permettent d’effectuer des tâches système sensibles comme :
- Les opérations réseau ;
- L’accès à la base de données ;
- La manipulation des fichiers.
À travers des applications Web Shell, ces fonctions de base peuvent même être exploitées par des hackers pour compromettre ou pour contrôler les serveurs web.
Il convient de préciser que la plupart des failles de sécurité présentes dans les codes PHP sont le résultat d’erreurs ou d’omissions survenues pendant l’écriture du code source. De nombreuses brèches proviennent d’ailleurs d’entrées utilisateurs non contrôlées ou filtrées.
En effet, les applications PHP reçoivent généralement des informations renseignées par divers utilisateurs via des champs de formulaire. Si la sécurité de PHP n’est pas renforcée et que ces entrées contiennent du code malveillant, il est transmis à l’application et peut causer de nombreux dégâts.
Les 9 plus grandes failles de sécurité de PHP et comment les corriger
Si de nombreuses attaques d’applications développées avec du PHP sont orientées vers les formulaires, il y en a bien d’autres. Découvrez ici les principales vulnérabilités de PHP exploitées par les pirates informatiques.
1 – Les attaques par inclusion de fichiers
Ces failles de sécurité de PHP exploitent la vulnérabilité des applications qui acceptent les contenus téléchargés à savoir documents, images et autres. Toutefois, on distingue deux principaux types d’attaques par inclusion de fichier malveillant : celles à distance et celles locales.
Les attaques par inclusion de fichier malveillant à distance et locales
Dans une attaque par inclusion de fichiers à distance, un cybercriminel parvient à insérer un lien vers un code malveillant sur le site piraté. Cette faille de sécurité de PHP peut notamment consister à l’inclusion d’une bibliothèque contenant un code malveillant par le biais d’une URL.
Ce programme malveillant peut alors s’exécuter sur l’application web PHP cible pour permettre à l’attaquant d’accéder à la plateforme ou d’y avoir un contrôle total.
Dans le cadre d’une attaque par inclusion de fichier local par contre, le fichier qui est inclus est un fichier qui est déjà présent sur le serveur web hébergeant l’application cible.
Comment prévenir les attaques par inclusion de fichiers ?
Les fonctions PHP require(), require_once(), include(), include_once(), file_get_contents() et fopen() sont utilisées dans la majorité de ces cyber attaques. Pour les prévenir, il faut veiller à leur implémentation.
Vous pouvez également vérifier les paramètres de certains drapeaux du fichier php.ini. « allow_url_fopen » indique si les fichiers externes peuvent être inclus ou non sur le site.
« allow_url_inclide » par contre indique si les fonctions d’inclusion PHP Include et Require peuvent charger des fichiers distants. Vous devez vous assurer que ces drapeaux sont désactivés.
2 – Les attaques de scripts intersites (XSS)
Les failles de sécurité de PHP XSS pour Cross-site Scripting sont très courantes et très utilisées par les pirates informatiques. Côté client, elles consistent à injecter un code HTML ou JavaScript malveillant sur une page Web afin de voler des mots de passe, des cookies ou d’autres informations.
Cette faille de sécurité de PHP peut également permettre à un hacker d’obtenir des accès de niveau administrateur.
Prenons cet exemple de code censé afficher un message de bienvenue sur une page d’un site utilisant PHP.
Ce bout de code récupère un prénom stocké dans la variable GET, qu’il affiche dans le message.
En quoi consistent-elles ?
Plutôt que de renseigner le nom attendu au niveau de ce champ du formulaire, un utilisateur mal intentionné peut y insérer un bout de code malveillant pour exploiter la faille XSS.
Il suffirait par exemple d’envoyer comme entrée pour voir le message « Faille PHP » s’afficher dans une boîte de dialogue.
Cela montre bien que divers codes malveillants peuvent être injectés de cette manière, causant de graves dommages. On distingue trois principaux types d’attaques de scripts intersites :
- Les XSS réfléchis ;
- Les XSS persistants ;
- Les XSS basés sur le DOM.
L’exemple précédent est un cas de XSS réfléchi, où les données du formulaire sont affichées avec la méthode echo() sans contrôle préalable. La faille de sécurité de PHP XSS persistant par contre infecte la base de données, puis tous les utilisateurs de la plateforme. Ces deux failles se produisent côté serveur.
Le XSS basé sur le DOM enfin modifie l’environnement DOM (Document Object Model). Toutefois, la modification est seulement possible si l’application Web affiche des données dans le DOM sans effectuer un nettoyage approprié.
Comment se protéger des attaques de scripts intersites sur une application développée en PHP ?
- Différentes solutions permettent de corriger la vulnérabilité du PHP aux attaques de scripts intersites. Entre autres, vous pouvez :
- Inclure une protection anti XSS dans le header afin de désamorcer ces attaques ;
- Convertir les caractères spéciaux des entrées de formulaires en entités HTML grâce aux fonctions PHP htmlspecialchars() et htmlentities() ;
- Retirer les éléments entre les balises HTML grâce à la fonction strip_tags() ;
- Utiliser un pare-feu d’application web (WAF) ;
- Adopter des bibliothèques PHP spécifiques comme PHP Anti-XSS, htmlLawed ou un programme de filtrage HMTL ;
- Empêcher les hackers de mettre fin aux affectations de variables et ajouter le code exécutable à la fin avec la fonction adslashes().
Pour vous protéger des failles XSS sur une application PHP, vous pouvez également utiliser une convention de dénomination stricte. Elle permet de faire une distinction entre les données filtrées et celles qui ne le sont pas.
3 – La falsification de requête intersite (CSRF)
Les attaques de falsification de requête intersite ou Cross-site Request Forgery (CSRF) se font du côté de l’utilisateur. Et plus les utilisateurs de l’utilisateur ont des privilèges, plus les dangers encourus sont grands.
Les failles de sécurité CSSRF : en quoi consistent-elles ?
Les cybercriminels peuvent exploiter ces failles pour concevoir des requêtes HTTP qui seront exécutées sur la page web. En pratique, cette menace qui plane sur les applications PHP incite l’utilisateur à cliquer sur un lien malveillant. Les conséquences peuvent alors être diverses :
- L’annulation de l’accès de manière discrète ;
- L’envoi automatique de requêtes d’apparence légitime au serveur au nom de l’utilisateur ;
- Le vol d’informations de session.
Si la défense contre ces failles de sécurité de PHP relativement discrètes est plus compliquée, certaines mesures permettent heureusement de s’en protéger.
Comment se protéger des attaques CSRF sur un programme développé en PHP ?
L’utilisation de jetons d’authentification (tokens) constitue le meilleur moyen de se protéger des attaques de falsification de requête intersite. Ces tokens doivent toutefois être renouvelés à chaque connexion pour compliquer la tâche aux pirates informatiques.
L’incontournable CMS WordPress par exemple utilise « nonce » qui change de façon journalière. Cependant, il faut encore s’assurer que chaque plugin de son site WordPress utilise ce système pour avoir une meilleure protection de ce point de vue. Comme autre mesure à prendre, on peut :
- Utiliser la méthode POST plutôt que GET sur les formulaires ;
- Adopter des mécanismes d’authentification par défi-réponse de base avec des attributs de formulaire masqués par exemple ;
- Utiliser le protocole internet HTTPS.
Le HTTPS crypte la connexion entre l’utilisateur et le site web. Il renforce ainsi la sécurité de PHP en le protégeant des attaques CSRF et de bien d’autres failles de ce langage de programmation.
4 – Le détournement de session (session hijacking)
Un détournement de session consiste essentiellement au vol de l’ID de session d’un utilisateur. Cet identifiant permet par la suite au hacker d’accéder à toutes les informations stockées dans la session.
Les informations de connexion ou d’authentification à divers sites peuvent ainsi être dérobées et exploitées. Les dommages sont généralement très importants lorsque l’utilisateur dont l’ID de session a été volé est un administrateur.
Pour éviter le piratage de session, il est possible de changer l’ID de session grâce à la fonction session_regenerate_id(). Sur une application, on peut aussi neutraliser cette faille de sécurité de PHP en empêchant le JavaScript (JS) d’accéder à l’ID de session.
Le paramètre session.cookie.httponly dans le fichier php.ini et la fonction session_set_cookie_params() permettent de le faire. Il faut aussi s’assurer que les données d’identification de session ne sont pas stockées dans un dossier accessible au public.
5 – Les injections SQL
Un hacker peut atteindre la base de données d’une application PHP en injectant du code SQL malveillant qui est exécuté côté serveur web. Ces attaques sont généralement perpétrées par le biais de formulaires mal traités pour renvoyer des informations confidentielles comme :
- Des informations privées des utilisateurs ;
- Le contenu de la base de données ;
- Les mots de passe et identifiants, etc.
Une faille de sécurité de PHP par injection de SQL peut également donner accès à l’intégralité du site web à un hacker. Dans certains cas, l’utilisateur malveillant peut même prendre contrôle du serveur web.
Voici un exemple de code backend vulnérable aux injections SQL.
Le formulaire associé est :
Ce code a une grande vulnérabilité aux injections SQL, car aucun contrôle n’est effectué pour vérifier les informations entrées dans le formulaire. Il accepte toutes les saisies des utilisateurs.
Du code SQL malveillant peut ainsi être injecté pour dérober des informations confidentielles ou pour commettre d’autres forfaits. Ils peuvent d’ailleurs conduire à la destruction du serveur web. Très courantes, ces failles de sécurité de PHP représentent près du 2/3 des attaques sur internet.
Le contrôle et la vérification de toutes les entrées utilisateurs constituent le meilleur moyen d’éviter les attaques par injection SQL. Il faut alors filtrer toutes les données de formulaire et utiliser des guillemets pour dans toutes les valeurs d’instructions SQL quand c’est possible.
L’utilisation de caractères d’échappement peut également aider à se protéger des injections SQL.
6 – L’injection de commande
Les attaques par injection SQL et celles par injection de commande sont assez similaires. Toutefois, les failles de sécurité de PHP relatives aux injections de commande ciblent plutôt le système. Ces attaques sont également perpétrées sur le système d’exploitation du serveur web.
Il faut trois éléments essentiels pour la réussite d’une attaque par injection de commande :
- L’application PHP utilise un appel système ;
- La commande passée en argument à la fonction est créée par le biais d’une entrée externe ;
- L’entrée n’est pas valide ou filtrée.
La suppression de ces conditions permet de se préserver des attaques par injection de commandes. Évitez autant que possible les appels système et utilisez plutôt des fonctions intégrées du PHP pour interagir avec le serveur web.
7 – L’exécution de code à distance
Cette faille PHP permet aux hackers de charger du code malicieux sur un site internet et de les exécuter à distance. Elle survient souvent en cas de bug lorsque l’application PHP accepte des entrées d’utilisateurs et les interprète mal comme s’ils étaient du code PHP.
Ces problèmes de sécurité de PHP peuvent permettre de prendre intégralement le contrôle d’un site web. Toutes les mesures nécessaires doivent alors être prises pour corriger ces vulnérabilités. Pour ce faire :
- Filtrez toutes les données et assurez-vous qu’elles ne sont pas malveillantes avant de les traiter ;
- Installez des protocoles d’accès et d’authentification efficaces ;
- Utilisez des pares-feux pour applications web pour vous préserver des attaques à distance.
L’installation et la bonne configuration d’un pare-feu offrent une réelle protection contre ces attaques.
8 – Le contournement d’authentification, faille de sécurité de PHP
Les failles relatives au contournement d’authentification proviennent d’une erreur du développeur. Ici, l’application donne par erreur un niveau d’accès beaucoup plus élevé qu’elle le devrait à un utilisateur.
Les développeurs débutants font souvent cette erreur avec la fonction PHP is_admin() par exemple. En effet, cette méthode PHP ne permet pas de déterminer si l’utilisateur est un administrateur. Elle permet plutôt de vérifier si l’utilisateur consulte une page d’administration. Des utilisateurs de bas niveau peuvent ainsi avoir des accès de niveau supérieur et en abuser.
Vous pouvez faire analyser votre code source par des développeurs expérimentés ou des spécialistes de la sécurité informatique pour vous assurer de l’absence de failles d’authentification. Certains outils de test de sécurité permettent également de détecter ces vulnérabilités.
9 – L’injection d’objet en PHP
Les attaques par injection d’objet en PHP sont perpétrées grâce à la fonction unserialise() et grâce à des entrées d’utilisateur non filtrées. Elles aboutissent à une injection d’objets en PHP dans la mémoire et peuvent avoir de graves conséquences comme des injections SQL ou l’arrêt total de l’application.
Comme pour toutes les autres failles de sécurité de PHP relatives aux injections, pour éviter une injection d’objet en PHP, il faut bien contrôler, nettoyer et filtrer chaque entrée utilisateur.
La validation et le filtrage des données, de formulaires notamment
La validation et le nettoyage de tous les différents types d’entrées constituent une mesure essentielle à prendre pour renforcer la sécurité de PHP des applications.
L’étape de la validation consiste à vérifier toutes les données qui parviennent au code source du programme. Il faut pouvoir vérifier les données attendues, leur format, leur longueur, etc. La moindre négligence ici expose à des failles de sécurité de PHP qui peuvent avoir de graves répercussions.
Ensuite, il faut supprimer tous les caractères illégaux contenus dans les données envoyées par tout utilisateur, même s’il est un administrateur. De nombreux filtres PHP permettent de bien valider et de nettoyer des entrées externes qui peuvent être :
- Des données de service web ;
- Des cookies ;
- Des entrées utilisateurs de formulaires ;
- Des variables de serveur ;
- Des résultats de requêtes vers la base de données.
La fonction de filtre PHP filter_var() est assez efficace pour valider et assainir des données entrées en premier paramètre. Un second paramètre de la fonction indique le type de filtrage à effectuer.
Voici un exemple d’utilisation de cette fonction sur l’illustration suivante :
Comment protéger un site web PHP des cyberattaques ?
En raison de ses nombreuses failles de base et de son utilisation très répandue, la sécurité du langage de programmation PHP doit être assurée sur toutes les applications qui l’utilisent. Heureusement, certaines mesures de base permettent de bien renforcer sa protection sur les sites web PHP.
1 – Des mots de passe forts
Le faible niveau de sécurité des identifiants d’utilisateurs sur les applications web est à la base de nombreux piratages informatiques. Pour avoir des mots de passe robustes et fortement sécurisés, il faut :
- Inclure des caractères en minuscule, des caractères en majuscule et des caractères alphanumériques ;
- Avoir des mots de passe de 7 caractères au moins : plus il y en a, plus le mot de passe est difficile à casser ;
- Utiliser des phrases, car elles sont difficiles à cracker.
Un changement régulier de ses mots de passe réduit également considérablement les risques de se faire pirater. Cette mesure est très efficace pour renforcer la sécurité de PHP.
2 – L’authentification à facteurs multiples
L’authentification multi facteurs ajoute une grande couche de sécurité supplémentaire. Elle garantit que les hackers ne puissent pas accéder au site et causer des dommages, même s’ils détiennent des informations d’identification.
Pour renforcer la sécurité de PHP, il est notamment possible d’activer une authentification à deux facteurs sur WordPress.
3 – Le filtrage de données pour la sécurité de PHP
Pour se protéger des bouts de code malveillants et des attaques par injection SQL, le filtrage des données est la meilleure solution à envisager. Il est possible de développer un unique module de sécurité qui serait placé au début de tous les scripts accessibles au public.
4 – Utiliser un pare-feu d’application web
Un pare-feu bien configuré est une excellente protection pour une application Web. Il empêche les hackers et les logiciels malveillants d’atteindre le serveur hôte pour y injecter du code ou encore pour y récupérer des données. On en trouve pour tous les systèmes d’exploitation.
Conclusion
Comme tous les autres langages de programmation, PHP a des failles et des limites au niveau de sa sécurité. Toutefois, cette technologie est déjà très exposée pour deux principales raisons. D’abord, depuis quelques années, elle régit le fonctionnement de plus de la moitié des sites en ligne.
Ensuite, la conception même du langage PHP porte les germes de nombreuses failles de sécurité, car elle n’utilise pas le principe directeur Secure By Design. Si votre site a été développé avec PHP, ses bases de données sont exposées à de nombreuses vulnérabilités.
Les cybercriminels font alors des applications web PHP et de leurs utilisateurs une cible de choix. Ils attaquent la sécurité de PHP de diverses manières, notamment par injection de code, par scripts intersites, par détournement de session, etc.
Heureusement, de nombreuses mesures et astuces permettent de corriger ces failles du langage PHP pour se protéger. Elles renforcent la sécurité de PHP pour permettre d’exploiter le plein potentiel de ce langage de programmation dont l’efficacité et les performances ne souffrent d’aucune contestation.
- Parcourez nos offres d’emploi en Securité informatique
Agence marketing digital Paris
Il faut toujours pouvoir savoir et reconnaitre les failles, merci pour le partage.