Mi az SQL Injection?
Az SQL Injection egy olyan típusú adatbázis-támadás, amelyben a támadó megpróbál információkat eltulajdonítani egy webalkalmazás adatbázisából. Ez akár távoli kódfuttatást is eredményezhet a webalkalmazás környezetétől és az adatbázis verziójától függően.
Az SQL injekció a felhasználói bemenetek gyenge fertőtlenítése miatt történik. Ha valamilyen kódolási nyelven (PHP, ASP.NET) és közvetlenül a kiszolgáló adatbázisába továbbítja, anélkül, hogy a bemeneten bármilyen szűrőt alkalmazna, ez SQL Injection sebezhetőséget eredményezhet.
Például a következő PHP-kód sérülékeny az SQL Injection támadással szemben, mert közvetlenül továbbítja a felhasználói bemenetet az adatbázisba. Az Attacker saját rosszindulatú adatbázis-lekérdezéseket készíthet, hogy adatokat nyerjen az adatbázisból.
// A userinput az id változóban van tárolva$ id = $ _GET ['id'];
// A felhasználói bevitelt közvetlenül az adatbázisban hajtják végre
$ getid = "SELECT first_name, last_name FROM users WHERE user_id = '$ id'";
// Hiba vagy siker esetén az eredményeket visszaküldik a felhasználónak
$ result = mysql_query ($ getid) vagy meghal ('
" . mysql_error () . "');
$ num = mysql_numrows ($ eredmény);
Másrészt egy biztonságos kód példát adnak az ilyen kódra, amely kölcsönhatásba lép az adatbázissal. Felhasználói bevitelt igényel és kiszűri belőle az esetleges rosszindulatú karaktereket, majd továbbítja az adatbázisba.
$ id = $ _GET ['id'];$ id = csíkok ($ id);
$ id = mysql_real_escape_string ($ id);
Normál vs vak SQL injekció
Normál SQL injekció
Normál SQL injekció esetén, ha a támadó egyetlen idézetet (') próbál beírni bemenetként, amikor ezt az egyetlen idézetet végrehajtják az adatbázisban, az adatbázis hibával válaszol. A hibát a támadó böngészője nyomtatja ki.
A hibáért felelős kód:
// ha az adatbázis hibával válaszol, akkor a „or die ()” függvény végrehajtásra kerülhogy kinyomtassa a hibát
$ result = mysql_query ($ getid) vagy meghal ('
" . mysql_error () . "');
A Normal SQL Injection alkalmazásban a támadó láthatja a hiba eredményeit, és könnyen azonosítható és kihasználható.
Vak SQL injekció
Blind SQL Injection esetén, ha rosszindulatú lekérdezést, például egyetlen idézetet hajtanak végre, az adatbázis hibája nem jelenik meg a támadó böngészőjében, vagy nagyon általános módon jelenik meg, amelyet a támadó nem tud könnyen azonosítani és kihasználni.
Az ezért felelős háttérkód az alábbiakban található
$ eredmény = mysql_query ($ getid); // Eltávolította a 'or die' parancsot a mysql hibák elnyomásáhozA vak SQL injekcióban a támadó nem látja a teljes eredményt, ezért ezt a típusú SQLit nehéz azonosítani és kihasználni, de ugyanolyan kockázati szinttel rendelkezik, mint a normál SQLi esetében.
A vak SQL injekció észlelésének technikái
Míg a normál SQL injekció detektálható egyetlen idézet (') elküldésével bemenetként és a kimeneti hiba megvizsgálásával, a vak SQL injekció nem észlelhető ezzel a technikával, mert nem mutat semmilyen SQL hibát. A Blind SQL injekció észlelésére számos módszer létezik, amelyek közül néhányat a következők szerint adunk meg
IGAZ és HAMIS alapú észlelés
A MySQL-t tartalmazó adatbázisok egyik jellemzője a True és False utasítások eltérő viselkedése. Még akkor is, ha az adatbázis nem mutat hibát, dönthetünk a True és False utasítások használatáról. Vegye figyelembe a következő forgatókönyvet,
A következő oldal sérülékeny a Blind SQL injekcióval szemben, így igaz állítással megjeleníti az adatbázis összes bejegyzését
1 'vagy 1 = 1 #
Ha hamis lekérdezést ad meg bemenetként, nem jelenik meg adat.
1 'vagy 1 = 2 #
Még a weboldal sem mutat hibát, a két oldal közötti különbség azt jelzi, hogy lekérdezéseinket sikeresen végrehajtják az adatbázisban.
IDŐ alapú észlelés
Van egy funkció az adatbázisokban, beleértve a MySQL-t, az MS-SQL-et és másokat a késések miatt. Használhatjuk a SLEEP () függvényt lekérdezésünkben, ha az adatbázis válasza lassú, ez azt jelenti, hogy a lekérdezésünk sikeresen végrehajtásra kerül, és a weboldal sérülékeny a Blind SQL Injection számára.
1 'ÉS alvás (15) #
Van még egy időigényes „BENCHMARK” funkció, amely az adatbázis válaszának késleltetésére használható
1 'ÉS BENCHMARK (10000000, SHA1 (1337)) #A fenti sor 10000000-szer hajtja végre az SHA1 () függvényt az adatbázisban, ami jelentős késleltetést eredményez a válaszban.
Időalapú vak SQL injekció más adatbázisokban
MS SQL: ID = 1; várakozási késés '0: 0: 10'-
ORACLE SQL: ÉS [RANDNUM] = DBMS_PIPE.RECEIVE_MESSAGE ('[RANDSTR]', [SLEEPTIME])
PostgreSQL: ÉS [RANDNUM] = (KIVÁLASZT [RANDNUM] A PG_SLEEP-BŐL ([SLEEPTIME]))
SQLite: ÉS [RANDNUM] = LIKE ('ABCDEFG', FELSŐ (HEX (RANDOMBLOB ([SLEEPTIME] 00000000/2))))
Adatbázis-információk kinyerése
Az adatbázis kibontásának első lépése az oszlopok számának meghatározása az adatbázisban. Ezután próbáljon meg sebezhető oszlopokat találni a további adatok kinyerése érdekében.
A vak SQL Injection másként viselkedik a különböző oszlopszámokkal a „rendezés” lekérdezésben.
1 'megrendelés 1 # által
A fenti állítás igaz, mert az adatbázisban mindig legalább 1 oszlop létezik. Most próbáljon meg nagyon nagy számmal.
1 'megrendelés 10000-ig #
Az adatbázis válasza eltér az előzőtől. Most próbálkozzon 2 oszloppal.
Az utasítás működött, ez azt jelenti, hogy az adatbázisnak 2 vagy több oszlopa van. Most próbáljon meg 3 oszloppal.
1 'megrendelés 3 # által
Az adatbázis nem küldött választ, ami azt jelenti, hogy az adatbázisnak csak 2 oszlopa van. Most megpróbáljuk kidobni a táblázatok listáját az adatbázisban, ehhez a következő lekérdezést fogjuk használni
Az 1 'szakszervezet mindegyike válassza ki az 1-et, a csoporthoz tartozó macskát (táblanév) az információséma közül.táblák, ahol table_schema = adatbázis () #
A „vendégkönyv és felhasználók” háttér-adatbázisban két táblázat található. A „felhasználók” táblázat felhasználónéveket és jelszavakat tartalmazhat. Az oszlopnevek kibontásához a táblázatból szúrja be a következő lekérdezést.
Az 1 'szakszervezet mindegyike válassza ki az 1-et, group_concat (oszlop_név) az information_séma közül.oszlopok ahol table_schema = adatbázis () #
Most kivontuk az oszlopneveket, ide tartoznak a felhasználói és a jelszó oszlopok is. Ezek az oszlopok az ügyfelek felhasználónevét és jelszavát tárolják.
Most megpróbáljuk kinyerni az adatokat a következő lekérdezés segítségével
1 'unió mind kiválaszthatja az 1-et, group_concat (felhasználó, jelszó) a felhasználóktól #
És így tudja kihasználni a Blind SQL Injection programot hibák nélkül. A kimeneti jelszavak legtöbbször kivonatolásra kerülnek, amelyeket dekódolni lehet olyan eszközök segítségével, mint a John The Ripper vagy a Hashcat.
Következtetés:
A vak SQL Injection az SQLi típusa, amely nem mutat adatbázis hibákat, vagy nagyon általános üzenettel válaszol. Ezért nagyon nehéz azonosítani a Blind SQL Injection sebezhetőségét egy weboldalon. Miután észlelte, manuálisan vagy automatizált folyamatokkal egyszerűen kihasználhatja az SQLmap használatával.