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