Saltar a contenido

File inclusion vulnerability

Vulnerabilidad de inclusión de archivos

Descripción

Una vulnerabilidad de inclusión de archivos es un tipo de vulnerabilidad web que generalmente afecta a los lenguajes de programación que dependen de un entorno de ejecución de scripts. Esta vulnerabilidad surge cuando una aplicación construye una ruta hacia un código ejecutable utilizando un argumento controlado por el usuario. Esta construcción permite al atacante dictar qué archivo se ejecuta durante el tiempo de ejecución.

A diferencia de un ataque de path traversal, donde el acceso no autorizado al sistema de archivos permite el acceso de solo lectura a los archivos, una vulnerabilidad de inclusión de archivos permite la inclusión y la ejecución de código en tiempo de ejecución. La explotación exitosa de esta vulnerabilidad puede permitir la ejecución remota de código, el acceso no autorizado a archivos y la fuga de información confidencial.

Las vulnerabilidades de inclusión de archivos se pueden dividir en dos categorías principales:

  • Local File Inclusion (LFI): En este escenario, un atacante se limita a los archivos locales presentes en el servidor web. Dependiendo del lenguaje de programación y la configuración, puede ser posible escalar este ataque a una ejecución de código remoto utilizando esquemas especiales como php://.
  • Remote File Inclusion (RFI): Aunque no es muy común en las aplicaciones web modernas, si está presente, esta vulnerabilidad puede permitir la ejecución de código remoto mediante la inclusión de código malicioso.
<?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>

Recomendación

Para abordar las vulnerabilidades de inclusión de archivos, considere las siguientes recomendaciones:

  • Evitar la inclusión dinámica de archivos a partir de la entrada del usuario: a menos que sea necesario, evite llamar a include(), require() o funciones similares con entradas controladas por el usuario.
  • Lista blanca de entradas: Utilice listas blancas para permitir solo valores de entrada conocidos y esperados.
  • Validación y saneamiento de entradas: Desinfecte la entrada del usuario de caracteres especiales que puedan permitir el path traversal como ../
  • Utilizar matriz de mapeo de archivos: Cree una matriz que asigne índices únicos a los archivos permitidos. Cada índice corresponde a un archivo específico dentro de su aplicación.
<?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>

Enlaces

Estándares

  • 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