SQL 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)
RootedCON je najrelevantnija sajber bezbednosna manifestacija u Španiji i jedna od najvažnijih u Evropi. Sa misijom promovisanja tehničkog znanja, ovaj kongres je vrelo okupljanje za profesionalce u tehnologiji i sajber bezbednosti u svakoj disciplini.
SQL injekcija je sigurnosna greška koja omogućava napadačima da ometaju upite baze podataka aplikacije. Ova ranjivost može omogućiti napadačima da vide, modifikuju ili obrišu podatke kojima ne bi trebali imati pristup, uključujući informacije drugih korisnika ili bilo koje podatke kojima aplikacija može pristupiti. Takve akcije mogu rezultirati trajnim promenama u funkcionalnosti ili sadržaju aplikacije ili čak kompromitovanjem servera ili uskraćivanjem usluge.
Kada se čini da je sajt ranjiv na SQL injekciju (SQLi) zbog neobičnih odgovora servera na SQLi povezane ulaze, prvi korak je razumeti kako ubaciti podatke u upit bez ometanja. To zahteva identifikaciju metode za efikasno izlazak iz trenutnog konteksta. Ovo su neki korisni primeri:
Zatim, treba da znate kako da popravite upit tako da ne bude grešaka. Da biste popravili upit, možete uneti podatke tako da prethodni upit prihvati nove podatke, ili možete jednostavno uneti svoje podatke i dodati simbol komentara na kraju.
Napomena: ako možete da vidite poruke o grešci ili primetite razlike kada upit radi i kada ne radi, ova faza će biti lakša.
Поуздан метод за потврђивање SQL инјекције укључује извршавање логичке операције и посматрање очекиваних исхода. На пример, GET параметар као што је ?username=Peter
који даје идентичан садржај када се модификује у ?username=Peter' or '1'='1
указује на SQL инјекцију.
Слично, примена математичких операција служи као ефикасна техника потврђивања. На пример, ако приступање ?id=1
и ?id=2-1
производи исти резултат, то указује на SQL инјекцију.
Примери који демонстрирају потврђивање логичке операције:
Ova lista reči je kreirana da pokuša da potvrdi SQLinjections na predloženi način:
U nekim slučajevima nećete primetiti nikakvu promenu na stranici koju testirate. Stoga, dobar način da otkrijete slepe SQL injekcije je da naterate DB da izvrši radnje koje će imati uticaj na vreme koje je potrebno stranici da se učita. Stoga, u SQL upit ćemo dodati operaciju koja će potrajati dugo da se završi:
U nekim slučajevima funkcije spavanja neće biti dozvoljene. Tada, umesto korišćenja tih funkcija, možete napraviti upit koji izvodi složene operacije koje će trajati nekoliko sekundi. Primeri ovih tehnika biće komentarisani posebno za svaku tehnologiju (ako ih ima).
Najbolji način da identifikujete back-end je pokušaj izvršavanja funkcija različitih back-end-ova. Možete koristiti sleep funkcije iz prethodne sekcije ili ove (tabela iz payloadsallthethings:
Takođe, ako imate pristup izlazu upita, mogli biste da prikazujete verziju baze podataka.
U nastavku ćemo razgovarati o različitim metodama za iskorišćavanje različitih vrsta SQL Injection. Koristićemo MySQL kao primer.
Ako možete da vidite izlaz upita, ovo je najbolji način da ga iskoristite. Prvo, treba da saznamo broj kolona koje početni zahtev vraća. To je zato što oba upita moraju vraćati isti broj kolona. Dve metode se obično koriste u tu svrhu:
Da biste odredili broj kolona u upitu, postepeno prilagodite broj korišćen u ORDER BY ili GROUP BY klauzulama dok ne dobijete lažan odgovor. Iako imaju različite funkcionalnosti, GROUP BY i ORDER BY se mogu koristiti identično za utvrđivanje broja kolona u upitu.
Izaberite sve više i više null vrednosti dok upit ne bude tačan:
Trebalo bi da koristite null
vrednosti jer u nekim slučajevima tip kolona sa obe strane upita mora biti isti i null je validan u svakom slučaju.
U sledećim primerima ćemo preuzeti ime svih baza podataka, ime tabele u bazi podataka, imena kolona tabele:
Postoji različit način za otkrivanje ovih podataka na svakoj različitoj bazi podataka, ali metodologija je uvek ista.
Kada je izlaz upita vidljiv, ali se čini da unija zasnovana na injekciji nije moguća, to označava prisustvo skrivene unije zasnovane na injekciji. Ova situacija često dovodi do slepe injekcije. Da bi se slepa injekcija pretvorila u onu zasnovanu na uniji, potrebno je razjasniti izvršni upit na backend-u.
To se može postići korišćenjem tehnika slepe injekcije zajedno sa podrazumevanim tabelama specifičnim za vaš ciljani sistem za upravljanje bazama podataka (DBMS). Za razumevanje ovih podrazumevanih tabela, savetuje se konsultacija sa dokumentacijom ciljanog DBMS-a.
Kada je upit izvučen, potrebno je prilagoditi svoj payload kako bi se sigurno zatvorio originalni upit. Nakon toga, unija upit se dodaje vašem payload-u, olakšavajući iskorišćavanje novonastale unije zasnovane na injekciji.
Za sveobuhvatnije uvide, pogledajte ceo članak dostupan na Healing Blind Injections.
Ako iz nekog razloga ne možete videti izlaz upita ali možete videti poruke o grešci, možete iskoristiti ove poruke o grešci da izvučete podatke iz baze podataka. Prateći sličan tok kao u iskorišćavanju zasnovanom na uniji, mogli biste uspeti da dump-ujete DB.
U ovom slučaju ne možete videti rezultate upita ili greške, ali možete razlikovati kada upit vraća tačan ili netačan odgovor jer postoje različiti sadržaji na stranici. U ovom slučaju, možete iskoristiti to ponašanje da izvučete bazu podataka karakter po karakter:
Ovo je ista situacija kao pre ali umesto da razlikujete između tačnog/lažnog odgovora iz upita, možete razlikovati između greške u SQL upitu ili ne (možda zato što HTTP server pada). Stoga, u ovom slučaju možete izazvati SQL grešku svaki put kada tačno pogodite karakter:
U ovom slučaju nema načina da se razlikuje odgovor upita na osnovu konteksta stranice. Ali, možete učiniti da stranica duže učitava ako je pogodjeni karakter tačan. Već smo videli ovu tehniku u upotrebi ranije kako bismo potvrdili SQLi ranjivost.
Možete koristiti stacked queries da izvršite više upita uzastopno. Imajte na umu da, iako se uzastopni upiti izvršavaju, rezultati se ne vraćaju aplikaciji. Stoga je ova tehnika prvenstveno korisna u vezi sa blind vulnerabilities gde možete koristiti drugi upit da pokrenete DNS upit, uslovnu grešku ili vremensko kašnjenje.
Oracle ne podržava stacked queries. MySQL, Microsoft i PostgreSQL ih podržavaju: QUERY-1-HERE; QUERY-2-HERE
Ako niti jedna metoda eksploatacije nije uspela, možete pokušati da baza podataka ex-filtrira informacije na spoljni host koji kontrolišete. Na primer, putem DNS upita:
Proverite SQLMap Cheatsheet da biste iskoristili SQLi ranjivost sa sqlmap.
Već smo razgovarali o svim načinima za eksploataciju SQL Injection ranjivosti. Pronađite još nekoliko trikova zavisnih od tehnologije baze podataka u ovoj knjizi:
Ili ćete pronaći puno trikova vezanih za: MySQL, PostgreSQL, Oracle, MSSQL, SQLite i HQL u https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection
RootedCON je najrelevantnija sajber bezbednosna manifestacija u Španiji i jedna od najvažnijih u Evropi. Sa misijom promovisanja tehničkog znanja, ovaj kongres je vrelo okupljalište za profesionalce u tehnologiji i sajber bezbednosti u svakoj disciplini.
Lista za pokušaj zaobilaženja funkcionalnosti prijavljivanja:
Login bypass ListOva upit prikazuje ranjivost kada se MD5 koristi sa true za sirovi izlaz u proverama autentifikacije, čineći sistem podložnim SQL injekciji. Napadači mogu iskoristiti ovo kreiranjem ulaza koji, kada se hashiraju, proizvode neočekivane delove SQL komandi, što dovodi do neovlašćenog pristupa.
Preporučena lista:
Trebalo bi da koristite kao korisničko ime svaku liniju sa liste, a kao lozinku uvek: Pass1234. &#xNAN;(Ovi payload-ovi su takođe uključeni u veliku listu pomenutu na početku ovog odeljka)
AKO se ' escape-uje, možete koristiti %A8%27, a kada se ' escape-uje, biće kreirano: 0xA80x5c0x27 (╘')
Python skripta:
Da biste to uradili, trebali biste pokušati da kreirate novi objekat nazvan kao "master objekat" (verovatno admin u slučaju korisnika) modifikujući nešto:
Kreirajte korisnika nazvanog: AdMIn (velika i mala slova)
Kreirajte korisnika nazvanog: admin=
SQL Truncation Attack (kada postoji neka vrsta ograničenja dužine u korisničkom imenu ili e-mailu) --> Kreirajte korisnika sa imenom: admin [puno razmaka] a
Ako je baza podataka ranjiva i maksimalan broj karaktera za korisničko ime je, na primer, 30 i želite da se pretvarate da ste korisnik admin, pokušajte da kreirate korisničko ime pod nazivom: "admin [30 razmaka] a" i bilo koju lozinku.
Baza podataka će proveriti da li uneto korisničko ime postoji unutar baze podataka. Ako ne, ona će skratiti korisničko ime na maksimalan dozvoljeni broj karaktera (u ovom slučaju na: "admin [25 razmaka]") i automatski će ukloniti sve razmake na kraju ažurirajući unutar baze podataka korisnika "admin" sa novom lozinkom (može se pojaviti neka greška, ali to ne znači da ovo nije uspelo).
Više informacija: https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html & https://resources.infosecinstitute.com/sql-truncation-attack/#gref
Napomena: Ovaj napad više neće raditi kao što je opisano iznad u najnovijim MySQL instalacijama. Dok poređenja i dalje ignorišu razmake na kraju po defaultu, pokušaj umetanja stringa koji je duži od dužine polja rezultiraće greškom, a umetanje će propasti. Za više informacija o ovoj provere: https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation
Dodajte koliko god ','',''
smatrate potrebnim da izađete iz VALUES izjave. Ako se izvrši kašnjenje, imate SQLInjection.
Klauzula ON DUPLICATE KEY UPDATE
u MySQL-u se koristi za određivanje akcija koje baza podataka treba da preduzme kada se pokuša umetanje reda koji bi rezultirao duplom vrednošću u UNIQUE indeksu ili PRIMARY KEY-u. Sledeći primer pokazuje kako se ova funkcija može iskoristiti za modifikaciju lozinke administratorskog naloga:
Example Payload Injection:
Injekcioni payload može biti kreiran na sledeći način, gde se pokušava umetanje dva reda u tabelu users
. Prvi red je mamac, a drugi red cilja postojeću email adresu administratora sa namerom da se ažurira lozinka:
Evo kako to funkcioniše:
Upit pokušava da unese dva reda: jedan za generic_user@example.com
i drugi za admin_generic@example.com
.
Ako red za admin_generic@example.com
već postoji, ON DUPLICATE KEY UPDATE
klauzula se aktivira, naređujući MySQL-u da ažurira polje password
postojećeg reda na "bcrypt_hash_of_newpassword".
Shodno tome, autentifikacija se može pokušati koristeći admin_generic@example.com
sa lozinkom koja odgovara bcrypt hash-u ("bcrypt_hash_of_newpassword" predstavlja bcrypt hash nove lozinke, koji treba zameniti stvarnim hash-om željene lozinke).
Kada pokušavate da kreirate novog korisnika, potrebni su korisničko ime, lozinka i email:
Sa ovom tehnikom možete izvući informacije kreirajući samo 1 nalog. Važno je napomenuti da ne morate komentarisati ništa.
Korišćenjem hex2dec i substr:
Da biste dobili tekst, možete koristiti:
Koristeći hex i replace (i substr):
RootedCON je najrelevantnija sajber bezbednosna manifestacija u Španiji i jedna od najvažnijih u Evropi. Sa misijom promovisanja tehničkog znanja, ovaj kongres je vrelo okupljalište za profesionalce u tehnologiji i sajber bezbednosti u svakoj disciplini.
Routed SQL injection je situacija u kojoj upit koji se može injektovati nije onaj koji daje izlaz, već izlaz injektovanog upita ide u upit koji daje izlaz. (Iz rada)
Primer:
No Space (%20) - bypass koristeći alternative za razmake
No Whitespace - zaobilaženje korišćenjem komentara
No Whitespace - zaobilaženje korišćenjem zagrada
No Comma - zaobilaženje korišćenjem OFFSET, FROM i JOIN
Crna lista koristeći ključne reči - zaobići koristeći velika/mala slova
Blacklist koristeći ključne reči bez obzira na velika i mala slova - zaobići koristeći ekvivalentni operator
Možete pronaći detaljnije objašnjenje ovog trika na gosecure blogu. U suštini, možete koristiti naučnu notaciju na neočekivane načine kako biste zaobišli WAF:
Prvo, primetite da ako originalni upit i tabela iz koje želite da izvučete zastavicu imaju isti broj kolona možete jednostavno uraditi: 0 UNION SELECT * FROM flag
Moguće je pristupiti trećoj koloni tabele bez korišćenja njenog imena koristeći upit poput sledećeg: SELECT F.3 FROM (SELECT 1, 2, 3 UNION SELECT * FROM demo)F;
, tako da bi u sqlinjection ovo izgledalo ovako:
Ili korišćenjem comma bypass:
Ova trik je preuzet sa https://secgroup.github.io/2017/01/03/33c3ctf-writeup-shia/
RootedCON je najrelevantnija sajber bezbednosna manifestacija u Španiji i jedna od najvažnijih u Evropi. Sa misijom promovisanja tehničkog znanja, ovaj kongres je vrelo okupljalište za profesionalce u tehnologiji i sajber bezbednosti u svakoj disciplini.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)