웹 해킹의 개념

File Include 취약점

ser-ser 2025. 2. 7. 16:20

웹 애플리케이션에서 자주 거론되는 취약점 중 하나로 File Include 취약점이 있습니다
서버 측에서 특정 파라미터에 따라 외부 파일을 불러오도록 구현되어 있을 때
공격자가 이를 악용해 임의의 파일을 불러오거나, 실행할 수도 있다는 점이 중 위험 요소입니다
이번 블로그는 File Include 취약점의 개념과 여러 중요한 기능들의 차이점 실제 공격 시 어떤 일이
일어날 수 있는지를 알아보도록 하겠습니다


1. 파일 인클루드(File Include) 취약점

다음과 같은 코드가 있다고 가정해 봅시다

<?php
	include($_GET['file']);
?>

include 함수를 사용할 때, $_GET ['file'] 값에 사용자가 임의의 값을 넣을 수 있게 된다면 공격자는

서버에 존재하는 파일을 마음대로 불러올 수 있습니다
ex> https://hesac.com/index.php?file=../secret/data.php 같은 식으로 접근하면, data.php 파일을 불러와질 수 있습니다
이때 문제가 되는 것은 공격자가 민감한 정보가 들어있는 DB 계정 파일이나 설정 파일 등을 불러와서 확인할 수 있게 됩니다 이런 종류의 취약점을 File Include 취약점이라고 합니다

 

🥏실습

  • include가 들어간. php파일 생성 합니다

  • 시험 삼아 출력할. php 파일생성 합니다

  • 정상적으로 출력되는 것 확인이 됩니다

  • 현재 재작 중인 개인 웹페이지도 접속되는 것이 확인이 됩니다

2. LFI(Local File Include), RFI(Remote File Include)

  • LFI
    • 개념 : 웹 서버 내부(Local)에 존재하는 파일을 불러올 수 있는 취약점
    • 특징 : 공격자는 서버 내의 중요한 설정 파일 등을 열람할 수 있습니다
    • ex :../../../../../../etc/passwd

 

🥏실습

 

 


  • RFI
    • 개념 : 외부(Remote)에 있는 파일을 불러올 수 있는 취약점
    • 특징 : 공격자가 직접 악성 스크립트가 포함된 외부 파일을 서버에서 실행하도록 합니다
    • ex :? lang=http://hesac.com/data.txt와 같은 형태로 외부의 파일을 서버 측에서 로드 및 실행

 

🥏실습

  • php.ini에서 allow_url_include 옵션이 On 상태여야 외부 파일 포함이 가능합니다.

    • php.ini에 allow_url_include 옵션을 On으로 수정을 해주고

  • ? file= 뒤에 외부 링크를 넣어 실행을 했으며 잘 실행된 것을 확인할 수 있었습니다

3. 소스 코드 유출과 파일 실행

  1. 소스 코드 유출
    • 일반적으로 .php와 같은 서버 측 스크립트 언어는 웹 서버에 의해 실행된 뒤 결과만 사용자에게 전송됩니다 그래서 단순히 include를 이용해 .php 파일을 열람하려고 해도 소스 코드 자체를 다운받지 않는 이상 실행된 결과만 보게 될 수 있습니다
  1.  
  2. 파일 실행
    • PHP에서 include()된 파일은 실제로 코드가 실행됩니다 만약 공격자가 원하는 악성 스크립트가 서버 어딘가에
    • 업로드되어 있거나 로그 파일 등에 삽입되어 있다면 그 스크립트를 실행시킬 수 있게 됩니다

4. 파일 다운로드 (소스 노출) 취약점

  • 파일 다운로드 취약점: 서버에 존재하는 파일을 다운로드할 수 있지만 실행은 불가능합니다 하지만 소스 코드(예: . php). php 등을 그대로 다운로드할 수 있어 소스 유출의 위험이 있습니다

🥏실습

  • 실습하기전 알아둬야 할 스트림 래퍼가 있습니다
    php://filter/convert.base64-encode/resource=
  • php://filter : 일반 파일 시스템 접근이 아니라, 필터를 적용해서 읽어들이는 동작을 수행하도록 PHP에 지시합니다
  • /convert.base64-encode : 파일 내용을 Base64 인코딩 방식으로 변환합니다 (이유: 바이너리 데이터를 텍스트로 안전하게 표현하기 위해서)
  • /resource= : PHP가 읽어올 실제 파일의 경로

  • 🎇해당 코드를 숙지해야 PHP 파일의 소스코드를 읽어 올 수 있습니다🎇
    따라서 파일 다운로드 취약점을 이용할 때는 위 수식을 사용하는 것이 표준적인 방법입니다

  • 다운로드 페이지를 하나 만들었습니다

  • ? file=php://filter/convert.base64-encode/resource=delete_post.php
    를 입력하여 현재 제가 재작 중인 웹페이지 한 부분의 소스코드를 추출해 보도록 하겠습니다

  • 인코딩 되어 잘 출력된 것을 확인했으며 이것을 디코딩하여 원본 소스코드랑 비교해 보도록 하겠습니다

  • 오차 하나도 없이 잘 출력된 것을 확인할 수 있었습니다

5. 추가적으로 알아두면 좋은 개념

    1. DB에 파일을 저장하는 방법
      • BLOB, CLOB와 같이 대용량 데이터를 데이터베이스 칼럼에 저장하는 방법
      • 파일을 직접 서버 로컬에 저장하지 않고 DB에 저장해 두는 경우도 있으므로 이런 상황에서 LFI/RFI 취약점은 영향을 다르게 받을 수 있습니다
    2. NAS(Network Attached Storage)
      • 웹 서버가 아닌 외부 파일 서버(NAS)에 파일을 저장해 두고, 웹 애플리케이션에서 가져다가 쓰는 경우도 있습니다. 이 경우에도 파일 인클루드에 대한 점검이 필요합니다
    3. 로그 파일을 이용한 공격
      • LFI가 존재하는 상황에서 웹 서버 로그에 공격자가 삽입한 악성 문자열이 저장되어 있다면 그 로그 파일을 LFI로 다시 불러오는 방식으로 악성 코드를 실행할 수 있게 됩니다
      • ex :? lang=/var/log/apache2/access.log? lang=/var/log/apache2/access.log 형태로 로그 파일을 불러오면, 그 안에 포함된 php 코드가 실행될 수 있습니다

6. 방어 방법 및 권장 사항

    1. 사용자 입력 검증
      • include, require 등 파일을 불러오는 PHP 함수를 사용할 때는 사용자가 입력한 값을 그대로 경로에 대입하지 않도록 합니다
      • 화이트리스트(사전에 허용된 파일명만 인정) 방식으로 허용할 파일을 제한하거나 정규식을 이용해 사용자가 입력할 수 있는 값을 엄격하게 제한합니다
    2. 출력 인코딩/필터링
      • HTML 엔티티 변환 등으로 파일 경로와 같은 사용자 입력을 특수문자로 인코딩해 의도치 않은 실행을 방지합니다
    3. 로그 파일 보호
      • 로그 파일에 공격자가 임의로 코드를 심을 수 없도록 웹 서버 로그 설정을 주기적으로 모니터링하고 읽기 전용권한을 부여하는 등 방어책을 마련합니다