Parancsnoki hozzáférés a böngészőből a shell.php használatával
On január 5, 2022 by adminNéha szeretnénk a böngészőből elérni a parancssort. Ez a PHP segítségével megvalósítható, ha a biztonsági beállítások lehetővé teszik. Ezt a funkciót a shell.php-ban implementáltam (elérhető a Githubon). A fenti képernyőképen látható, hogyan működik a shell elérés a böngészőből. A szkript lehetővé teszi egy fájl feltöltését, letöltését, megtekintését, szerkesztését és eltávolítását, egy könyvtár zipelését és kicsomagolását, valamint a szerveren lévő könyvtárak bejárását az egér segítségével, de a billentyűzet segítségével is be lehet írni egyéni parancsokat.
Biztonsági figyelmeztetés és nyilatkozat
Kérlek, ezt a szkriptet csak a saját gépeden (vagy egy engedélyezett penteszt során) futtasd. Győződjön meg arról is, hogy a gépen megfelelő tűzfal van (a 80-as port nem lehet elérhető az internetről). Ne használja rosszindulatú célokra! A shell szkriptekkel való visszaélésekről bővebben itt olvashat.
Ismert problémák
Ha a szkript nem működik, annak oka lehet, hogy a PHP “passthru” funkciója, amelyre támaszkodik, le van tiltva. A letiltott PHP-funkciók listázásához hajtsa végre a következő PHP-kódot:
var_dump(ini_get('safe_mode'));var_dump(explode(',',ini_get('disable_functions')));var_dump(explode(',',ini_get('suhosin.executor.func.blacklist')));
Egy out-of-the-box Ubuntu 14.04-en ez adja ki:
bool(false)Array( => pcntl_alarm => pcntl_fork => pcntl_waitpid => pcntl_wait => pcntl_wifexited => pcntl_wifstopped => pcntl_wifsignaled => pcntl_wexitstatus => pcntl_wtermsig => pcntl_wstopsig => pcntl_signal => pcntl_signal_dispatch => pcntl_get_last_error => pcntl_strerror => pcntl_sigprocmask => pcntl_sigwaitinfo => pcntl_sigtimedwait => pcntl_exec => pcntl_getpriority => pcntl_setpriority =>)Array( =>)
PHP shell végrehajtási parancsok
Ha a szkript nem fut a passthru()
használatával, akkor megpróbál néhány más parancsot. A következő parancsok hasonlóak:
-
exec()
Visszaadja a parancsok utolsó kimeneti sorát -
passthru()
A parancsok kimenetét közvetlenül a böngészőnek adja át -
system()
A parancsok kimenetét közvetlenül a böngészőnek adja át és visszaadja az utolsó sort -
shell_exec()
Visszaadja a parancsok kimenetét - .
popen()
Megnyitja az olvasási vagy írási pipát egy parancs feldolgozásához -
proc_open()
Hasonló a popen()-hez, de nagyobb fokú ellenőrzés -
pcntl_exec()
Végrehajtja a programot
Keményíti a szervert az open_basedirrel
Ha a fenti szkript ijesztőnek tűnik neked, akkor érdemes megakadályoznod, hogy a kiszolgálódon fusson. Ezt megteheted a biztonságos mód engedélyezésével (deprecated), a “disable_functions” php.ini változó és/vagy a Suhosin függvényvégrehajtási feketelista használatával.
Találtam egy jól megírt bejegyzést a PHP telepítésed biztosításáról, nézd meg! A futtatható függvények korlátozása mellett az “open_basedir” php.ini config változót is ajánlják. Ez a PHP által elérhető fájlokat a megadott könyvtárfára korlátozza. Szerintem ez egy hatékony eszköz.
Ezeken kívül jó ötlet lehet a “/tmp” könyvtárat a “nodev”, “nosuid” és “noexec” zászlóval biztosítani az itt leírtak szerint.
Cannot find Suhosin?
Note that the “php5-suhosin” package (a PHP security extension) is not longer established nor available on Debian based systems. A biztonsági fejlesztések egy része beépült a PHP legújabb verzióiba (5.4 és 5.5). Ha a Suhosint (a Githubról) szeretné telepíteni Ubuntu 14.04-re (PHP 5.5.9), akkor ezt a bemutatót követheti.
A Suhosin eltávolítása körüli vitáról bővebben olvashat az LWN.net-en.
Privilege separation
Ha több felhasználó van a rendszerben, akkor a “privilege separation” elengedhetetlen. Ez azt jelenti, hogy a PHP kódot a felhasználói környezetben kell futtatni (pl. “maurits” felhasználóként) és nem “www-data” felhasználóként. Találtam egy nagyszerű cikket, amely elmagyarázza, hogyan lehet ezt elérni. A legegyszerűbb megoldás:
sudo apt-get install libapache2-mpm-itk
Az “AssignUserID” direktíva hozzáadása minden “VirtualHost” konfigurációhoz. Vegye figyelembe, hogy ez nem biztos, hogy a legbiztonságosabb megoldás, de jól teljesít és könnyen telepíthető.
Következtetés
A PHP-t mindig a legújabb verzióra kell frissíteni és javítani, hogy megakadályozza az ismert biztonsági rések kihasználását. Az olyan eszközök, mint a “disable_functions”, “open_basedir”, Suhosin és a fájlrendszer flagek csökkentik a támadási felületet és megakadályozzák az ismeretlen biztonsági rések kihasználását. Segítségükkel többszintű biztonsági stratégiát hozhat létre. Ne feledkezzen meg a jogosultságok szétválasztásáról sem.
Vélemény, hozzászólás?