コンテンツにスキップ

File inclusion vulnerability

ファイルインクルージョンの脆弱性

説明

ファイル インクルージョンの脆弱性は、通常、スクリプト ランタイムに依存するプログラミング言語に影響を与える Web の脆弱性の一種です。この脆弱性は、アプリケーションがユーザー制御の引数を使用して実行可能コードへのパスを構築するときに発生します。この構築により、攻撃者は実行時にどのファイルが実行されるかを指示できるようになります。

パス トラバーサル攻撃 (ファイル システムへの不正アクセスによりファイルの読み取り専用アクセスが許可される) とは異なり、ファイル インクルージョンの脆弱性では、実行時のコードのインクルードと実行が許可されます。この脆弱性の悪用に成功すると、リモート コード実行、不正なファイル アクセス、および機密情報の漏洩が可能になる場合があります。

ファイル インクルージョンの脆弱性は、2 つの主要なカテゴリに分類できます。

  • Local File Inclusion (LFI): このシナリオでは、攻撃者は Web サーバー上に存在するローカル ファイルに限定されます。プログラミング言語と設定によっては、php:// などの特別なスキームを使用して、この攻撃をリモート コード実行にエスカレートできる場合があります。
  • Remote File Inclusion (RFI): 最新の Web アプリケーションではあまり一般的ではありませんが、存在する場合、この脆弱性により、悪意のあるコードを含めることでリモート コードの実行が可能になる可能性があります。
<?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>

推奨事項

ファイル インクルージョンの脆弱性に対処するには、次の推奨事項を検討してください。

  • ユーザー入力からの動的なファイル インクルージョンを回避する: 必要がない限り、ユーザーが制御する入力を使用して include()require()、または同様の関数を呼び出さないでください。
  • 入力のホワイトリスト化: ホワイトリストを使用して、既知の予期される入力値のみを許可します。
  • 入力の検証とサニタイズ: ../ など、パス トラバーサルを可能にする可能性のある特殊文字からユーザー入力をサニタイズします。
  • ファイル マッピング配列の使用: 許可されたファイルに一意のインデックスを割り当てる配列を作成します。各インデックスは、アプリケーション内の特定のファイルに対応します。
<?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>

リンク

標準

  • 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