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. 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. 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. 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. 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 adatokatsqlmap -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.