PHP fait tourner environ 80% des sites web dans le monde — WordPress, Drupal, Laravel, Symfony, et des millions d'applications custom. Des vulnérabilités dans le moteur PHP lui-même, ses extensions ou ses configurations peuvent exposer des millions d'applications simultanément.
CVE-2024-4577 : RCE dans PHP CGI (CVSS 9.8)
La zero-day PHP de 2024
En juin 2024, CVE-2024-4577 — une exécution de code à distance dans PHP en mode CGI sur Windows. Une faille dans la gestion des paramètres CGI permettait à un attaquant d'exécuter des commandes arbitraires en ajoutant des arguments spéciaux à l'URL.
Contexte Windows uniquement :
Sur Windows, le moteur de traitement des arguments de la ligne de commande peut interpréter certains caractères encodés comme des délimiteurs d'arguments. En exploitant la conversion des caractères Windows (\xad vers -), un attaquant peut injecter des paramètres PHP dans la requête CGI.
GET /index.php?%ADd+allow_url_include%3d1+%ADd+auto_prepend_file%3dphp://input HTTP/1.1
Content-Type: application/x-www-form-urlencoded
<?php system('whoami'); ?>
Versions affectées : PHP 8.3.x < 8.3.8, 8.2.x < 8.2.20, 8.1.x < 8.1.29 (Windows CGI/FastCGI)
Cette CVE est en réalité un contournement du patch de CVE-2012-1823 — une vulnérabilité CGI PHP vieille de 12 ans que les développeurs pensaient avoir corrigée.
CVE-2019-11043 : RCE dans php-fpm (CVSS 9.8)
Une buffer underflow dans le gestionnaire de requêtes php-fpm combinée avec une mauvaise configuration Nginx permettait une exécution de code à distance.
Condition : Nginx configuré avec fastcgi_split_path_info et une regex vulnérable pointant vers php-fpm.
# Configuration Nginx VULNÉRABLE
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_pass unix:/run/php/php7.3-fpm.sock;
# ...
}
L'attaquant pouvait provoquer un crash de php-fpm et, via la gestion de la pile mémoire, exécuter du code arbitraire.
CVE-2018-19518 : RCE via IMAP (CVSS 9.8)
Une injection de commandes dans l'extension IMAP de PHP permettait l'exécution de commandes système via imap_open() avec un serveur IMAP malveillant contrôlé par l'attaquant.
CVE-2016-7124 : Unserialize Object Injection (CVSS 9.8)
Une faille dans la gestion des objets sérialisés lors de unserialize() permettait de créer des objets de types non prévus, conduisant à l'exécution de code arbitraire via des "gadget chains" dans les frameworks PHP.
Cette CVE illustre un problème structurel PHP : unserialize() sur des données non fiables est dangereux dans toutes les versions de PHP.
Les risques de configuration PHP
Au-delà des CVE du moteur, des configurations dangereuses exposent des millions d'applications :
register_globals (supprimé en PHP 5.4 mais toujours présent via contournements)
Permettait d'injecter des variables superglobales depuis les paramètres HTTP — un vecteur classique d'injection.
allow_url_fopen / allow_url_include
; DANGEREUX — permet include() depuis des URLs
allow_url_include = On
; CORRECT
allow_url_include = Off
allow_url_fopen = Off ; si non nécessaire
expose_php
; DANGEREUX — révèle la version PHP dans les en-têtes
expose_php = On
; CORRECT
expose_php = Off
error reporting en production
; DANGEREUX en production — révèle les chemins et la structure
display_errors = On
; CORRECT en production
display_errors = Off
log_errors = On
error_log = /var/log/php/errors.log
Sécuriser PHP
1. Mettre à jour vers une version supportée
# Vérifier la version
php --version
# Versions supportées (fin 2024)
# PHP 8.3 — supporté jusqu'en novembre 2026
# PHP 8.2 — supporté jusqu'en décembre 2025
# PHP 8.1 — supporté jusqu'en décembre 2024 (fin de vie)
# PHP 7.x, 5.x — plus supportés, vulnérables !
2. Configurer php.ini de manière sécurisée
; /etc/php/8.2/fpm/php.ini
expose_php = Off
display_errors = Off
log_errors = On
allow_url_include = Off
allow_url_fopen = Off
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
open_basedir = /var/www/html:/tmp
3. Utiliser des types stricts
<?php
declare(strict_types=1);
// Force la vérification de types — réduit les vecteurs d'injection
function processId(int $id): array {
// $id est forcément un entier
}
4. Valider et assainir toutes les entrées
// Validation
$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);
if ($id === false || $id === null) {
throw new InvalidArgumentException('Invalid ID');
}
// Requêtes préparées UNIQUEMENT (jamais de concaténation SQL)
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = ?');
$stmt->execute([$id]);
5. Utiliser les en-têtes de sécurité HTTP
// Dans chaque réponse ou via le serveur web
header('X-Content-Type-Options: nosniff');
header('X-Frame-Options: SAMEORIGIN');
header('Content-Security-Policy: default-src \'self\'');
6. Scanner les dépendances Composer
# Installer et lancer l'audit de sécurité Composer
composer audit
# Ou utiliser local-php-security-checker
local-php-security-checker --path=/var/www/html/composer.lock
PHP et les frameworks : la surface élargie
Les CVE PHP impactent aussi les frameworks et CMS populaires :
- WordPress (PHP) : des centaines de CVE de plugins
- Laravel : quelques CVE de désérialisation
- Drupal : Drupalgeddon (CVE-2018-7600, CVSS 9.8) — RCE massivement exploitée
Maintenir PHP à jour est nécessaire mais insuffisant — les dépendances Composer et les CMS doivent aussi être surveillés.
Vérifiez les CVE PHP sur cveo.tech — cherchez php pour voir toutes les vulnérabilités référencées dans la NVD.