Kommandoradstillgång från webbläsaren med shell.php
On januari 5, 2022 by adminIbland vill du ha tillgång till skalet från webbläsaren. Det kan åstadkommas med hjälp av PHP om säkerhetsinställningarna tillåter det. Jag har implementerat denna funktionalitet i shell.php (tillgänglig på Github). I skärmdumpen ovan ser du hur skalåtkomst från en webbläsare fungerar. Skriptet gör det möjligt att ladda upp, ladda ner, visa redigera och ta bort en fil, zippa och packa upp en katalog och gå igenom katalogerna på servern med hjälp av musen, men du kan också skriva in egna kommandon med hjälp av tangentbordet.
Säkerhetsvarning och ansvarsfriskrivning
Kör det här skriptet endast på maskiner som du äger (eller under ett auktoriserat pentest). Se också till att maskinen är ordentligt brandväggad (port 80 bör inte kunna nås från Internet). Använd det inte för illasinnade syften! Läs mer om missbruk av skalskript här.
Kända problem
Om skriptet inte fungerar kan det bero på att PHP-funktionen ”passthru” som det är beroende av är inaktiverad. För att lista inaktiverade PHP-funktioner utför följande PHP-kod:
var_dump(ini_get('safe_mode'));var_dump(explode(',',ini_get('disable_functions')));var_dump(explode(',',ini_get('suhosin.executor.func.blacklist')));
På en out-of-the-box Ubuntu 14.04 som ger ut:
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 execution commands
Om skriptet inte går att köra med passthru()
kommer det att prova några andra kommandon. Följande kommandon är liknande:
-
exec()
Returnerar sista raden i kommandoutgången -
passthru()
Överför kommandoutgången direkt till webbläsaren -
system()
Överför kommandoutgången direkt till webbläsaren och returnerar sista raden -
shell_exec()
Returnerar kommandoutgången -
popen()
Öppnar läs- eller skrivledning till processen för ett kommando -
proc_open()
Liknar popen() men större grad av kontroll -
pcntl_exec()
Utför ett program
Härdar din server med open_basedir
Om ovanstående skript verkar skrämmande för dig, så kanske du vill förhindra att det körs på din server. Du kan göra detta genom att aktivera safe mode (deprecated), använda variabeln ”disable_functions” i php.ini och/eller Suhosin function execution blacklist.
Jag har hittat ett välskrivet inlägg om att säkra din PHP-installation, kolla in det! Förutom att begränsa de exekverbara funktionerna rekommenderar de också konfigurationsvariabeln ”open_basedir” php.ini. Den begränsar de filer som kan nås av PHP till det angivna katalogträdet. Jag anser att detta är ett kraftfullt verktyg.
Det kan också vara en bra idé att säkra katalogen ”/tmp” med flaggorna ”nodev”, ”nosuid” och ”noexec” enligt beskrivningen här.
Kan inte hitta Suhosin?
Notera att paketet ”php5-suhosin” (ett säkerhetstillägg för PHP) inte längre är installerat och inte heller tillgängligt på Debianbaserade system. En del av säkerhetsförbättringarna har införlivats i de senaste PHP-versionerna (5.4 och 5.5). Om du vill installera Suhosin (från Github) på Ubuntu 14.04 (PHP 5.5.9) kan du följa den här handledningen.
Du kan läsa mer om kontroversen kring att ta bort Suhosin på LWN.net.
Privilegieavskiljning
Om det finns flera användare på systemet är ”privilegieavskiljning” ett MÅSTE. Detta innebär att PHP-koden körs i användarkontexten (t.ex. som användare ”maurits”) och inte som användare ”www-data”. Jag har hittat en bra artikel som förklarar hur detta kan uppnås. Den enklaste lösningen är att köra:
sudo apt-get install libapache2-mpm-itk
Och sedan lägga till direktivet ”AssignUserID” i varje ”VirtualHost”-konfiguration. Observera att detta kanske inte är den säkraste lösningen, men den fungerar bra och är lätt att installera.
Slutsats
Du bör alltid uppdatera och patcha PHP till den senaste versionen för att förhindra utnyttjande av kända säkerhetshål. Verktyg som ”disable_functions”, ”open_basedir”, Suhosin och filsystemflaggor minskar angreppsytan och förhindrar utnyttjande av okända säkerhetshål. Du kan använda dem för att skapa en strategi för säkerhet i flera lager. Glöm inte heller privilegieavgränsning.
Lämna ett svar