웹 애플리케이션 파일 포함 취약점 이해

Beginner

소개

웹 애플리케이션에서 가장 흔하게 발생하는 문제 중 하나인 파일 포함 (File Inclusion) 취약점에 초점을 맞춘, 초보자를 위한 웹 애플리케이션 취약점 강좌에 오신 것을 환영합니다.

본 모듈에서는 먼저 웹 애플리케이션의 맥락에서 '파일 포함 (file inclusion)'의 개념을 분석해 보겠습니다. 그런 다음 그 기반 위에 구축하여 '파일 포함 취약점 (file inclusion vulnerability)'이 무엇인지 명확히 설명할 것입니다. 마지막으로, 파일 포함 취약점의 두 가지 주요 범주를 자세히 살펴보겠습니다.

본 모듈의 다음 섹션에서는 '로컬 파일 포함 취약점 (Local File Inclusion Vulnerabilities)'과 '원격 파일 포함 취약점 (Remote File Inclusion Vulnerabilities)'을 더 깊이 탐구하여 이러한 중요한 보안 문제에 대한 포괄적인 이해를 제공할 것입니다.

주요 학습 목표
  • 웹 애플리케이션에서 파일 포함의 기본 개념을 이해합니다.
  • 파일 포함 취약점의 근본 원리를 파악합니다.
  • 로컬 (Local) 및 원격 (Remote) 이라는 파일 포함 취약점의 두 가지 주요 유형에 대해 학습합니다.
이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 96%입니다.학습자들로부터 100%의 긍정적인 리뷰율을 받았습니다.

파일 포함 이해

초보자를 위해 특별히 고안된 "파일 포함 (file inclusion)"의 개념과 잠재적인 취약점에 대해 자세히 알아보겠습니다.

파일 포함은 특히 코드 재사용의 맥락에서 프로그래밍에서 흔히 사용되는 관행입니다. 개발자들은 자주 사용되는 함수나 모듈을 별도의 파일로 캡슐화하는 경우가 많습니다. 이러한 함수나 모듈이 필요할 때, 코드를 반복해서 작성할 필요 없이 해당 파일을 자신의 코드에 포함시키기만 하면 됩니다.

PHP 에는 파일 포함을 위한 네 가지 주요 함수가 있습니다.

  1. include()
  2. require()
  3. include_once()
  4. require_once()

각각에 대한 간략한 개요는 다음과 같습니다.

  • include(): 이 함수는 호출될 때 파일을 포함합니다. 파일을 찾을 수 없으면 PHP 는 경고 (warning) 를 발생시키지만 스크립트는 계속 실행됩니다.
  • require(): 이 함수는 스크립트 실행 전에 파일을 포함합니다. 파일을 찾을 수 없으면 PHP 는 치명적인 오류 (fatal error) 를 발생시키고 스크립트 실행을 중단합니다.
  • include_once()require_once(): 이 함수들은 include()require()와 유사하게 작동하지만, 함수가 여러 번 호출되더라도 파일이 한 번만 포함되도록 보장합니다.

파일 포함 방식은 크게 두 가지 유형으로 분류할 수 있습니다.

  1. 정적 포함 (Static inclusion)
  2. 동적 포함 (Dynamic inclusion)

이 두 유형의 차이점은 다음 섹션의 예시를 통해 명확히 설명될 것입니다.

본 과정에서는 /home/labex/project/ 디렉토리에 위치한 세 개의 .php 파일을 살펴볼 것입니다. 이 파일들은 다음과 같습니다.

  • lfi_static.php
  • lfi_dynamic.php
  • echo.php

각 파일이 어떤 역할을 하는지 이해해 봅시다.

  • lfi_static.php: 이 파일은 echo.php 파일을 정적인 방식으로 포함합니다. 즉, echo.php 파일의 경로는 하드 코딩되어 변경되지 않습니다. 이 방식은 안전하며 어떠한 취약점도 노출하지 않습니다.

    <?php
    include("./echo.php");
    ?>
  • lfi_dynamic.php: 이 파일은 URL 의 'file' 매개변수에 따라 다른 파일을 포함합니다. 이 매개변수가 제공되지 않으면 단순히 사용 방법을 알려주는 힌트를 제공합니다. 하지만 이 매개변수가 공격자에 의해 제어될 수 있다면 이 방식은 위험할 수 있습니다.

    <?php
    if (isset($_GET['file'])) {
        include($_GET['file']);
    }
    else{
        echo "You can use the 'file' parameter to include files";
    }
    ?>
  • echo.php: 이 파일은 포함될 때 성공 메시지를 출력합니다.

    <?php
    echo 'Great, now you have successfully included the content of echo.php!'
    ?>

lfi 테스트를 위해 이미지를 준비하려면 터미널에서 다음 명령을 사용하십시오.

cd ~/projects
docker build -t lfi-image .

이미지 빌드가 완료되면 해당 이미지를 사용하여 lfi 취약점을 테스트할 컨테이너를 시작할 수 있습니다.

docker run -d --name lfi -p 80:80 lfi-image

이제 브라우저에서 이러한 파일을 테스트할 수 있습니다. 예를 들어, lfi_static.php 파일에 액세스하려면 다음 URL 을 입력합니다.

http://127.0.0.1/LFI/lfi_static.php

lfi_static.php 파일이 echo.php의 내용을 성공적으로 포함하는 것을 볼 수 있습니다. 이 정적 파일 포함 방식은 안전하다는 점을 기억하십시오.

이제 lfi_dynamic.php 파일을 살펴보겠습니다. 이 URL 을 사용하여 액세스하십시오.

http://127.0.0.1/LFI/lfi_dynamic.php

'file' 매개변수를 사용하라는 메시지가 표시됩니다. 이제 이 매개변수를 사용하여 echo.php를 포함해 보겠습니다.

http://127.0.0.1/LFI/lfi_dynamic.php?file=./echo.php

echo.php가 성공적으로 포함된 것을 볼 수 있습니다. 이것이 파일 포함이 작동하는 방식을 보여줍니다. 이것은 PHP 예시이지만, 사용되는 특정 함수는 다를 수 있더라도 그 원리는 다른 프로그래밍 언어에도 적용된다는 점을 기억하는 것이 중요합니다.

파일 포함 취약점 이해

우리는 방금 lfi_dynamic.php에서 file 매개변수를 사용하여 echo.php 파일을 포함하는 방법을 배웠습니다. 하지만 다음과 같은 질문이 생깁니다.

file 매개변수를 사용하여 다른 파일을 포함하는 것이 가능할까요?

대답은 단연코 '예'입니다!

웹 개발자가 file 매개변수를 검증 (validate) 하는 것을 소홀히 하면, 서버에 위치한 민감한 파일을 포함하도록 악용될 수 있습니다.

다음은 몇 가지 예시입니다.

  • Linux 시스템에서는 /etc/passwd 파일을 포함할 수 있을 수 있습니다.
  • Windows 시스템에서는 C:\Windows\System32\drivers\etc\hosts 파일을 포함할 수 있을 수 있습니다.

예시를 통해 이를 설명해 보겠습니다. file 매개변수를 /etc/passwd로 설정한다고 가정해 봅시다.

http://127.0.0.1/LFI/lfi_dynamic.php?file=/etc/passwd

브라우저에서 해당 URL 을 열면 /etc/passwd 파일의 내용을 성공적으로 포함하고 표시하는 것을 볼 수 있습니다. 이는 심각한 보안 문제인 로컬 파일 포함 (Local File Inclusion, LFI) 취약점이 존재함을 나타냅니다.

이러한 취약점을 이해하는 것이 이를 방지하기 위한 첫 번째 단계임을 기억하십시오. 항상 웹 애플리케이션에서 모든 사용자 입력을 검증하고 정제 (sanitize) 해야 합니다.

파일 포함 취약점 유형

웹 보안에서 중대한 문제인 파일 포함 취약점은 일반적으로 두 가지 주요 유형으로 나뉩니다.

  1. 로컬 파일 포함 (Local File Inclusion, LFI): 이 유형의 취약점은 대상 서버에 있는 로컬 파일이 포함될 때 발생합니다.

  2. 원격 파일 포함 (Remote File Inclusion, RFI): 이 유형의 취약점은 다른 원격 서버에 위치한 파일이 포함될 때 발생합니다.

앞서 논의한 예시에서 로컬 /etc/passwd 파일을 포함한 것은 로컬 파일 포함 (LFI) 취약점의 전형적인 사례입니다. 이 두 가지 유형의 취약점 간의 차이점을 이해하는 것은 웹 애플리케이션을 효과적으로 보호하는 데 매우 중요합니다.

요약

본 랩 (Lab) 에서는 파일 포함 기능을 통해 공격을 시작하는 방법과 프로세스에 대해 학습했습니다. 이 섹션에서 다룬 중요한 사항들을 검토해 보겠습니다.

  • 파일 포함 (file inclusion) 이란 무엇인가?
  • 파일 포함 취약점 (file inclusion vulnerability) 이란 무엇인가?
  • 파일 포함 취약점의 두 가지 유형은 무엇인가?