
È un difetto di sanitizzazione dell'input causato da una discrepanza di codifica, che consente a input appositamente creati di bypassare i filtri. Se un server è vulnerabile, un attaccante può iniettare SQL dannoso che il backend esegue.
#Ho scritto questo exploit facendo riferimento al PoC disponibile su CVE-2025-1094
CVE‑2025‑1094 è una vulnerabilità di sanitizzazione degli input nelle funzioni di escape libpq di PostgreSQL e nello strumento interattivo psql. Deriva da una gestione impropria delle codifiche multi-byte quando la codifica del client è impostata su BIG5. In determinate condizioni, ciò può portare a una gestione errata dei caratteri di escape, consentendo agli aggressori di bypassare i confini previsti delle query.
Questa vulnerabilità è stata scoperta da Rapid7 durante l'analisi di CVE‑2024‑12356, un problema separato nei dispositivi BeyondTrust. Il comportamento di PostgreSQL è stato sfruttato come parte di una più ampia vulnerabilità a catena per influenzare ulteriormente il comportamento del backend.
Quando un server web o un'applicazione passa l'input dell'utente direttamente in query SQL eseguite tramite psql e è impostato su , un input appositamente predisposto può terminare precocemente un'istruzione SQL e aggiungere SQL malevolo.
client_encodingBIG5Ciò consente operazioni aggiuntive come la lettura di file locali (ad esempio /etc/passwd) tramite funzioni di PostgreSQL come lo_export, pg_read_file o simili.
Di default, questa non è una vulnerabilità di esecuzione remota di codice (RCE) in PostgreSQL. Piuttosto, è un uso improprio delle API client di PostgreSQL che, se non adeguatamente filtrate o escaped, può essere abusato per divulgare contenuti sensibili di file o potenzialmente eseguire SQL pericoloso.
COPY TO, pg_read_file o lo_export quando combinati con SQL injection nelle applicazioni client.BIG5 e l'input non è adeguatamente sanificato.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 per leggere /etc/passwd in un file accessibile dal server
sql = \
"""
DO $$ DECLARE f text; BEGIN f := pg_read_file('/etc/passwd', 0, 1000);
RAISE NOTICE '%%', f; END $$;
"""
cursor.execute(sql)
conn.commit()
##✅ Cosa fa questo Exploit.py:
Imposta PGCLIENTENCODING=BIG5 nell'ambiente (condizione scatenante).
Costruisce un payload di SQL injection per evadere da una query e inserire un nuovo comando COPY TO PROGRAM.
Invia il payload tramite una richiesta GET al server web vulnerabile (/search?q=...).
Se il backend utilizza psql e input non sanificato, COPY TO PROGRAM viene eseguito e scrive il risultato o apre una shell.
⚠️ La reverse shell avrà successo solo se il server:
Esegue SQL tramite psql (non driver DB parametrizzati)
Consente COPY TO PROGRAM (richiede superuser)
Ha connettività in uscita verso l'aggressore
#Lo script Python invia un payload appositamente predisposto a un server web vulnerabile che passa l'input direttamente a un processo psql di PostgreSQL con codifica BIG5: Passaggi per l'uso:
Avvia un listener sul terminale:
nc -lvnp 4444
Modifica lo script dell'exploit:
Imposta TARGET_URL sull'IP o dominio del server target. Verifica che ENDPOINT corrisponda alla rotta (es. /search). Regola REVERSE_IP e REVERSE_PORT in modo che corrispondano alla tua macchina attaccante.
Esegui lo script in un terminale diverso:
python3 exploit.py
Risultato: In caso di successo, riceverai una connessione sul tuo listener. In caso contrario, prova a leggere file (es. /etc/passwd) utilizzando payload con pg_read_file.
Per testare questo:
EUC_TW o simile.psql o SQL dinamico non escaped.pg_read_file o lo_export.client_encoding=BIG5 se non espressamente necessario.