파일 포함 이해
초보자를 위해 특별히 고안된 "파일 포함 (file inclusion)"의 개념과 잠재적인 취약점에 대해 자세히 알아보겠습니다.
파일 포함은 특히 코드 재사용의 맥락에서 프로그래밍에서 흔히 사용되는 관행입니다. 개발자들은 자주 사용되는 함수나 모듈을 별도의 파일로 캡슐화하는 경우가 많습니다. 이러한 함수나 모듈이 필요할 때, 코드를 반복해서 작성할 필요 없이 해당 파일을 자신의 코드에 포함시키기만 하면 됩니다.
PHP 에는 파일 포함을 위한 네 가지 주요 함수가 있습니다.
include()
require()
include_once()
require_once()
각각에 대한 간략한 개요는 다음과 같습니다.
include(): 이 함수는 호출될 때 파일을 포함합니다. 파일을 찾을 수 없으면 PHP 는 경고 (warning) 를 발생시키지만 스크립트는 계속 실행됩니다.
require(): 이 함수는 스크립트 실행 전에 파일을 포함합니다. 파일을 찾을 수 없으면 PHP 는 치명적인 오류 (fatal error) 를 발생시키고 스크립트 실행을 중단합니다.
include_once() 및 require_once(): 이 함수들은 include() 및 require()와 유사하게 작동하지만, 함수가 여러 번 호출되더라도 파일이 한 번만 포함되도록 보장합니다.
파일 포함 방식은 크게 두 가지 유형으로 분류할 수 있습니다.
- 정적 포함 (Static inclusion)
- 동적 포함 (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 예시이지만, 사용되는 특정 함수는 다를 수 있더라도 그 원리는 다른 프로그래밍 언어에도 적용된다는 점을 기억하는 것이 중요합니다.