8. Prévention et sécurisation — protéger ses applications contre les failles d’inclusion

Après avoir maîtrisé l’exploitation des failles LFI et RFI, cette unité finale présente toutes les mesures de prévention. La défense en profondeur est le principe clé.

Règle n°1 : Ne jamais inclure des fichiers via une entrée utilisateur directe

La meilleure protection est d’utiliser une liste blanche (whitelist) des pages autorisées :

<?php
// Mauvais
include($_GET['page'] . '.php');

// Bon : whitelist explicite
$pages = ['accueil', 'contact', 'apropos'];
$page = $_GET['page'] ?? 'accueil';
if (!in_array($page, $pages, true)) { $page = 'accueil'; }
include('pages/' . $page . '.php');
?>

Règle n°2 : Désactiver allow_url_include

# Dans php.ini
allow_url_include = Off
allow_url_fopen = Off

# Vérifier
php -i | grep allow_url

Règle n°3 : Utiliser open_basedir

Restreint les fichiers accessibles par PHP à un répertoire spécifique :

# Dans php.ini
open_basedir = /var/www/html/:/tmp/

# Par virtual host Apache
<VirtualHost *:80>
    php_admin_value open_basedir /var/www/html/
</VirtualHost>

# Avec open_basedir, inclure /etc/passwd retourne :
# Warning: open_basedir restriction in effect. File /etc/passwd is not within the allowed path(s)

Règle n°4 : Valider les chemins avec realpath()

<?php
function include_safe(string $page, string $base): void {
    $real = realpath($base . $page . '.php');
    $base = realpath($base);
    if ($real === false || strpos($real, $base) !== 0) {
        http_response_code(403);
        die('Accès refusé');
    }
    include($real);
}
include_safe($_GET['page'] ?? 'accueil', '/var/www/html/pages/');
?>

Règle n°5 : Sécuriser les logs serveur

# Les logs Apache ne doivent pas être lisibles par www-data
chown root:adm /var/log/apache2/access.log
chmod 640 /var/log/apache2/access.log

Règle n°6 : WAF ModSecurity

sudo apt install libapache2-mod-security2
sudo a2enmod security2
# SecRuleEngine On  dans modsecurity.conf

Checklist de sécurisation

  • Utiliser une whitelist pour les fichiers inclus
  • Désactiver allow_url_include dans php.ini
  • Configurer open_basedir
  • Valider les chemins avec realpath()
  • Restreindre les permissions des logs serveur
  • Déployer un WAF (ModSecurity + OWASP CRS)
  • Maintenir PHP à jour

Audit de code

# Détecter les inclusions potentiellement vulnérables
grep -rn "include|require" /var/www/html/ | grep -E "\$_(GET|POST|REQUEST|COOKIE)"
Points clés :

  • La whitelist est la protection la plus efficace : n’autorisez que les fichiers connus
  • open_basedir + allow_url_include = Off sont les deux directives php.ini essentielles
  • realpath() neutralise la traversée de répertoires en résolvant le chemin absolu réel
SEE ALL Add a note
YOU
Add your Comment