Az úgynevezett "SQL injekciók" egy olyan típusú támadás, amely kihasználja az adatbázis biztonsági hibáit. Ebben a leckében az SQL-injekciókra mutatunk be példákat. Ez a lecke Steve Friedl SQL Injection Attacks by Example című cikkén alapul, amelyet olvasni ajánlok, vagy az SQL injekciós csalólap. Természetesen a lecke célja felhívni a figyelmet arra, hogy minden webalkalmazást meg kell védeni az ilyen típusú támadásoktól.

Minta alkalmazás

Példaként egy olyan alkalmazást fogunk használni, amely hasonló az adatbázisok 1 gyakorlatokhoz.

  • Ennek az alkalmazásnak három menüje van:
    • Törölj mindent, a felhasználói tábla törlése és létrehozása, amely csak két mezőt tartalmaz (a felhasználó nevét és jelszavát).
    • Felhasználók hozzáadása, felhasználónév és jelszavuk hozzáadása a felhasználói táblához.
    • Írja be a rendszerbe, amely szimulálja a bejelentkezési oldalt egy webalkalmazásban, felhasználónevet és jelszót kér, ellenőrzi, hogy szerepel-e a felhasználói táblázatban, és válaszol
      • felhasználónév és jelszó helyes.
      • a felhasználónév helyes, de a jelszó nem megfelelő.
      • a felhasználónév nem megfelelő.
  • Ez az alkalmazás kiszolgáltatott néhány SQL injekciós támadásnak, mert a felhasználó által elküldött adatok előzetes kezelés nélkül szerepelnek az adatbázis lekérdezéseiben.
  • Ez az alkalmazás nem sérülékeny az ebben a leckében tárgyalt összes SQL-injekciós támadással szemben, mert az OEM-kiterjesztést használja. Ha hasonló alkalmazást szeretne tesztelni a számítógépén az ebben a leckében tárgyalt összes támadással szemben, letöltheti ezt a fájlt (injection_sql_2.zip), és tesztelheti a számítógépén.

SQL Injection 1 - Hozzáférés az alkalmazáshoz felhasználónév vagy jelszó nélkül

Amikor a felhasználó beír egy felhasználónevet és jelszót, az alkalmazás válaszol a három üzenet egyikére:

A rendszerbe való belépéshez adja meg felhasználónevét és jelszavát:

Felhasználó:
Jelszó:

Helyes felhasználónév és jelszó.

Helytelen felhasználónév.

Annak ellenőrzésére, hogy az alkalmazás tartalmazza-e a felhasználó előzetes kezelés nélkül elküldött adatait, elküldhetünk (egy vagy kettős) árajánlatot adatként.

A rendszerbe való belépéshez adja meg felhasználónevét és jelszavát:

Felhasználó:
Jelszó:

Helytelen felhasználónév.

A rendszerbe való belépéshez adja meg felhasználónevét és jelszavát:

Felhasználó:
Jelszó:

Lekérdezési hiba.

Ez az utolsó üzenet ("Hiba a lekérdezésben") tudatja velünk, hogy az adatokat nem dolgozták fel, és hogy a lekérdezéseket dupla idézőjelek határolják. Miért?

Valószínűleg az alkalmazás kódja így néz ki:

Ha kettős idézetet teszünk a felhasználónév elejére, a lekérdezés lesz

Ez a lekérdezés helyes (nem tartalmaz szintaktikai hibákat), és futtatásakor az adatbázis csak 0-t ad vissza.

Ha azonban egyetlen idézetet ír be a felhasználónév elejére, akkor a lekérdezés válik

Ez a lekérdezés nem megfelelő (szintaktikai hibát tartalmaz a második sor idézőjelében lévő idézőjel miatt, és végrehajtásakor az adatbázis hibát ad.

Most, hogy tudjuk, hogy a lekérdezést dupla idézőjelek határolják, írhatunk néhány olyan adatot, amely módosítja a lekérdezést, és arra készteti az alkalmazást, hogy úgy gondolja, hogy regisztrált felhasználó adatait adtuk meg.

A rendszerbe való belépéshez adja meg felhasználónevét és jelszavát:

Felhasználó:
Jelszó:

Helyes felhasználónév és jelszó.

Ebben az esetben az adatbázis lekérdezése valami ilyesmi lesz:

Ez a lekérdezés helyes, és futtatásakor az adatbázis a táblázatban szereplő rekordok teljes számát adja vissza, mivel a feltétel mindig teljesül, még akkor is, ha a felhasználónév és a jelszó helytelen, mert a végső feltétel VAGY '1' = '1 'mindig igaz.

SQL Injection 2 - Tudja meg a mezők nevét

A mezők nevét próbával és hibával lehet megtudni. Az ötlet olyan adatok bevezetése, amelyek olyan lekérdezéseket hoznak létre, amelyekben a mezők lehetséges nevei megjelennek. Ha a lekérdezések hibát adnak, az azt jelenti, hogy a név helytelen, ha nem, akkor azt jelenti, hogy helyes a mezők neve.

Például tesztelni fogjuk, hogy az egyik mező neve "felhasználó".

Ehhez hasonlót tehetnénk, mint az előző pontban:

A rendszerbe való belépéshez adja meg felhasználónevét és jelszavát:

Felhasználó:
Jelszó:

Lekérdezési hiba.

Az alkalmazás válasza "Lekérdezési hiba", ami azt jelzi, hogy nincs a "felhasználó" mező. Ebben az esetben az adatbázis lekérdezése valami ilyesmi lesz:

Egy másik lehetséges bejegyzés a következő lehetett:

A rendszerbe való belépéshez adja meg felhasználónevét és jelszavát:

Felhasználó:
Jelszó:

Lekérdezési hiba.

Az alkalmazás válasza "Lekérdezési hiba", ami azt jelzi, hogy nincs "user" nevű mező. Ebben az esetben az adatbázis lekérdezése valami ilyesmi lesz:

Az SQL-ben a kötőjelek jelentik a megjegyzés kezdőjelét, így a végső idézetet nem veszik figyelembe a lekérdezésben.

Mindkét esetben "Hiba történt a lekérdezésben", tehát tudjuk, hogy egyetlen mezőt sem hívunk "felhasználónak".

Most egy második kísérletet teszünk a "felhasználó" névvel

A rendszerbe való belépéshez adja meg felhasználónevét és jelszavát:

Felhasználó:
Jelszó:

Helytelen felhasználónév.

Ebben az esetben az adatbázis lekérdezése valami ilyesmi lesz:

Mivel a "rossz felhasználónév" választ kaptuk, tudjuk, hogy az egyik mező neve "felhasználó".

SQL Injection 3 - Tudja meg a táblák nevét

A táblák nevét próbával és hibával lehet megtudni. Az ötlet olyan adatok bevezetése, amelyek olyan lekérdezéseket építenek fel, amelyekben a táblák lehetséges nevei megjelennek. Abban az esetben, ha a lekérdezések hibát adnak, ez azt jelenti, hogy a név helytelen, ha nem, akkor azt jelenti, hogy helyes a táblák neve.

Vizsgáljuk meg például, hogy a tábla neve "felhasználók"-e.

Ehhez hasonlót tehetnénk, mint az előző pontban:

A rendszerbe való belépéshez adja meg felhasználónevét és jelszavát:

Felhasználó:
Jelszó:

Lekérdezési hiba.

Az alkalmazás válasza: "A lekérdezés sikertelen", amely azt közli velünk, hogy nincs "felhasználóknak" nevezett táblázat. Ebben az esetben az adatbázis lekérdezése valami ilyesmi lesz:

Most egy második kísérletet teszünk a "table" névvel

A rendszerbe való belépéshez adja meg felhasználónevét és jelszavát:

Felhasználó:
Jelszó:

Helytelen felhasználónév.

Ebben az esetben az adatbázis lekérdezése valami ilyesmi lesz:

Mivel megkaptuk a "rossz felhasználónév" választ, tudjuk, hogy az egyik táblát "tábla" -nak hívják.

SQL Injection 4 - Tudja meg a regiszterek tartalmát

Miután megismerte a felhasználói tábla nevét és a mezők nevét, megpróbálhatja próbával és hibával megkeresni a rekord konkrét értékeit. Az ötlet olyan adatok bevezetése, amelyek olyan lekérdezéseket hoznak létre, amelyekben a mezők lehetséges tartalma megjelenik. Ha a lekérdezések hibát adnak, az azt jelenti, hogy a tartalom helytelen, ha nem, akkor azt jelenti, hogy elértük a tartalmat.

Keressük például a felhasználóneveket.

A rendszerbe való belépéshez adja meg felhasználónevét és jelszavát:

Felhasználó:
Jelszó:

Helyes felhasználónév és jelszó.

Az alkalmazás válasza: "Helyes felhasználónév és jelszó.", Ez azt jelzi, hogy van olyan felhasználó, amelynek neve "a" -val kezdődik. Ebben az esetben az adatbázis lekérdezése valami ilyesmi lesz:

Hosszabbíthatnánk a karakterláncot betűről betűre, amíg meg nem találjuk a felhasználó nevét.

SQL injekció 5 - Új felhasználó hozzáadása

jegyzet: Ez a típusú támadás nem működik a lecke első szakaszában található példaalkalmazásban, mivel az OEM-kiterjesztés nem engedélyezi több lekérdezés végrehajtását egyszerre, de a sérülékeny injekció_sql_2.zip alkalmazásban működik, amelyet számítógépén tesztelhet.

Miután megismerte a felhasználói tábla és a mezők nevét, megpróbálhatja szerkeszteni az adatbázist, például hozzáadhat egy felhasználót.

A technika abból áll, hogy tartalmaz egy rekordot beszúró SQL utasítást.

A rendszerbe való belépéshez adja meg felhasználónevét és jelszavát:

Felhasználó:
Jelszó:

Helytelen felhasználónév

Ebben az esetben az adatbázis lekérdezése valami ilyesmi lesz:

Annak ellenőrzéséhez, hogy a támadás sikeres volt-e, meg kell próbálnia "hacker" felhasználóként belépni "hacker" jelszóval.

Nyilvánvalóan ahhoz, hogy a támadás sikeres legyen, megfelelőnek kellett volna lennünk a táblázat felépítésével, amely kiterjedt tesztelést igényelhet, vagy túl nehéz lehet. A felhasználó adatainak megszerzésének másik módja az lenne, ha megtudná valamilyen felhasználó nevét (LIKE utasítások és némi türelem révén), és beadna egy lekérdezést, amely megváltoztatja a jelszavát.

SQL injekció 6 - Dobjon el egy táblázatot

jegyzet: Ez a típusú támadás nem működik a lecke első szakaszában található példaalkalmazásban, mivel az OEM-kiterjesztés nem engedélyezi több lekérdezés végrehajtását egyszerre, de a sérülékeny injekció_sql_2.zip alkalmazásban működik, amelyet számítógépén tesztelhet.

Amint a felhasználói tábla neve ismert, romboló műveletet fogunk végrehajtani, például törölni fogjuk a felhasználói táblázatot.

A technika abból áll, hogy tartalmaz egy rekordot beszúró SQL utasítást.

A rendszerbe való belépéshez adja meg felhasználónevét és jelszavát:

Felhasználó:
Jelszó:

Helytelen felhasználónév

Lekérdezési hiba.

Ebben az esetben az adatbázis lekérdezése valami ilyesmi lesz:

Sikeres támadás esetén az alkalmazás biztosan leáll, mivel az egyik táblázat eltűnt.

Befejezni .

A kiváló xkcd képregény viccet adott le erről a témáról:

adja felhasználónevét jelszavát

Ezt az oldalt utoljára módosították: 2012. november 29


Ez az oldal a tanfolyam része PHP web programozás szerző: Bartolomé Sintes Marco
amelyet Creative Commons Attribution-ShareAlike 4.0 nemzetközi licenc (CC BY-SA 4.0) alatt terjesztenek.