2009. július 16., csütörtök

Webalkalmazások biztonsági hibái - 11. Fájlok feltöltése

Betörési tesztjeink során gyakran találkozunk azzal a jelenséggel, hogy a weboldalak fejlesztői ugyanazokat a hibákat követik el újra és újra. Ezen klasszikus hibákat egy több részből álló sorozatban szeretnénk bemutatni.

Rengeteg webalkalmazás biztosít lehetőséget arra, hogy a felhasználók feltöltsenek fájlokat az oldalra, és sajnos a sessionkezeléshez hasonlóan ez is triviálisnak tűnhet, noha a gyakorlatban a legtöbb fejlesztő elkövet klasszikus hibákat.
  • Kik számára engedélyezzük a funkció elérését? A fájlfeltöltés biztonságilag kritikus folyamat egy webalkalmazásban, ennek megfelelően kell a felelőtlen elérhetővé tételével. Sok helyen egyszerű regisztráció szükséges csak ahhoz, hogy elérjük a feltöltéses felületet - tehát gyakorlatilag egy ugysincsilyenemailcim@freemail.hu kaliberű cím regisztrálása elegendő. A webalkalmazás biztonsági architektúrájának (!) és védelmi mechanizmusainak (!!) megtervezése (!!!) szükséges, még a kódolás megkezdése előtt (!!!!) - ennek keretében pedig igenis tessék átgondolni, hogy valóban szükségük van-e a mezei felhasználóknak arra, hogy fájlokat töltögethessenek fel a portál webes felületén keresztül.
  • Mit engedünk feltölteni? A legtöbb probléma itt kezdődik, ugyanis a webfejlesztőnek meglehetősen korlátozott funkciók állnak rendelkezésére, hogy a feltöltött állományok típusáról meggyőződjön. Vannak ugye a naiv megoldások, amikor ellenőrizzük, hogy .jpg-re végződik-e a feltöltött fájl neve, de ezeket triviális kicselezni azzal, hogy kedvenc php backdoorunk kiterjesztését megváltoztatjuk. Aztán ott van az eggyel okosabb megoldás, amikor feltöltött adat MIME típusa alapján szortírozunk: nos, ez sem jobb semmivel, mint a kiterjesztés ellenőrzése, ugyanis a típust a kliens állítja be - gyakorlatilag egy mezei intercepting proxyval át lehet ütni tetszőleges értékre a típust, és aztán mehet is fel a backdoor php.Elvileg lehet fokozni a dolgot azzal, ha belenézünk a fájlba pl. a file filenév parancs lefuttatásával, de a fájlszignatúrás posztunk alapján ebben sem szabad megbízni.
  • Milyen néven engedünk feltölteni? Találkoztunk már olyannal, hogy a portál előzékenyen felajánlotta a lehetőséget, hogy valamilyen néven tudjuk feltölteni a fájlunkat. Előzékenyen beleírva a fájlnév mezőbe a "../../backdoor.php" stringet, a webrootba másolta fel a fájlt. Vagy akár írhattunk volna tetszőleges, a php/apache által elérhető helyet.
  • Mi történik a feltöltött fájlokkal? A feltöltésen túljutottunk. Mi történik a fájlokkal, amiket feltöltöttek a webalkalmazásra? A naiv megoldás az, hogy van egy "upload" könyvtár, ahol elérhetőek a feltöltött fájlok: ekkor, mivel tudjuk a fájl nevét, egyszerűen meghívjuk kedvenc PHP backdoorunkat, és voilá!, már meg is van a shell. Ha engedjük a fájlokat inklúdálni ellenőrzés nélkül az include() függvénnyel (például fórumokban az avatárok képei), akkor szintén könnyedén shellt kaphat a támadó. Ami a jogosultságkezelést illeti, már írtunk arról a hibáról, amikor az egyes fájlok elérését nem kötjük hitelesítéshez, hanem az URL ismeretében egyszerűen elérhetőek - nos, ebben az esetben ez a PHP backdoor akadálytalan lefutását eredményezi.
  • Hogy fogunk törölni? Gyakran nem foglalkoznak a fejlesztők azzal a kérdéssel, hogy milyen módon fognak eltűnni a felhasználók által feltöltött fájlok a szerverről: egyetlen példaként hozzuk azt a szkriptet, ami a megengedett maximális méretű fájlt tölti fel - egymilliószor, vagy annyiszor, amennyit a tárterület enged.

Nincsenek megjegyzések:

Megjegyzés küldése

Kommentek