Egy halálos injekció, az SQL injection

Az SQL injection egy olyan (általában webes alkalmazásokban megtalálható) sérülékenység, amelynek során a támadó képes az alkalmazás által lefuttatott SQL utasításba oly módon karaktereket beszúrni, hogy a beszúrt karakterek egy része már ne adatként, hanem SQL utasításként értelmeződjenek. A bejuttatott kódrészlet által a támadó képes lehet új rekordokat beszúrni, vagy akár az egész adatbázist letölteni.

A legtipikusabb példa SQL injection-re, amikor az alkalmazás az SQL utasítást úgy állítja össze, hogy a bejövő adatot nem megfelelően (vagy egyáltalán nem) ellenőrzi mielőtt hozzáfűzné az SQL utasításhoz. Mivel a támadó így olyan karaktereket is képes beküldeni, amelynek az SQL nyelvben speciális szerepe van (pl. aposztróf, idézőjel), az újonnan előállt SQL utasítás teljesen mást is csinálhat, mint amire a fejlesztő eredetileg használni akarta.

Az egyik ilyen tipikus alkalmazás, amikor a felhasználónak be kell jelentkeznie valamilyen oldalon és a háttérben a felhasználónév és jelszó ellenőrzése valamilyen SQL adatbázis segítségével történik. A tapasztalatlan fejlesztő pl. az alábbi kódot használhatja egy adott felhasználóhoz tartozó jelszó lekéréséhez:

query = "SELECT password FROM users WHERE name = '"
        + userName + "';"

A fenti kód mindaddig jól működik, amíg a felhasználók nem próbálnak meg olyan felhasználónevet beküldeni amelyben aposztróf szerepel. Mi történik ugyanis akkor, ha valaki a Bob's Mother névvel próbál meg bejelentkezni? Az összefűzött és adatbázisnak elküldött SQL utasítás ebben az esetben a következő lesz:

SELECT password FROM users WHERE name = 'Bob's Mother'

Aki ismeri az SQL szintaxist, az azonnal észreveheti, hogy a fenti utasítás bizony érvénytelen, vagyis az adatbázis hibával fog visszatérni, ugyanis a felhasználónévben szereplő aposztróf a sztringet lezárja (azaz name = 'Bob'), de az utána következő s Mother' részt az adatbázis nem tudja értelmezni, ezért hibával tér vissza.

A támadó célja természetesen nem az, hogy az adatbázis hibával térjen vissza, hanem valami olyan adattal, amit egyébként nem tudna lekérni. Ezért a támadó következő lépése az, hogy olyan bemenetet küldjön be, amely érvényes SQL utasítást eredményez és így a kód tovább fut, sok esetben akár direktben megjelenítve a visszakapott értékeket.

Aki szeretne SQL injection-nel kísérletezgetni, annak érdemes ezt az élő demo oldalt kipróbálnia: http://sqlzoo.net/hack/

Aki pedig még többet szeretne megtudni az SQL injection támadásról, annak ajánlott az alábbi oldalakat elolvasnia (és a linkelt eszközöket/tutorialokat kipróbálni):

Aki pedig úgy érzi, hogy megértette az SQL injection lényegét, annak egy kis humor a végére: