SQL Injection
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.
Šta je SQL injekcija?
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.
Detekcija ulazne tačke
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.
Komentari
Potvrđivanje logičkim operacijama
Pouzdana metoda za potvrđivanje SQL injection ranjivosti uključuje izvršavanje logičke operacije i posmatranje očekivanih rezultata. Na primer, GET parametar kao što je ?username=Peter
koji daje identičan sadržaj kada se izmeni u ?username=Peter' or '1'='1
ukazuje na SQL injection ranjivost.
Slično tome, primena matematičkih operacija služi kao efikasna tehnika potvrđivanja. Na primer, ako pristupanje ?id=1
i ?id=2-1
daje isti rezultat, to je pokazatelj SQL injection.
Primeri koji prikazuju potvrđivanje logičke operacije:
Ova lista reči je kreirana da pokuša da potvrdi SQLinjections na predloženi način:
Potvrđivanje sa vremenom
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 upitu ć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).
Identifikacija Back-end-a
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.
Identifikacija sa PortSwigger
Iskorišćavanje zasnovano na Uniji
Otkrivanje broja kolona
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:
Order/Group by
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. I pored različitih funkcionalnosti GROUP BY i ORDER BY unutar SQL-a, oboje se može koristiti identično za utvrđivanje broja kolona u upitu.
UNION SELECT
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.
Ekstraktovanje imena baza podataka, imena tabela i imena kolona
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.
Eksploatacija skrivenih unija
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 backendu.
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 eksploataciju novonastale unije zasnovane na injekciji.
Za sveobuhvatnije uvide, pogledajte ceo članak dostupan na Healing Blind Injections.
Eksploatacija zasnovana na grešci
Ako iz nekog razloga ne možete da vidite izlaz upita, ali možete videti poruke o grešci, možete iskoristiti ove poruke o grešci da izvucite podatke iz baze podataka. Prateći sličan tok kao u eksploataciji zasnovanoj na uniji, mogli biste uspeti da dump-ujete DB.
Iskorišćavanje Blind SQLi
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:
Iskorišćavanje Error Blind SQLi
Ovo je isti slučaj 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 naterati SQL grešku svaki put kada tačno pogodite karakter:
Iskorišćavanje SQLi zasnovanog na vremenu
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.
Stacked Queries
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
Out of band Exploitation
Ako nijedna metoda eksploatacije nije uspela, možete pokušati da naterate bazu podataka da ex-filtrira informacije na spoljni host koji kontrolišete. Na primer, putem DNS upita:
Izvanbandna eksfiltracija podataka putem XXE
Automatizovana Eksploatacija
Proverite SQLMap Cheatsheet da biste iskoristili SQLi ranjivost sa sqlmap.
Tehničke specifične informacije
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 mesto okupljanja za profesionalce u tehnologiji i sajber bezbednosti u svakoj disciplini.
Zaobilaženje autentifikacije
Lista za pokušaj zaobilaženja funkcionalnosti prijavljivanja:
Login bypass ListZaobilaženje autentifikacije sirovim hešom
Ova 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.
Zaobilaženje autentifikacije pomoću injektovanog heša
Preporučena lista:
Trebalo bi da koristite kao korisničko ime svaku liniju sa liste, a kao lozinku uvek: Pass1234. (Ovi payload-ovi su takođe uključeni u veliku listu pomenutu na početku ovog odeljka)
GBK autentifikacija zaobilaženje
AKO se ' escape-uje, možete koristiti %A8%27, a kada se ' escape-uje, biće kreirano: 0xA80x5c0x27 (╘')
Python skripta:
Polyglot injection (multicontext)
Insert Statement
Izmeni lozinku postojećeg objekta/korisnika
Da biste to uradili, trebali biste pokušati da napravite novi objekat nazvan kao "glavni objekat" (verovatno admin u slučaju korisnika) modifikujući nešto:
Napravite korisnika pod imenom: AdMIn (velika i mala slova)
Napravite korisnika pod imenom: admin=
SQL Truncation Attack (kada postoji neka vrsta ograničenja dužine u korisničkom imenu ili e-mailu) --> Napravite korisnika sa imenom: admin [puno razmaka] a
SQL Truncation Attack
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, izreže će 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
MySQL Insert time based checking
Dodajte koliko god ','',''
smatrate da je potrebno da izađete iz VALUES izjave. Ako se odgoda izvrši, imate SQLInjection.
ON DUPLICATE KEY UPDATE
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 zaadmin_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 poljepassword
postojećeg reda na "bcrypt_hash_of_newpassword".Posledično, 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).
Ekstrakcija informacija
Kreiranje 2 naloga u isto vreme
Kada pokušavate da kreirate novog korisnika, potrebni su korisničko ime, lozinka i email:
Korišćenje decimalnog ili heksadecimalnog
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 okupljanje za profesionalce u tehnologiji i sajber bezbednosti u svakoj disciplini.
Routed SQL injection
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. (From Paper)
Primer:
WAF Bypass
Bypass bez razmaka
No Space (%20) - bypass koristeći alternative za razmake
No Whitespace - zaobilaženje korišćenjem komentara
No Whitespace - zaobilaženje korišćenjem zagrada
No commas bypass
No Comma - zaobilaženje korišćenjem OFFSET, FROM i JOIN
Generic Bypasses
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
Bypass WAF pomoću naučne notacije
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:
Bypass Column Names Restriction
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/
WAF bypass suggester tools
Ostali vodiči
Lista za detekciju Brute-Force
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.
Last updated