Skip to content
Snippets Groups Projects

File Inclusion

aka LFI / RFI

/





tapez <prez>.html?<username-uca> dans votre navigateur pour suivre le cours avec votre nom de vm

File Inclusion

  • paramètres HTTP non filtrés
include($_REQUEST['filename']);

File Inclusion / types

  • Local File inclusion
  • Remote File inclusion

LFI / low

  • souvent appelé Directory traversal

  • permet d'accéder à des fichiers sensibles

  • marche aussi avec /etc/hosts, ~/.bashrc, ~/.bash_history ...

  • marche pas avec /etc/shadow

Note:

  • open base dir
    • pas ou mal configiuré
    • par défaut ispconfig
  • anciennement safe_mode

LFI / low

  • paths absolus / paths relatifs (../.. ou ..\..)
  • linux /etc/passwd, ../../../../../etc/hosts
  • windows c:\boot.ini, c:\windows, c:\windows\system32\drivers\etc\hosts
  • /?page=index.php
    • boucle infinie = ca marche
      • invalider par (include|require)_once

RFI

  • inclusion de code arbitraire

    • Backdoor ou Remote shell
  • dépend de la configuration de php /etc/php/7.4/apache2/php.ini

allow_url_include=On  # just for test purpose

$ sudo systemctl restart apache2

certains produits PHP nécessitent cette option!

RFI / low

FI / payloads / backdoor

  • Basiquement permet d'exécuter du code et / ou des commandes systèmes

RFI / payloads / backdoor

RFI / security medium

  $file = str_replace( 
    array( "http://", "https://" ),
    "", 
    $file 
  );

Note:

  • discuter la surcharge du php.ini via .htaccess
    • solution ispconfig
  • on reste bien sur security low pour que ca marche

LFI / security medium

  $file = str_replace(
    array( "../", "..\\" ), 
    "", 
    $file 
  );

LFI / security high

if( !fnmatch( "file*", $file ) && $file != "include.php" ) {
    // This isn't the page we want!
    echo "ERROR: File not found!";
    exit;
}

open_base_dir

  • A l'appel de fonctions de type require_once ou fopen
    • le chemin vers le fichier est analysé
      • si le fichier est à l'extérieur des dossiers spécifiés
        • PHP refuse d'y accéder
      • les liens symboliques sont résolus
        • il n'est pas possible d'outre-passer cette restriction avec un lien symbolique

open_base_dir

  • . inclue le fichier lui-même

    • problématique si on change le dossier courant avec chdir()
  • valeur typique

/var/www/:/usr/share/php:/tmp

Note:

  • utilisé et configuré en automatique dans ISPConfig
  • on peut désactiver chdir ...

realpath() and basename()

  • realpath()
    • converti tous les . et .. en path absolue
    • retourne null pour un path inexistant
  • basename()
    • extrait la partie contenant le nom du dossier précédant directement le nom du fichier
  • 2 fonctions qui combinées évitent les directory traversal

realpath() and basename()

$username = $_GET['user'];
$filename = "/home/users/".$username.".txt";
readfile($filename);

peut être sécurisé via realpath() et basename()

$username = basename(realpath($_GET['user']));
$filename = "/home/users/".$username.".txt";
readfile($filename);

ne préserve pas d'une LFI dans le même répertoire

Se préserver