MSSQL Injection
MSSQL Injection
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 kao0x01050000000[...]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:
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()
:
SSRF
Ove trikove za SSRF preuzeti su odavde
fn_xe_file_target_read_file
fn_xe_file_target_read_file
Zahteva dozvolu VIEW SERVER STATE
na serveru.
fn_get_audit_file
fn_get_audit_file
Zahteva dozvolu CONTROL SERVER
.
fn_trace_gettabe
fn_trace_gettabe
Zahteva dozvolu CONTROL SERVER
.
xp_dirtree
, xp_fileexists
, xp_subdirs
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:
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
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:
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:
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;
):
Nakon uspešnog dodavanja skupa instrukcija i kreiranja funkcije, može se koristiti sledeći SQL kod za izvršavanje HTTP zahteva:
Brzo iskorišćavanje: Dobijanje celokupnog sadržaja tabele u jednom upitu
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:
Retrieving the Current Query
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:
Ovaj SQL upit se koristi za prikazivanje dozvola korisnika za pregledanje stanja servera.
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.
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:
Ako dobijete grešku, povećajte broj null
vrednosti u upitu dok ne dobijete rezultate bez greške. Na primer:
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:
Ovaj upit će izvući korisnička imena i lozinke iz tabele users
.
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.
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:
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.
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.
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:
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.
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.
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:
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.
Validacija unosa: Validirajte sve korisničke unose kako biste sprečili unos nevažećih karaktera ili SQL koda.
Korišćenje principa najmanjih privilegija: Dodelite samo neophodne privilegije korisnicima baze podataka kako biste smanjili rizik od zloupotrebe.
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.
So for example, multiple queries such as:
Therefore it could be possible to bypass different WAFs that doesn't consider this form of stacking queries. For example:
References
Last updated