Aller au contenu

File inclusion vulnerability

Vulnérabilité d'inclusion de fichiers

Description

Une vulnérabilité d'inclusion de fichiers est un type de vulnérabilité web qui affecte généralement les langages de programmation qui s'appuient sur un environnement d'exécution de script. Cette vulnérabilité survient lorsqu'une application construit un chemin vers du code exécutable en utilisant un argument contrôlé par l'utilisateur. Cette construction permet à l'attaquant de dicter quel fichier est exécuté pendant l'exécution.

Contrairement à une attaque de traversée de chemin, où l'accès non autorisé au système de fichiers permet un accès en lecture seule aux fichiers, une vulnérabilité d'inclusion de fichiers permet l'inclusion et l'exécution de code au moment de l'exécution. L'exploitation réussie de cette vulnérabilité peut permettre l'exécution de code à distance, l'accès non autorisé aux fichiers et la fuite d'informations sensibles.

Les vulnérabilités d'inclusion de fichiers peuvent être divisées en deux grandes catégories :

  • Local File Inclusion (LFI) : Dans ce scénario, un attaquant est limité aux fichiers locaux présents sur le serveur web. Selon le langage de programmation et la configuration, il peut être possible d'escalader cette attaque en une exécution de code à distance en utilisant des schémas spéciaux comme php://.
  • Remote File Inclusion (RFI) : Bien que peu courante dans les applications web modernes, si elle est présente, cette vulnérabilité peut permettre l'exécution de code à distance en incluant du code malveillant.
<?php

$page = $_GET['page'];
include($page . '.php');

?>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%

String page = request.getParameter("page");
include(page + ".jsp");

%>
<!DOCTYPE html>
<html>
<head>
<title>Test file</title>
</head>
<body>
<!--#include file="$USER_LANGUAGE"-->
</body>
</html>

Recommandation

Pour remédier aux vulnérabilités d'inclusion de fichiers, considérez les recommandations suivantes :

  • Éviter l'inclusion dynamique de fichiers à partir des entrées utilisateur : Sauf nécessité, évitez d'appeler include(), require() ou des fonctions similaires avec des entrées contrôlées par l'utilisateur.
  • Liste blanche des entrées : Utilisez des listes blanches pour n'autoriser que les valeurs d'entrée connues et attendues.
  • Validation et nettoyage des entrées : Nettoyez les entrées utilisateur des caractères spéciaux qui peuvent permettre la traversée de chemin comme ../
  • Utiliser un tableau de mappage de fichiers : Créez un tableau qui assigne des index uniques aux fichiers autorisés. Chaque index correspond à un fichier spécifique au sein de votre application.
<?php

// Get the requested page from the query string
$page = isset($_GET['page']) ? $_GET['page'] : 'home';

// Define a whitelist of allowed pages
$allowed_pages = ['home', 'about', 'contact'];

// Check if the requested page is in the whitelist
if (in_array($page, $allowed_pages)) {
// Include the valid page
include($page . '.php');
} else {
// Redirect to a default page or display an error message
include('error.php');
}

?>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.List" %>

<%
// Get the requested page from the query string
String page = request.getParameter("page");

// Define a whitelist of allowed pages
List<String> allowedPages = List.of("home", "about", "contact");

// Check if the requested page is in the whitelist
if (allowedPages.contains(page)) {
    // Include the valid page
    %><jsp:include page="<%= page %>.jsp" /><%
} else {
    // Redirect to a default page or display an error message
    response.sendRedirect("error.jsp");
}
%>
<!DOCTYPE html>
<html>
<head>
<title>Test file</title>
</head>
<body>
<!--#if expr='"$USER_LANGUAGE" =~ /^(en|fr|es)$/ -->
   <!--#include file="/path/to/allowed_languages/$USER_LANGUAGE"-->
<!--#else -->
   <p>Invalid language selection.</p>
<!--#endif -->
</body>
</html>

Liens

Normes

  • CWE_TOP_25:
    • CWE_22
  • GDPR:
    • ART_5
    • ART_32
  • PCI_STANDARDS:
    • REQ_6_5
    • REQ_11_3
  • SOC2_CONTROLS:
    • CC_2_1
    • CC_4_1
    • CC_6_1
    • CC_7_1
    • CC_7_2
    • CC_7_4
    • CC_7_5
  • HIPAA_CONTROLS:
    • SECURITY212
    • SECURITY213
    • SECURITY255