PHP
Objectif : Identifier rapidement les points potentiellement vulnérables dans une base de code PHP lors d'un audit de sécurité statique (SAST - Static Application Security Testing). Cette cheatsheet se concentre sur des fonctions et des patterns connus pour être souvent sources de vulnérabilités.
Note : L'audit statique doit être complété par un audit dynamique et une compréhension du contexte d'exécution. La présence d'une fonction listée ici n'implique pas automatiquement une vulnérabilité si les entrées sont correctement validées et échappées.
⚙️ Outils d'Analyse Statique (SAST) pour PHP
Avant de chercher manuellement, envisagez d'utiliser des outils SAST qui automatisent une partie de la détection :
- PHPStan (https://github.com/phpstan/phpstan)
- Psalm (https://github.com/vimeo/psalm)
- SonarQube (avec SonarPHP) (https://www.sonarsource.com/products/sonarqube/)
- Semgrep (https://github.com/semgrep/semgrep) - Avec des règles spécifiques PHP.
- PHP CS Fixer / PHP CodeSniffer : Plus pour le style, mais peuvent aider à repérer des pratiques non standard.
🎯 Recherche Manuelle par Type de Vulnérabilité (grep
)
(Exécutez ces commandes à la racine du code source)
💉 Injection SQL (SQLi)
- Recherche : Fonctions exécutant des requêtes sans préparation adéquate.
- Exemple Vulnérable :
- Mitigation : Utiliser systématiquement les requêtes préparées (Prepared Statements) avec
mysqli_prepare
/bind_param
/execute
ou PDO (prepare
,bindParam
/bindValue
,execute
).
🛰️ Exécution de Commandes (RCE - Remote Code Execution)
- Recherche : Fonctions exécutant des commandes système ou interprétant du code.
- Exemple Vulnérable (
shell_exec
) :
- Exemple Vulnérable (
eval
) :
- Mitigation : Éviter autant que possible ces fonctions avec des entrées utilisateur. Si nécessaire, utiliser
escapeshellarg()
ouescapeshellcmd()
(avec prudence, ne protège pas de tout) et valider très strictement les entrées (liste blanche). Évitereval
,assert
,create_function
avec des données externes.
🪂 Inclusion de Fichiers (LFI/RFI - Local/Remote File Inclusion)
- Recherche : Fonctions incluant des fichiers basés sur une entrée.
- Exemple Vulnérable (LFI) :
- Exemple Vulnérable (RFI - si
allow_url_include=On
) :
- Mitigation : Ne jamais inclure de fichiers basés directement sur une entrée utilisateur. Utiliser une liste blanche (whitelist) de fichiers autorisés. Désactiver
allow_url_fopen
etallow_url_include
dansphp.ini
si possible. Utiliserbasename()
ou valider strictement le chemin.
🚶 Directory Traversal
- Recherche : Utilisation de fonctions de fichiers avec des chemins potentiellement contrôlés par l'utilisateur.
- Exemple Vulnérable :
- Mitigation : Valider et nettoyer les chemins (
basename()
), vérifier que le chemin résolu (realpath()
) reste dans le répertoire attendu (chroot virtuel).
🧁 Cross-Site Scripting (XSS)
- Recherche : Affichage direct de données utilisateur sans échappement HTML.
- Exemple Vulnérable :
- Mitigation : Utiliser
htmlspecialchars($variable, ENT_QUOTES, 'UTF-8')
ou des moteurs de template sécurisés (Twig, Blade) qui échappent par défaut. Définir l'en-têteContent-Security-Policy
.
📤 File Upload Vulnerabilities
- Recherche : Traitement des fichiers uploadés (
$_FILES
).
- Points à vérifier :
- Validation du type de fichier (MIME type
$_FILES['userfile']['type']
n'est pas fiable, vérifier l'extension et idéalement le contenu/magic bytes). - Validation de la taille (
$_FILES['userfile']['size']
). - Contrôle du nom de fichier (éviter les
..
, les extensions multiplesshell.php.jpg
, générer un nom aléatoire). - Stockage des fichiers uploadés en dehors du webroot ou avec des permissions très restrictives (pas d'exécution).
- Utilisation de
move_uploaded_file()
plutôt quecopy()
.
- Validation du type de fichier (MIME type
- Mitigation : Valider type, taille, nom. Renommer les fichiers. Stocker hors webroot ou configurer le serveur web pour ne pas exécuter de code dans le dossier d'upload.
🔓 Insecure Deserialization
- Recherche : Utilisation de la fonction
unserialize()
sur des données contrôlées par l'utilisateur.
- Exemple Vulnérable :
- Mitigation : Ne jamais utiliser
unserialize()
sur des données non fiables. Préférer JSON (json_decode
/json_encode
) ou d'autres formats sérialisés sûrs. Siunserialize
est inévitable, utiliser l'optionallowed_classes
(PHP 7+).
🔗 Server-Side Request Forgery (SSRF)
- Recherche : Fonctions effectuant des requêtes HTTP/fichier basées sur une entrée utilisateur.
- Exemple Vulnérable :
- Mitigation : Valider strictement les URL (liste blanche de domaines/IPs autorisés). Ne pas autoriser les schémas
file://
,gopher://
, etc. Configurer des pare-feux pour limiter les requêtes sortantes du serveur.
🏛️ XML External Entity (XXE)
- Recherche : Traitement de fichiers XML avec des parseurs potentiellement mal configurés.
- Exemple Vulnérable (avant PHP 8) :
- Mitigation : Désactiver le chargement des entités externes :
libxml_disable_entity_loader(true);
(par défaut depuis PHP 8.0). UtiliserLIBXML_NONET
lors du parsing si possible.
⚖️ Comparaisons Faibles (Weak Type Comparison)
- Recherche : Utilisation de
==
au lieu de===
pour des comparaisons, surtout avec des fonctions commestrcmp
,strpos
, ou lors de vérifications d'authentification/autorisation.
- Exemple Vulnérable (
strcmp
) :
- Mitigation : Utiliser la comparaison stricte
===
qui vérifie aussi le type. Pourstrcmp
, vérifier explicitementstrcmp(...) === 0
. Pourstrpos
, vérifierstrpos(...) !== false
.