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:
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.
- L karnitin mellékhatások és ellenjavallatok injekciókban, folyadék
- Szteroid injekciók ízületi gyulladásos térdekben - Orvosi hírek - IntraMed
- Deca Durabolin injekciók eladó minden, amit tudnia kell az ED-ről a Nandrolone-nal
- Fogyás injekciói és hogy van ez a Vibra
- Gyomor injekciók a fogyás érdekében