MSSQL Injection
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Može biti moguće enumerisati korisnike domena putem SQL injekcije unutar MSSQL servera koristeći sledeće MSSQL funkcije:
SELECT DEFAULT_DOMAIN()
: Dobijte trenutni naziv domena.
master.dbo.fn_varbintohexstr(SUSER_SID('DOMAIN\Administrator'))
: Ako znate naziv domena (DOMAIN u ovom primeru) ova funkcija će vratiti SID korisnika Administratora u heksadecimalnom formatu. Ovo će izgledati 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 poslednja 4).
SUSER_SNAME(0x01050000000[...]0000e803)
: Ova funkcija će vratiti korisničko ime ID-a koji je naznačen (ako postoji), u ovom slučaju 0000e803 u big endian == 1000 (obično je ovo ID prvog regularnog korisnika koji je kreiran). Tada možete zamisliti da možete brute-force korisničke ID-eve od 1000 do 2000 i verovatno dobiti sva korisnička imena korisnika domena. Na primer, koristeći funkciju poput sledeće:
Error-based SQL injekcije obično liče na konstrukcije kao što su +AND+1=@@version--
i varijante zasnovane na «OR» operatoru. Upiti koji sadrže takve izraze obično su blokirani od strane WAF-ova. Kao zaobilaženje, konkatenirajte string koristeći %2b karakter sa rezultatom specifičnih poziva funkcija koje izazivaju grešku konverzije tipa podataka na traženim podacima.
Neki primeri takvih funkcija:
SUSER_NAME()
USER_NAME()
PERMISSIONS()
DB_NAME()
FILE_NAME()
TYPE_NAME()
COL_NAME()
Primer korišćenja funkcije USER_NAME()
:
Ove SSRF trikove uzete su odavde
fn_xe_file_target_read_file
Zahteva VIEW SERVER STATE
dozvolu na serveru.
fn_get_audit_file
Zahteva CONTROL SERVER
dozvolu.
fn_trace_gettabe
Zahteva CONTROL SERVER
dozvolu.
xp_dirtree
, xp_fileexists
, xp_subdirs
Skladišne procedure poput xp_dirtree
, iako nisu zvanično dokumentovane od strane Microsoft-a, su opisane od strane drugih online zbog njihove korisnosti u mrežnim operacijama unutar MSSQL-a. Ove procedure se često koriste u Out of Band Data exfiltration, kao što je prikazano u raznim primerima i postovima.
Skladišna procedura xp_dirtree
, na primer, 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 deljenja. Korišćenje je prikazano u SQL skripti ispod:
Važno je napomenuti da ova metoda možda neće raditi na svim sistemskim konfiguracijama, kao što je na Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64)
koji radi na Windows Server 2016 Datacenter
sa podrazumevanim podešavanjima.
Pored toga, postoje alternativne skladišne procedure kao što su master..xp_fileexist
i xp_subdirs
koje mogu postići slične rezultate. Dodatne informacije o xp_fileexist
mogu se naći u ovom TechNet članku.
xp_cmdshell
Očigledno možete koristiti xp_cmdshell
da izvršite nešto što pokreće SSRF. Za više informacija pročitajte relevantni odeljak na stranici:
Kreiranje CLR UDF (Common Language Runtime User Defined Function), što je kod napisan na bilo kom .NET jeziku i kompajliran u DLL, koji će biti učitan unutar MSSQL za izvršavanje prilagođenih funkcija, je proces koji zahteva dbo
pristup. To znači da je obično izvodljivo samo kada je veza sa bazom podataka uspostavljena kao sa
ili sa Administratorskom ulogom.
Visual Studio projekat i uputstva za instalaciju su dostupni u ovoj Github repozitoriji kako bi se olakšalo učitavanje binarnog fajla u MSSQL kao CLR assembly, čime se omogućava izvršavanje HTTP GET zahteva iz MSSQL-a.
Osnova ove funkcionalnosti je enkapsulirana u http.cs
fajlu, koji koristi WebClient
klasu za izvršavanje GET zahteva i preuzimanje sadržaja kao što je prikazano u nastavku:
Pre nego što izvršite SQL komandu CREATE ASSEMBLY
, preporučuje se da pokrenete sledeći SQL kod kako biste dodali SHA512 hash skupa u listu poverenih skupova na serveru (koja se može videti putem select * from sys.trusted_assemblies;
):
Nakon uspešnog dodavanja sklopa i kreiranja funkcije, sledeći SQL kod se može koristiti za izvršavanje HTTP zahteva:
Kratka metoda za ekstrakciju celog sadržaja tabele u jednom upitu uključuje korišćenje FOR JSON
klauzule. Ovaj pristup je sažetiji od korišćenja FOR XML
klauzule, koja zahteva specifičan režim poput "raw". FOR JSON
klauzula se preferira zbog svoje sažetosti.
Evo kako da preuzmete šemu, tabele i kolone iz trenutne baze podataka:
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:
To check if you have the VIEW SERVER STATE permission, the following query can be used:
Non-standard whitespace characters: %C2%85 или %C2%A0:
Scientific (0e) and hex (0x) notation for obfuscating UNION:
A period instead of a whitespace between FROM and a column name:
\N separator between SELECT and a throwaway column:
According to this blog post it's possible to stack queries in MSSQL without using ";":
So for example, multiple queries such as:
Can be reduced to:
Therefore it could be possible to bypass different WAFs that doesn't consider this form of stacking queries. For example:
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)