Sigurnost

Vodič za slijepe tehnike ubrizgavanja SQL-a

Vodič za slijepe tehnike ubrizgavanja SQL-a

Što je SQL Injection?

SQL Injection je vrsta napada na bazu podataka u kojoj napadač pokušava ukrasti podatke iz baze podataka web aplikacije. To čak može rezultirati daljinskim izvršavanjem koda, ovisno o okruženju web aplikacija i verziji baze podataka.

SQL ubrizgavanje događa se zbog slabe sanitacije korisničkog unosa. Ako od korisnika uzmete unos na nekom jeziku kodiranja (PHP, ASP.NET) i proslijedite je izravno u bazu podataka poslužitelja bez primjene bilo kakvog filtra na ulazu, što može rezultirati ranjivošću SQL Injection.

Na primjer, sljedeći je PHP kôd ranjiv na napad na SQL Injection jer izravno prosljeđuje korisnički unos u bazu podataka. Napadač može izraditi vlastiti zlonamjerni upit baze podataka za izdvajanje podataka iz baze podataka.

// Korisnički unos pohranjen je u varijablu id
$ id = $ _GET ['id'];
// Unos korisnika izravno se izvršava u bazi podataka
$ getid = "ODABIRI ime, prezime OD korisnika WHERE user_id = '$ id'";
// U slučaju pogreške ili uspjeha, rezultati se vraćaju korisniku
$ rezultat = mysql_query ($ getid) ili umri ('
' . mysql_error () . '
');
$ num = mysql_numrows ($ rezultat);

S druge strane, dat je primjer sigurnog koda takvog koda za interakciju s bazom podataka. Potreban je korisnički unos i iz njega se filtriraju svi zlonamjerni znakovi, a zatim prosljeđuje u bazu podataka.

$ id = $ _GET ['id'];
$ id = kosa crta ($ id);
$ id = mysql_real_escape_string ($ id);

Uobičajeno vs slijepo ubrizgavanje SQL-a

Uobičajeno ubrizgavanje SQL-a

U normalnom SQL Injectionu, ako napadač pokuša staviti jedan navodnik (') kao ulaz, kada se taj pojedinačni navodnik izvrši u bazi podataka, baza podataka odgovara s pogreškom. Pogreška se ispisuje u pregledniku napadača.

Kôd odgovoran za ovu pogrešku je

// ako baza podataka odgovori s pogreškom, izvršava se funkcija "or die ()"
za ispis pogreške
$ rezultat = mysql_query ($ getid) ili umri ('
' . mysql_error () . '
');

U normalnom SQL Injectionu napadač može vidjeti rezultate pogreške i lako ih je prepoznati i iskoristiti.

Slijepo ubrizgavanje SQL-a

U slučaju slijepog SQL ubrizgavanja, kada se izvrši zlonamjerni upit poput jednog citata, pogreška baze podataka ne prikazuje se u pregledniku napadača ili se prikazuje na vrlo generičan način koji napadač ne može lako identificirati i iskoristiti.

Pozadinski kôd odgovoran za to naveden je u nastavku

$ rezultat = mysql_query ($ getid); // Uklonjeno 'ili umrijeti' radi suzbijanja mysql pogrešaka

U slijepom SQL Injectionu napadač ne može vidjeti cjelovite rezultate, stoga je ovu vrstu SQLi teško identificirati i iskoristiti, ali ima istu razinu rizika kao i uobičajeni SQLi.

Tehnike za otkrivanje slijepog SQL ubrizgavanja

Iako se normalno ubrizgavanje SQL-a može otkriti slanjem jedne navodnice (') kao ulaznog podatka i ispitivanjem izlazne pogreške, slijepo ubrizgavanje SQL-a ne može se otkriti pomoću ove tehnike jer ne prikazuje SQL pogrešku. Postoji mnogo tehnika za otkrivanje slijepog SQL ubrizgavanja, neke od njih su date kako slijedi

ISTINITO i NETOČNO Otkrivanje

Jedna od karakteristika baza podataka, uključujući MySQL, je različito ponašanje prema True i False iskazima. Čak i ako baza podataka ne prikazuje nikakve pogreške, možemo odlučiti upotrebom True i False izraza. Razmotrite sljedeći scenarij,

Sljedeća je stranica ranjiva na slijepo ubrizgavanje SQL-a, dajući joj istinitu izjavu prikazivat će sve unose u bazi podataka

1 'ili 1 = 1 #

Davanje lažnog upita kao ulaza neće prikazati nikakve podatke.

1 'ili 1 = 2 #

Čak i web stranica ne prikazuje pogreške, razlika između dviju stranica govori da se naši upiti uspješno izvršavaju u bazi podataka.

Otkrivanje na temelju VREMENA

Postoji funkcija u bazama podataka, uključujući MySQL, MS-SQL i druge, zbog kašnjenja. U našem upitu možemo koristiti funkciju SLEEP (), ako je odgovor baze podataka spor, što znači da se naš upit uspješno izvršava i web stranica je ranjiva na slijepo SQL ubrizgavanje.

1 'I spavanje (15) #

Postoji još jedna dugotrajna funkcija "BENCHMARK" koja se može koristiti za odgađanje odgovora baze podataka

1 'I BENCHMARK (10000000, SHA1 (1337)) #

Gornji redak izvršit će funkciju SHA1 () 10000000 puta u bazi podataka, što će dodati značajnu količinu kašnjenja u odgovoru.

Slijepo SQL ubrizgavanje zasnovano na vremenu u drugim bazama podataka

MS SQL: ID = 1; čekanje na kašnjenje '0: 0: 10'-

ORACLE SQL: I [RANDNUM] = DBMS_PIPE.RECEIVE_MESSAGE ('[RANDSTR]', [SLEEPTIME])

PostgreSQL: I [RANDNUM] = (ODABERITE [RANDNUM] IZ PG_SLEEP ([SLEEPTIME]))

SQLite: I [RANDNUM] = LIKE ('ABCDEFG', GORNJI (ŠESTAKLE (RANDOMBLOB ([SLEEPTIME] 00000000/2))))

Izdvajanje podataka iz baze podataka

Prvi korak izdvajanja baze podataka je određivanje brojeva stupaca u bazi podataka. Zatim pokušajte pronaći ranjive stupce za izvlačenje daljnjih podataka.

Slijepo SQL ubrizgavanje ponaša se različito s različitim brojevima stupaca u upitu "poredak po".

1 'narudžba po 1 #

Gornja je izjava istinita jer u bazi podataka uvijek postoji najmanje 1 stupac. Pokušajte s vrlo velikim brojem.

1 'narudžba od 10000 #

Odgovor baze podataka razlikuje se od prethodnog. Pokušajte sada s 2 stupca.

Izjava je uspjela, što znači da baza podataka ima 2 ili više stupaca. Pokušajte s 3 stupca.

1 'narudžba po 3 #

Baza podataka nije poslala nikakav odgovor, što znači da baza podataka ima samo 2 stupca. Sada ćemo pokušati izbaciti popis tablica u bazu podataka, za to ćemo upotrijebiti sljedeći upit

1 'unija sve odaberi 1, group_concat (ime_tabele) iz sheme information_schema.
tablice gdje je table_schema = baza podataka () #

Postoje dvije tablice u pozadinskoj bazi podataka "knjiga gostiju i korisnici". Tablica "korisnici" može sadržavati korisnička imena i lozinke. Da biste iz tablice izdvojili imena stupaca, umetnite sljedeći upit.

1 'unija sve odaberi 1, group_concat (ime_stupca) iz sheme informacija_sheme.
stupci gdje je tablica_shema = baza podataka () #

Sada smo izdvojili imena stupaca, to uključuje stupce korisnika i lozinke. Ovi stupci pohranjuju korisnička imena korisnika i njihove lozinke.

Sada ćemo pokušati izvući podatke pomoću sljedećeg upita

1 'unija sve odaberi 1, group_concat (korisnik, lozinka) od korisnika #

I tako možete iskoristiti slijepo SQL Injection bez oslanjanja na pogreške. Izlazne lozinke heširaju se većinu vremena, što se može dešifrirati pomoću alata poput John The Ripper ili Hashcat.

Zaključak:

Slijepo ubrizgavanje SQL je vrsta SQLi koja ne prikazuje pogreške baze podataka ili odgovara vrlo generičkom porukom. Zbog toga je vrlo teško identificirati ranjivost slijepog SQL ubrizgavanja na web stranici. Jednom otkriven, možete ga lako iskoristiti ručnim ili automatiziranim postupkom pomoću SQLmap-a.

Emulirajte klikove mišem lebdeći mišem bez klika u sustavu Windows 10
Korištenje miša ili tipkovnice u pogrešnom držanju pretjerane upotrebe može rezultirati mnogim zdravstvenim problemima, uključujući naprezanje, sindro...
Dodajte geste miša u sustav Windows 10 pomoću ovih besplatnih alata
Posljednjih godina računala i operativni sustavi uvelike su se razvili. Bilo je vrijeme kada su korisnici morali koristiti naredbe za navigaciju kroz ...
Kontrolirajte i upravljajte kretanjem miša između više monitora u sustavu Windows 10
Dvostruki zaslon upravitelja miša omogućuje vam kontrolu i konfiguriranje kretanja miša između više monitora, usporavajući njegovo kretanje blizu gran...