SQL injekciók

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ó".