Ez a cikk elmagyarázza, hogyan lehet tesztelni, hogy egy weboldal biztonságos-e az SQL injekciótól az SQLMAP behatolásvizsgálati eszközzel.

Mi az SQL Injection?

A SQL Injection egy olyan kódinjekciós technika, amelyben a támadó rosszindulatú SQL-lekérdezéseket hajt végre, amelyek egy webes alkalmazás adatbázisát irányítják. A megfelelő lekérdezésekkel a felhasználó hozzáférhet az adatbázisokban tárolt információkhoz. Az SQLMAP teszteli, hogy egy ‘GET’ paraméter sebezhető-e SQL Injectionnel szemben.
Megnézzük például a következő php kódrészletet:

$variable = $_POST;mysql_query("INSERT INTO `table` (`column`) VALUES ('$variable')");

Ha a felhasználó beírja inputként a “value’); DROP TABLE table;-“, a lekérdezés

INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')

lesz, ami számunkra nem kívánatos, mivel itt a felhasználói input közvetlenül az előre megírt sql lekérdezéssel együtt kerül lefordításra. Így a felhasználó képes lesz beírni az adatbázis manipulálásához szükséges sql-lekérdezést.

Hol használhatja az SQLMAP-ot?

Ha olyan web url-t figyel meg, amely a http://testphp.vulnweb.com/listproducts.php?cat=1 formájú, ahol a ‘GET’ paraméter félkövérrel van szedve, akkor a webhely sebezhető lehet az SQL injektálás ezen módjával szemben, és a támadó hozzáférhet az adatbázisban lévő információkhoz. Továbbá az SQLMAP akkor működik, ha php-alapú.

Egy egyszerű teszt annak ellenőrzésére, hogy a webhely sebezhető-e, az lenne, ha a get request paraméterben szereplő értéket egy csillaggal (*) helyettesítené. Például,

http://testphp.vulnweb.com/listproducts.php?cat=* 

Ha ez olyan hibát eredményez, mint a fenti hiba, akkor egyértelműen kijelenthetjük, hogy a weboldal sebezhető.

A sqlmap telepítése

A SQLMAP előre telepítve érkezik a kali linuxhoz, amelyet a legtöbb penetrációs tesztelő előnyben részesít. Az sqlmap azonban más debian alapú linux rendszerekre is telepíthető a

 sudo apt-get install sqlmap 

Usage

A cikkben egy olyan weboldalt fogunk felhasználni, amelyet sebezhetőségekkel terveztek meg demonstrációs célokra:

 http://testphp.vulnweb.com/listproducts.php?cat=1 

Mint látható, van egy GET kérési paraméter (cat = 1), amelyet a felhasználó a cat értékének módosításával megváltoztathat. Tehát ez a weboldal sebezhető lehet az ilyen jellegű SQL injekcióval szemben.
Az ennek teszteléséhez az SQLMAP-ot használjuk. Az átadható paraméterek készletének megtekintéséhez írjuk be a terminálba,

 sqlmap -h 

A fenti képen láthatóak azok a paraméterek, amelyeket az alapvető SQL Injectionhoz használunk. Ezek mellett a -dbs és -u paramétereket is használni fogjuk, amelyek használatát az 1. lépésben már elmagyaráztuk.
Az SQLMAP használata egy weboldal SQL Injection sebezhetőségének tesztelésére:

  1. 1. lépés: A meglévő adatbázisok információinak listázása
    Elsőként tehát a -u paraméterrel együtt kell megadnunk a web url-t, amelyet ellenőrizni szeretnénk. Használhatjuk a -tor paramétert is, ha a weboldalt proxyk segítségével szeretnénk tesztelni. Most tipikusan azt szeretnénk tesztelni, hogy lehetséges-e hozzáférni egy adatbázishoz. Ehhez használjuk tehát a -dbs opciót. A -dbs az összes elérhető adatbázist kilistázza.
     sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1 --dbs 

    A következő kimenetet kapjuk, ami azt mutatja, hogy két elérhető adatbázis van. Néha az alkalmazás közli, hogy azonosította az adatbázist, és megkérdezi, hogy akarunk-e más adatbázis-típusokat is tesztelni. Erre a kérdésre nyugodtan beírhatjuk az ‘Y’-t. Továbbá megkérdezheti, hogy akar-e más paramétereket is tesztelni a sebezhetőségek szempontjából, itt írja be az ‘Y’-t, mivel alaposan tesztelni akarjuk a webes alkalmazást.

    Megfigyeljük, hogy két adatbázis van, az acuart és az information_schema

  2. 2. lépés: Az adott adatbázisban található táblázatokról szóló információk listázása
    Hogy megpróbáljuk elérni bármelyik adatbázist, kissé módosítanunk kell a parancsunkat. Most a -D-vel adjuk meg annak az adatbázisnak a nevét, amelyhez hozzá kívánunk férni, és ha már hozzáférünk az adatbázishoz, akkor szeretnénk megnézni, hogy hozzáférhetünk-e a táblákhoz. Ehhez a -tables lekérdezést használjuk. Lépjünk be az acuart adatbázisba.
     sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1 -D acuart --tables 

    Táblák

    A fenti képen azt látjuk, hogy 8 táblát sikerült lekérni. Így most már biztosan tudjuk, hogy a weboldal sebezhető.

  3. 3. lépés: Információk listázása egy adott táblázat oszlopairól

    Ha egy adott táblázat oszlopait szeretnénk megtekinteni, használhatjuk a következő parancsot, amelyben a -T-vel megadjuk a táblázat nevét, a -columns-t pedig az oszlopnevek lekérdezéséhez. Megpróbálunk hozzáférni a ‘művészek’ táblához.

     sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1 -D acuart -T artists --columns 

    Columns

  4. 4. lépés: Az adatok kiürítése az oszlopokból
    Hasonlóképpen hozzáférhetünk egy adott oszlopban lévő információkhoz a következő paranccsal, ahol a -C paranccsal több oszlop nevét is megadhatjuk vesszővel elválasztva, a -dump lekérdezés pedig lekérdezi az adatokat
     sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1-D acuart -T artists -C aname --dump 

    A fenti képen látható, hogy elértük az adatokat az adatbázisból. Hasonlóképpen, az ilyen sebezhető weboldalakon szó szerint felfedezhetjük az adatbázisokat, hogy információt nyerjünk

Prevent SQL Injection

A SQL injekciót általában Prepared Statements használatával lehet megakadályozni . Amikor előkészített utasítást használunk, alapvetően egy sablont használunk a kódhoz, és külön elemezzük a kódot és a felhasználói bemenetet. Nem keveri a felhasználó által beírt lekérdezést és a kódot. A cikk elején megadott példában a felhasználó által megadott bemenet közvetlenül a kódba kerül, és ezek együtt kerülnek összeállításra, és így képesek vagyunk rosszindulatú kódot végrehajtani. Az előkészített utasítások esetében alapvetően az sql-lekérdezést küldjük el egy helyőrzővel a felhasználói bemenethez, majd a tényleges felhasználói bemenetet külön parancsként küldjük el.
Nézzük meg a következő php kódrészletet.

$db = new PDO('connection details');$stmt = db->prepare("Select name from users where id = :id");$stmt->execute(array(':id', $data));

Ebben a kódban a felhasználói bemenet nincs összekapcsolva az előkészített utasítással. Külön-külön kerülnek összeállításra. Így még akkor is, ha rosszindulatú kódot adnak meg felhasználói bemenetként, a program egyszerűen a kód rosszindulatú részét sztringként kezeli, nem pedig parancsként.

Megjegyzés: Ez az alkalmazás kizárólag tesztelési célokra használható
Kapcsolódó cikk
Basic SQL injection and mitigation

Hivatkozás:stackoverflow.com

Ez a cikk Deepak Srivatsav hozzájárulása. Ha tetszik a GeeksforGeeks és szeretnél hozzájárulni, írhatsz cikket a contribute.geeksforgeeks.org címen, vagy elküldheted a cikkedet a [email protected] címre. Láthatod, hogy a cikked megjelenik a GeeksforGeeks főoldalán, és segíthetsz más geekeknek.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.