Acces la linia de comandă din browser folosind shell.php
On ianuarie 5, 2022 by adminCîteodată doriți acces la shell din browser. Acesta poate fi realizat folosind PHP dacă setările de securitate permit acest lucru. Am implementat această funcționalitate în shell.php (disponibil pe Github). În captura de ecran de mai sus puteți vedea cum funcționează accesul la shell din browser. Scriptul vă permite să încărcați, să descărcați, să vizualizați, să editați și să eliminați un fișier, să comprimați și să descompuneți un director și să parcurgeți directoarele de pe server folosind mouse-ul, dar puteți, de asemenea, să tastați comenzi personalizate folosind tastatura.
Avertizare de securitate și disclaimer
Vă rugăm să rulați acest script numai pe mașini pe care le dețineți (sau în timpul unui pentest autorizat). De asemenea, asigurați-vă că mașina este protejată corespunzător de firewall (portul 80 nu ar trebui să fie accesibil de pe internet). Nu îl utilizați în scopuri rău intenționate! Citiți mai multe despre abuzul de scripturi shell aici.
Probleme cunoscute
Dacă scriptul nu funcționează este posibil să fie din cauză că funcția PHP „passthru” pe care se bazează este dezactivată. Pentru a lista funcțiile PHP dezactivate, executați următorul cod PHP:
var_dump(ini_get('safe_mode'));var_dump(explode(',',ini_get('disable_functions')));var_dump(explode(',',ini_get('suhosin.executor.func.blacklist')));
Pe un Ubuntu 14.04 out-of-the-box care va ieși:
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( =>)
Comandă de execuție a shell-ului PHP
Dacă scriptul nu rulează folosind passthru()
, acesta va încerca alte câteva comenzi. Următoarele comenzi sunt similare:
-
exec()
Returnează ultima linie de ieșire a comenzilor -
passthru()
Trece comenzile de ieșire direct în browser -
system()
Trece comenzile de ieșire direct în browser și returnează ultima linie -
shell_exec()
Returnează comenzile de ieșire - .
popen()
Deschide o țeavă de citire sau de scriere către procesul unei comenzi -
proc_open()
Similar cu popen(), dar cu un grad mai mare de control -
pcntl_exec()
Execută un program
Întărește serverul cu open_basedir
Dacă scriptul de mai sus vi se pare înfricoșător, atunci este posibil să doriți să îl împiedicați să se execute pe serverul dumneavoastră. Puteți face acest lucru activând modul sigur (depreciat), folosind variabila php.ini „disable_functions” și/sau lista neagră de execuție a funcțiilor Suhosin.
Am găsit o postare bine scrisă despre securizarea instalației PHP, verificați-o! În afară de limitarea funcțiilor executabile, ei recomandă și variabila de configurare php.ini „open_basedir”. Aceasta limitează fișierele care pot fi accesate de PHP la arborele de directoare specificat. Cred că acesta este un instrument puternic.
De asemenea, ar putea fi o idee bună să vă securizați directorul „/tmp” cu steagurile „nodev”, „nosuid” și „noexec” așa cum este descris aici.
Nu pot găsi Suhosin?
Rețineți că pachetul „php5-suhosin” (o extensie de securitate PHP) nu mai este instalat și nici disponibil pe sistemele bazate pe Debian. Unele dintre îmbunătățirile de securitate au fost încorporate în cele mai recente versiuni PHP (5.4 și 5.5). Dacă doriți să instalați Suhosin (de pe Github) pe Ubuntu 14.04 (PHP 5.5.9) puteți urma acest tutorial.
Puteți citi mai multe despre controversele legate de eliminarea Suhosin pe LWN.net.
Separarea privilegiilor
Dacă există mai mulți utilizatori pe sistem, „separarea privilegiilor” este un MUST. Aceasta înseamnă rularea codului PHP în contextul utilizatorului (de exemplu, ca utilizator „maurits”) și nu ca utilizator „www-data”. Am găsit un articol excelent care explică cum se poate realiza acest lucru. Cea mai simplă soluție este să executați:
sudo apt-get install libapache2-mpm-itk
Și apoi să adăugați directiva „AssignUserID” la fiecare configurație „VirtualHost”. Rețineți că este posibil ca aceasta să nu fie cea mai sigură soluție, dar se comportă bine și este ușor de instalat.
Concluzie
Ar trebui să actualizați și să aplicați întotdeauna patch-uri PHP la cea mai recentă versiune pentru a preveni exploatarea găurilor de securitate cunoscute. Instrumente precum „disable_functions”, „open_basedir”, Suhosin și stegulețele din sistemul de fișiere reduc suprafața de atac și previn exploatarea găurilor de securitate necunoscute. Le puteți utiliza pentru a crea implementarea unei strategii de securitate stratificată. De asemenea, nu uitați de separarea privilegiilor.
.
Lasă un răspuns