SQL injection attack
Főnév
SQL injection attack (tsz. SQL injection attacks)
- (informatika) Az SQL injection (SQL befecskendezés) egy gyakori és veszélyes webes biztonsági támadási forma, amely során egy támadó rosszindulatú SQL lekérdezéseket juttat egy webalkalmazás adatbázisába, kihasználva a hibásan kezelt felhasználói bemeneteket. A támadás célja lehet adatlopás, adatmanipuláció, vagy akár teljes adatbázis törlése. Az SQL injection támadások az SQL parancsokba történő kódbefecskendezésen alapulnak, és akkor fordulnak elő, ha a felhasználói bemenetet a webalkalmazás nem megfelelően szűri vagy nem biztonságosan dolgozza fel.
Hogyan működik az SQL injection?
Az SQL injection kihasználja az adatbázisokkal kommunikáló webalkalmazások sebezhetőségeit, amelyek felhasználói bemeneteket (például űrlapokból, URL-ből vagy sütikből származó adatokat) illesztenek be SQL lekérdezésekbe. Ha a bemenetek nem megfelelően vannak ellenőrizve vagy tisztítva, a támadó manipulálhatja az SQL lekérdezéseket, és váratlan parancsokat adhat végre az adatbázisban.
Példa egy SQL injection támadásra:
Tegyük fel, hogy van egy egyszerű bejelentkezési űrlap, ahol a felhasználónév és jelszó alapján az alábbi SQL lekérdezést hajtják végre:
SELECT * FROM users WHERE username = 'admin' AND password = 'password';
Ha a felhasználónév és a jelszó bemeneteket nem megfelelően tisztítják, a támadó a következő bemenetet adhatja meg:
- Felhasználónév:
admin' -- - Jelszó: (nem szükséges megadni)
A végrehajtott SQL lekérdezés így néz ki:
SELECT * FROM users WHERE username = 'admin' --' AND password = '';
A -- karakter jelzi az SQL-ben a megjegyzést, így a jelszóra vonatkozó feltétel figyelmen kívül marad. Ez azt jelenti, hogy a támadó bejelentkezhet az admin felhasználó nevében anélkül, hogy ismerné a jelszót.
SQL injection típusai
- Egyszerű SQL injection (Classic SQLi): Az egyszerű SQL injection során a támadó közvetlenül manipulálja a SQL lekérdezéseket a felhasználói bemeneten keresztül. Ez a legegyszerűbb és leggyakoribb típus, amelyet gyakran gyenge bemeneti validációs hibák okoznak.
- Vak SQL injection (Blind SQLi): Ebben az esetben a támadó nem látja közvetlenül a lekérdezések eredményét, mert a webalkalmazás nem jelenít meg konkrét hibákat vagy adatokat. Ehelyett a támadó logikai következtetések alapján, “próba-szerencse” módszerrel dolgozik, például megpróbálja kiváltani igen/nem típusú válaszokat a szerverről.
- Hibákon alapuló SQL injection (Error-based SQLi): Ez a támadási forma kihasználja az adatbázis szerver által visszaküldött hibákat, hogy információkat nyerjen ki az adatbázisból. Ha az alkalmazás hibákat jelenít meg (például SQL szintaktikai hibákat), a támadó felhasználhatja azokat további információk megszerzésére.
- Uniós SQL injection (Union-based SQLi): A támadó az UNION SQL parancsot használja arra, hogy két vagy több SELECT lekérdezést egyesítsen, és így adatokat szerezzen meg egy másik táblából, amit a támadó hozzákapcsol az eredeti lekérdezéshez.
Az SQL injection támadások hatásai
- Adatszivárgás: A támadó érzékeny adatokat szerezhet meg az adatbázisból, például felhasználói neveket, jelszavakat, e-mail címeket, pénzügyi információkat stb.
- Adatmódosítás: A támadó megváltoztathatja az adatokat az adatbázisban, például megváltoztathatja a felhasználói jelszavakat vagy egyéb kritikus adatokat.
- Teljes adatbázis törlése: Egy súlyos SQL injection támadás akár az egész adatbázis törléséhez is vezethet.
- Rendszergazdai hozzáférés szerzése: A támadó akár adminisztratív hozzáférést is szerezhet az adatbázishoz, ami súlyos biztonsági kockázatot jelent.
Hogyan lehet megelőzni az SQL injection támadásokat?
Paraméterezett lekérdezések használata: A legjobb módja az SQL injection elleni védekezésnek az, ha paraméterezett lekérdezéseket (más néven “prepared statements”) használunk. Ezzel a módszerrel az SQL lekérdezés szerkezete és a felhasználói bemenetek szét vannak választva, így a bemenetet soha nem lehet közvetlenül az SQL kódban végrehajtani.
Példa PHP-ben PDO használatával:
$stmt = $pdo->prepare('SELECT * FROM users WHERE username = :username AND password = :password'); $stmt->execute(['username' => $username, 'password' => $password]);
Input validálás: Minden felhasználói bemenetet alaposan ellenőrizni kell, hogy megfeleljen a várható formátumnak. Például, ha egy bemenetnek csak számokat kell tartalmaznia, gondoskodni kell arról, hogy más karaktereket ne fogadjon el.
Kimeneti kódolás: Az adatbázisból érkező adatokat ki kell kódolni, mielőtt megjelenítjük őket a felhasználók számára, így megakadályozva, hogy azok rosszindulatú kódot futtassanak a böngészőben.
Legújabb adatbázis-kezelő használata: Fontos, hogy az adatbázis-kezelő rendszert (pl. MySQL, PostgreSQL, MSSQL) mindig a legújabb verzióra frissítsük, mivel az újabb verziók tartalmazhatják a biztonsági hibajavításokat.
Minimális jogosultságok: Az adatbázishoz használt felhasználói fiókoknak csak a minimális szükséges jogosultságokkal kell rendelkezniük. Például egy olvasási műveleteket végző alkalmazásnak nem szabad írni vagy törölni jogosultságokat adni.
WAF (Web Application Firewall) használata: A WAF egy tűzfal, amely kifejezetten webalkalmazások védelmére szolgál, és képes felismerni és blokkolni az SQL injection támadásokat.
Összegzés
Az SQL injection egy kritikus biztonsági hiba, amely lehetővé teszi a támadók számára, hogy rosszindulatú SQL parancsokat hajtsanak végre egy webalkalmazás adatbázisában. A támadás súlyos adatlopásokhoz, adatbázis módosításhoz, vagy akár az adatbázis teljes törléséhez is vezethet. Az ilyen támadások megelőzése érdekében alapvető fontosságú a paraméterezett lekérdezések használata, az input validáció, valamint a megfelelő jogosultságkezelés és biztonsági intézkedések alkalmazása.
- SQL injection attack - Szótár.net (en-hu)
- SQL injection attack - Sztaki (en-hu)
- SQL injection attack - Merriam–Webster
- SQL injection attack - Cambridge
- SQL injection attack - WordNet
- SQL injection attack - Яндекс (en-ru)
- SQL injection attack - Google (en-hu)
- SQL injection attack - Wikidata
- SQL injection attack - Wikipédia (angol)