Adatbázisvédelem (2) - cikk, 7. oldal
Bizonyos esetekben az SCP injektálás még olyan paraméterben is lehetséges, amelyet az apache modul mod_rewrite módszereivel konvertálnak a szkript GET paraméteréhez.
Például /news/127.html típusú szkriptek alakítjuk /news/news.php?id=127 következő szabály: RewriteRule ^ / news / \ html $ "/news/news.php?id=$1" (*)..
Ez lehetővé teszi a rosszindulatú paraméterek átadását a szkripthez. Például: /news/128-1.html
röviden a védelemről.
A fentiek ellenére elegendő néhány egyszerű szabályt követni.
1) az egész és a frakcionális értékekhez, mielőtt felhasználná őket a lekérdezésben, elegendő az értéket a kívánt típushoz hozni.
Ehelyett teszt nyomkövető rendszert helyezhet el az SQL injektáláshoz.
írja a naplóba a kísérletet
2) az olyan sztringparaméterekhez, amelyek nem használódnak hasonló módon, regexp stb.
3) azokon a sorokon, amelyeket a belső, belsőleg használandó, regexp és így tovább kell használni, akkor szükség esetén meg kell jeleníteni az adott operátorokban használt speciális karaktereket. Ellenkező esetben dokumentálhatja ezeket a szimbólumokat.
Ez a dokumentum nem terjed ki az alap SQL-szintaxisra vagy SQL-befecskendezésre. Feltételezzük, hogy az olvasó már jól ismerte a témát. Ez a dokumentum olyan speciális technikákra fog összpontosítani, amelyek a Microsoft SQL Server használatával a webes alkalmazások támadásaiban használhatók. Ezek a technikák bemutatják, hogyan használhatják a támadók SQL injekciókat a tartalom törléséhez az adatbázisból, elkerülve a tűzfalat, és áthaladva a belső hálózaton. Ez a dokumentum arra szolgál, hogy az információbiztonsági szakemberek számára az SQL injekciók potenciálisan veszélyes hatásait jelenítse meg a szervezetben.
A webes alkalmazások biztonságosabbá válnak, mivel a támadások bejelentéseinek száma, például az SQL injektálás, növekszik. Nagy és összetett alkalmazások esetén azonban az egyik felügyelet a teljes rendszer veszélyeztetése lehet. Számos webes alkalmazás fejlesztő és rendszergazda hamis biztonságérzetet élvezhet, mivel tárolt eljárásokat használnak vagy elrejtik a böngészőablakba visszatért hibaüzeneteket. Ez okot ad arra, hogy a sérülékenységet nem lehet használni.
Bár a dokumentumban a Microsoft SQL Serverről beszélünk, ez nem jelenti azt, hogy ez a termék kevésbé biztonságos, mint más platformok, például az Oracle vagy az IBM DB2. Az SQL injektálás nem specifikus biztonsági rés A Microsoft SQL Server általában egy adatbázis-probléma. A Microsoft SQL Server legnagyobb problémája a rugalmasság. Ez a rugalmasság új lehetőségeket nyit meg az SQL Injection osztály támadásaira. A dokumentum célja annak bemutatása, hogy amikor egy rendszergazda vagy fejlesztõ tetszõleges SQL lekérdezést tesz lehetõvé, a megtámadott rendszer nyitva van a teljes rögzítéshez. Ez nem jelenti azt, hogy a Microsoft SQL Server termék általánosságban sérülékeny.
SQL injekciós detektálás
Amikor SQL alkalmazásokat próbál használni az alkalmazásokban, akkor a támadónak szüksége van egy módszerre annak meghatározásához, hogy tetszőleges SQL lekérdezést ténylegesen beillesztett-e. Szükség van egy módszerre az eredmények megszerzéséhez. Ehhez két beépített SQL szerver funkció használható. OPENROWSET és OPENDATASOURCE funkciók egy távoli adatforrás megnyitásához. Ezeket a funkciókat az OLEDB szolgáltatóon keresztül megnyithatja. Az OPENROWSET függvény minden példában használható, de az OPENDATASOURCE funkció ugyanazokkal az eredményekkel használható.
Ez a kifejezés az 1. táblázat összes sorát visszaadja a távoli adatforrásból:
'válassza ki * a table1'-ből)
lehetőségek:
(1) Szolgáltató neve OLEDB
(2) Csatlakozási karakterlánc (lehet az OLEDB vagy az ODBC által előírt formátum)
(3) Az SQL kifejezés
'válassza ki * a táblából')
'válassza ki * a táblából')
Az SQL injektálás során a támadó meghatározhatja, hogy az SQL lekérdezés végrehajtásra került-e. Ha az SQL lekérdezés sikeres, a megtámadott kiszolgáló megpróbálja létrehozni a kimenő kapcsolatot a támadó számítógépével a megadott porthoz. Ezt a kimenő SQL kapcsolatot a legtöbb esetben nem blokkolja a tűzfal, mivel a 80-as portot használják.
Ez a technika lehetővé teszi a támadó számára, hogy megtudja-e, hogy az SQL lekérdezés végrehajtásra került-e még akkor is, ha a hibaüzenetek és lekérdezések eredményei nem jelennek meg a böngészőablakban.
Az SQL injektálás eredményei
A szükséges adatokat leggyakrabban a OPENROWSET és OPENDATASOURCE funkciók használják. Felhasználhatók arra is, hogy adatokat helyezzenek el egy távoli SQL szerverre. A OPENROWSET funkció nemcsak a SELECT lekérdezés végrehajtására használható, hanem az INSERT és a DELETE külső adatforrásokban való végrehajtására is. A távoli forrásból származó adatfeldolgozás nem általános, és csak akkor működik, ha az OLEDB szolgáltató támogatja ezt a funkciót. Az SQLOLEDB szolgáltatónak ilyen funkciói vannak.
Az alábbiakban bemutatjuk, hogyan adhatunk adatokat külső adatforráshoz:
'válassza ki * a table1'-ből)
válassza ki a * táblázatot2
Ebben a példában a helyi SQL-kiszolgáló 2. táblázatának összes sorát hozzáadjuk a távoli kiszolgáló tábla1 táblájához. A lekérdezés sikeres végrehajtásához szükséges, hogy mindkét asztalnak hasonló szerkezete legyen.
Amint azt az előző bekezdésben megtudtuk, a távoli adatforrások átirányíthatók bármely támadó választott kiszolgálójára.
A támadó módosíthatja a fenti lekérdezést egy távoli adatforráshoz való csatlakozáshoz, például a támadó gépén futó Microsoft SQL Server másolatához.
'válassza ki * a table1'
válassza ki a * táblázatot2
Az adatok sikeres beillesztéséhez a támadónak ugyanolyan oszlopokkal és adattípusokkal kell létrehoznia egy táblát1, mint a 2. táblázatban. Ez az információ ugyanazt a trükköt használhatja a rendszer táblázatokhoz. Ez azért fog működni, mert a rendszertáblák szerkezete előre ismert. A támadónak olyan táblák létrehozásával kell elindulnia, amelyek azonosak a rendszertáblák sysdatabases, sysobjects és sys columns rendszerével. Ezután a szükséges információk kivonásához a következő SQL lekérdezéseket kell végrehajtani:
'select * from _sysdatabases')
válassza a * master.dbo.sysdatabases parancsot
'válassza ki * a _sysobjects'-ból)