MSSQL Injection
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
यह संभव है कि आप MSSQL सर्वर के अंदर SQL इंजेक्शन के माध्यम से डोमेन उपयोगकर्ताओं की सूची बना सकें निम्नलिखित MSSQL फ़ंक्शंस का उपयोग करके:
SELECT DEFAULT_DOMAIN()
: वर्तमान डोमेन नाम प्राप्त करें।
master.dbo.fn_varbintohexstr(SUSER_SID('DOMAIN\Administrator'))
: यदि आप डोमेन का नाम जानते हैं (DOMAIN इस उदाहरण में) तो यह फ़ंक्शन उपयोगकर्ता Administrator का SID हेक्स प्रारूप में लौटाएगा। यह इस तरह दिखेगा 0x01050000000[...]0000f401
, ध्यान दें कि अंतिम 4 बाइट्स संख्या 500 हैं बिग एंडियन प्रारूप में, जो उपयोगकर्ता व्यवस्थापक का सामान्य ID है।
यह फ़ंक्शन आपको डोमेन का ID जानने की अनुमति देगा (अंतिम 4 के अलावा सभी बाइट्स)।
SUSER_SNAME(0x01050000000[...]0000e803)
: यह फ़ंक्शन संकेतित ID का उपयोगकर्ता नाम लौटाएगा (यदि कोई हो), इस मामले में 0000e803 बिग एंडियन == 1000 (आमतौर पर यह पहले नियमित उपयोगकर्ता ID का ID होता है)। फिर आप कल्पना कर सकते हैं कि आप 1000 से 2000 तक उपयोगकर्ता IDs को ब्रूट-फोर्स कर सकते हैं और संभवतः डोमेन के सभी उपयोगकर्ताओं के उपयोगकर्ता नाम प्राप्त कर सकते हैं। उदाहरण के लिए, निम्नलिखित फ़ंक्शन का उपयोग करके:
त्रुटि-आधारित SQL इंजेक्शन आमतौर पर ऐसे निर्माणों के समान होते हैं जैसे +AND+1=@@version--
और «OR» ऑपरेटर पर आधारित विविधताएँ। ऐसे अभिव्यक्तियों वाले प्रश्न आमतौर पर WAFs द्वारा अवरुद्ध होते हैं। एक बायपास के रूप में, %2b चरित्र का उपयोग करके एक स्ट्रिंग को जोड़ें जो विशिष्ट फ़ंक्शन कॉल के परिणाम के साथ डेटा प्रकार रूपांतरण त्रुटि को ट्रिगर करता है।
ऐसे फ़ंक्शनों के कुछ उदाहरण:
SUSER_NAME()
USER_NAME()
PERMISSIONS()
DB_NAME()
FILE_NAME()
TYPE_NAME()
COL_NAME()
फ़ंक्शन USER_NAME()
का उदाहरण उपयोग:
ये SSRF ट्रिक्स यहां से ली गई हैं
fn_xe_file_target_read_file
इसकी आवश्यकता है VIEW SERVER STATE
अनुमति सर्वर पर।
fn_get_audit_file
यह CONTROL SERVER
अनुमति की आवश्यकता है।
fn_trace_gettabe
यह CONTROL SERVER
अनुमति की आवश्यकता है।
xp_dirtree
, xp_fileexists
, xp_subdirs
xp_dirtree
जैसे स्टोर किए गए प्रोसीजर्स, हालांकि माइक्रोसॉफ्ट द्वारा आधिकारिक रूप से दस्तावेजित नहीं किए गए हैं, लेकिन उनकी उपयोगिता के कारण अन्य लोगों द्वारा ऑनलाइन वर्णित किए गए हैं। ये प्रोसीजर्स अक्सर आउट ऑफ बैंड डेटा एक्सफिल्ट्रेशन में उपयोग किए जाते हैं, जैसा कि विभिन्न उदाहरणों और पोस्टों में प्रदर्शित किया गया है।
उदाहरण के लिए, xp_dirtree
स्टोर किए गए प्रोसीजर का उपयोग नेटवर्क अनुरोध करने के लिए किया जाता है, लेकिन यह केवल TCP पोर्ट 445 तक सीमित है। पोर्ट नंबर को संशोधित नहीं किया जा सकता, लेकिन यह नेटवर्क शेयर से पढ़ने की अनुमति देता है। उपयोग नीचे SQL स्क्रिप्ट में प्रदर्शित किया गया है:
यह ध्यान देने योग्य है कि यह विधि सभी सिस्टम कॉन्फ़िगरेशन पर काम नहीं कर सकती, जैसे कि Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64)
जो Windows Server 2016 Datacenter
पर डिफ़ॉल्ट सेटिंग्स के साथ चल रहा है।
इसके अतिरिक्त, master..xp_fileexist
और xp_subdirs
जैसी वैकल्पिक स्टोर की गई प्रक्रियाएँ हैं जो समान परिणाम प्राप्त कर सकती हैं। xp_fileexist
पर और विवरण इस TechNet लेख में पाया जा सकता है।
xp_cmdshell
स्पष्ट रूप से आप xp_cmdshell
का उपयोग करके कुछ ऐसा निष्पादित कर सकते हैं जो SSRF को ट्रिगर करता है। अधिक जानकारी के लिए पृष्ठ में संबंधित अनुभाग पढ़ें:
CLR UDF (कॉमन लैंग्वेज रनटाइम यूजर डिफाइंड फंक्शन) बनाना, जो किसी भी .NET भाषा में लिखा गया कोड है और DLL में संकलित किया गया है, जिसे कस्टम फ़ंक्शंस को निष्पादित करने के लिए MSSQL के भीतर लोड किया जाना है, एक प्रक्रिया है जो dbo
एक्सेस की आवश्यकता होती है। इसका मतलब है कि यह आमतौर पर केवल तब संभव है जब डेटाबेस कनेक्शन sa
के रूप में या एक व्यवस्थापक भूमिका के साथ बनाया गया हो।
एक Visual Studio प्रोजेक्ट और स्थापना निर्देश इस Github रिपॉजिटरी में प्रदान किए गए हैं ताकि बाइनरी को MSSQL में CLR असेंबली के रूप में लोड करने में सहायता मिल सके, जिससे MSSQL के भीतर HTTP GET अनुरोधों को निष्पादित किया जा सके।
इस कार्यक्षमता का मूल http.cs
फ़ाइल में संकुचित है, जो GET अनुरोध को निष्पादित करने और नीचे दिखाए अनुसार सामग्री प्राप्त करने के लिए WebClient
वर्ग का उपयोग करता है:
CREATE ASSEMBLY
SQL कमांड को निष्पादित करने से पहले, सर्वर की विश्वसनीय असेंबली की सूची में असेंबली के SHA512 हैश को जोड़ने के लिए निम्नलिखित SQL स्निपेट चलाने की सलाह दी जाती है (जिसे select * from sys.trusted_assemblies;
के माध्यम से देखा जा सकता है):
सफलतापूर्वक असेंबली जोड़ने और फ़ंक्शन बनाने के बाद, HTTP अनुरोध करने के लिए निम्नलिखित SQL कोड का उपयोग किया जा सकता है:
एकल क्वेरी में तालिका की पूरी सामग्री निकालने के लिए एक संक्षिप्त विधि FOR JSON
क्लॉज का उपयोग करना है। यह दृष्टिकोण FOR XML
क्लॉज की तुलना में अधिक संक्षिप्त है, जिसे "raw" जैसे विशिष्ट मोड की आवश्यकता होती है। संक्षिप्तता के लिए FOR JSON
क्लॉज को प्राथमिकता दी जाती है।
यहां वर्तमान डेटाबेस से स्कीमा, तालिकाओं और कॉलमों को प्राप्त करने का तरीका है:
For users granted the VIEW SERVER STATE
permission on the server, it's possible to see all executing sessions on the SQL Server instance. However, without this permission, users can only view their current session. The currently executing SQL query can be retrieved by accessing sys.dm_exec_requests and sys.dm_exec_sql_text:
Non-standard whitespace characters: %C2%85 или %C2%A0:
https://vuln.app/getItem?id=0eunion+select+null,@@version,null--
https://vuln.app/getItem?id=0xunion+select+null,@@version,null--
https://vuln.app/getItem?id=1+union+select+null,@@version,null+from.users--
https://vuln.app/getItem?id=0xunion+select\Nnull,@@version,null+from+users--
So for example, multiple queries such as:
Therefore it could be possible to bypass different WAFs that doesn't consider this form of stacking queries. For example:
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)