PHP-Code in Bildern verstecken

Von | 6. September 2019

Disclaimer

Vielen Dank an inkmedia.eu für das Foto.

Die hier beschriebene Methode soll nur als Veranschaulichung dienen wie man ganz unbewusst ausspioniert wird und selten oder gar nicht die Möglichkeit hat dies zu bemerken oder gar zu verhindern. Das Speichern von Benutzerspezifischen Daten wie der IP-Adresse ist ohne die Zustimmung des Benutzers illegal und sollte unter keinen Umständen durchgeführt werden.

JavaScript ist nicht die einzige Möglichkeit Benutzer im Internet zu tracken. Die Furchtbare Erkenntnis ist, dass es sogar mit einfachen Bildern möglich ist. Eine Möglichkeit dazu ist zum Beispiel das Verstecken von PHP-Code in einem Bild. Im Folgenden wollen wir uns anschauen, wie sowas aussehen könnte. Jedoch hier noch einmal der Hinweis, dass das Speichern von Informationen über Andere nur dann gestattet ist, wenn diese dem zustimmen.

Wie funktioniert das Erkennen von Dateien und dessen Typen?

Eine Datei kann man in der Regel anhand von zwei Kriterien erkennen. Die erste Möglichkeit ist relativ simpel über die Dateiendung. Windows macht das häufig auf diese Weise. Dabei wird lediglich geprüft welche Dateiendung eine Datei hat und wenn diese dann entsprechend geöffnet oder aufgerufen wird öffnet sich das dazugehörige Programm.

Etwas anders funktioniert es unter Linux und macOS. Hier wird auf den sogenannten Datei-Header geschaut. Das bezeichnet den Anfangsbereich (auf Byte-Ebene) einer Datei. Dort steht dann zum Beispiel so etwas wie “Content-type: image/png“. Somit ist dann klar, dass es sich um eine PNG-Datei handelt.

Wie man sich offensichtlich denken kann ist der erste Fall relativ einfach zu fälschen. Ein einfaches Umbenennen der Dateiendung reicht in den meisten Fälle aus. Der zweite Fall ist zwar etwas schwieriger zu fälschen aber dennoch nicht unmöglich. Moderne Programme versuchen sogar beide Informationen auszulesen und zu verarbeiten. Da jedoch beide gefälscht werden können ergeben sich daraus sehr interessante Möglichkeiten.

Ein Bild mittels PHP erzeugen

Das Erzeugen eines Bildes mittels PHP ist relativ einfach. Hier ein ganz simples Beispiel:

<?php
header("Content-type: image/png");
$background = imagecreatefrompng("./background.png");
imagepng($background)
imagedestroy($background);
?>

In Zeile 2 wird der besagte Header gesetzt. Anschließend wird eine lokale .png-Datei geladen und angezeigt.

Nun gibt es zwei Möglichkeiten, diese Datei abzuspeichern. Entweder man speichert sie als .php-Datei ab und beim Aufrufen wird in der Regel ein Bild angezeigt oder man speichert sie als .png-Datei ab. In diesem Fall jedoch wird die Datei nicht als Bild im Browser angezeigt. Stattdessen wird bei den meisten Browsern ein Download gestartet und lädt das Script inklusive dem Quelltext herunter.

Der erste Fall ist jedoch genau das, was gewünscht ist. Er hat aber zwei Nachteile. Der erste ist ziemlich offensichtlich. Jeder der die Adresse der Bilddatei betrachtet sieht sofort, dass es sich um ein Script handelt. Zwar kann man die Datei wie folgt in ein HTML-Dokument einbinden, jedoch funktioniert diese Methode zum Beispiel bei BB-Code in Foren nicht immer. Diese haben meist noch einen zusätzlichen Filter auf die Dateiendung.

<img src="https://domain.tld/image.php">

Eine elegantere Lösung wäre es doch, wenn man es als .png-Datei abspeichern könnte, was dann jedoch nicht als Bilddatei vom Webserver interpretiert würde sondern als PHP-Script. Das ist mit einigen Modifikationen am Webserver in der Tat möglich.

Eine Bilddatei als PHP-Script interpretieren

Das folgende Beispiel verwendet PHP-FPM und NGINX für die Konfiguration. Unter Apache ist es mit einigen Modifikationen ebenfalls umsetzbar.

Zuerst muss PHP natürlich wissen, welche Endungen von dem Interpreter interpretiert werden sollen. In der Regel kennt der Interpreter lediglich die .php-Endung. Die entsprechende Einstellung erfolgt in der jeweiligen Konfiguration. Diese befinden sich bei PHP-FPM unter /etc/php/7.x/fpm/pool.d/.
Es wird lediglich eine Option benötigt

security.limit_extensions = .php .png

Wichtig hier ist noch, dass man sich merken sollte wie bzw. wo der Interpreter auf Eingaben wartet. In der Regel ist dies ein Socket. Die entsprechende Konfiguration dafür könnte wie folgt aussehen:

listen = /var/run/php/php7-fpm-domain.tld.sock

Im letzten Schritt muss lediglich dem Webserver noch beigebracht werden die entsprechende .png-Datei nicht als Bilddatei zu behandeln sondern an den Interpreter weiterzugeben, damit dieser das PHP-Script dahinter ausführen kann. Es ist ratsam dies nicht für alle .png-Dateien zu machen sondern lediglich spezifisch für jedes .png-PHP-Script. Andernfalls hat man schnell das Problem, dass Bilder auf dem Webserver nicht mehr funktionieren. Die Konfigurationen für die verschiedenen Webseiten befinden sich übrlichweise unter /etc/nginx/sites-enabled/.

location ~ /fakeimages/fakeimage.png {
    fastcgi_pass unix:/var/run/php/php7-fpm-domain.tld.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

Somit weiß auch der Webserver was dieser mit der Datei machen soll. Nach einem anschließenden Neustart von PHP und NGINX sollte beim Aufruf der .png-Datei kein Download mehr starten. Stattdessen sollte ein Bild angezeigt werden, das in keiner Weise als PHP-Script identifiziert oder erkannt werden kann. Auch das Einbinden mittels BB-Code in Foren funktioniert anschließend problemlos. Jedoch sollte hier auch unbedingt erwähnt werden, dass ein Download der Datei lediglich eine Momentaufnahme der Bilddatei erzeugt und diese als völlig normale Bilddatei absichert. Des gespeicherte Bild ist dann natürlich kein dynamisches Bild mehr.

Wozu das Ganze?

Da es sich um ein PHP-Script handelt kann man natürlich alles machen, was PHP an dieser Stelle erlaubt. Das kann zum Beispiel eine illegale Möglichkeit sein Benutzerinformationen zu tracken und zu speichern. Viel interessanter jedoch ist die Möglichkeit ein dynamisches Bild auf diese Weise zu erzeugen.

Viele dynamisch eingebundene Bilder haben das Problem, dass sie JavaScript benutzen. Das können zum Beispiel dynamische Signaturen in Foren sein. Man sieht häufig wie bestimmte Communities, die ihren Benutzern anbieten ihre Profil-Statistiken als Banner in anderen Foren in die Signatur einzubinden.
Nutzt man jedoch JavaScript gibt es nahezu keine Möglichkeit das in Signaturen einzubinden. Auch hat man häufig Probleme mit blockierten JavaScripts. Oder die Bilder sind statisch und werden Serverseitig nur in bestimmten Zeitabschnitten aktualisiert.

Mit dieser Methode hat man jedoch ein dynamisches Bild, das bei jedem Aufruf neu generiert wird. Entsprechend mit den aktuellsten Daten, die man auf dem Foto einbinden will.

Wie schütze ich mich davor?

Soweit mir bekannt ist, gibt es keine Möglichkeit solch manipulierte Bilder zu erkennen. Dies ist unter anderem der Funktionsweise des Internets geschuldet. Wenn man eine Adresse mit einer manipulierten Bilddatei aufruft liefert der Webserver lediglich einen Datenstrom aus. Dieser beinhaltet das Bild und nicht das Script. Wenn zum Beispiel ein böswilliger Angreifer einem anderen Benutzer in einem Forum eine private Nachricht mit einem eingebetteten Bild schickt wird beim Öffnen der privaten Nachricht die Bilddatei von der externen Quelle abgerufen und der Angreifer kennt die IP-Adresse des Opfers. Das funktioniert leider auch zum Beispiel bei Messengern, die vorab eine Vorschau einer Webadresse laden, noch bevor der Benutzer sie anklickt.

Es gibt zwar Möglichkeiten die Gefahren zu reduzieren jedoch komplett verhindern kann man sie nicht. Es gibt zum Beispiel Browser Plugins, die das Nachladen von externen Dateien komplett verhindern, selbst wenn die Webseite es erlauben würde. Auch das Abschalten der Vorschaufunktion in Messengern kann helfen.

Zudem kann man die Informationen, die ein PHP-Script über den Benutzer herausfinden kann manipulieren. Die IP-Adresse kann durch TOR oder einen VPN verborgen werden. Die Auflösung des Computers dadurch, dass man den Browser nicht im Vollbild-Modus verwendet. Auch der User-Agent kann entsprechend manipuliert und verändert werden. Mit solchen Maßnahmen werden die Informationen für den Angreifer großteils wertlos.

5 bescheidene Meinungen zu “PHP-Code in Bildern verstecken

  1. AvatarLukas

    Einen Mini-Schutz bietet auch Opera an, indem man als hiesiger Opera-Nutzer über einen niderländischen VPN-Server ins Internet geht.

    Aber gibt es nicht einen Browser, der die Nutzer-Meta-Daten durcheinander bringt? Ich meine, mal so etwas gelesen zu haben.

    Antworten
    1. b1ueb1ue Post author

      Hallo Lukas,
      ja wie in dem Artikel bereits geschrieben gibt es Browser Addons die die Benutzerinfos “verallgemeinern”. Sie nur zufällig zu verändern würde relativ wenig bringen, solang sie immer noch einigermaßen individuell sind. Erst wenn sehr viele Benutzer nach außen hin identisch aussehen wäre ein gezieltes Tracking nicht mehr möglich.

      Antworten
  2. AvatarE Turan

    Hi,
    welche Browser/Addons würdest dem Otto Normal Surfer (Google, eBay, FarmVille Nutzer) empfehlen?

    Antworten
    1. b1ueb1ue Post author

      Brave ist als Grundlage eine sehr gute Idee. Brave basiert auf Chrome und setzt den primären Fokus darauf Tracking und Werbung weitgehend zu verhindern. Zudem hat es neben dem Inkognito-Modus noch einen zweiten Modus, der sogar über TOR läuft. Somit ist man schon einmal sehr anonym. Noch mehr Anonymität kann man durch einfache Maßnahmen erhalten, wenn man zum Beispiel den Browser nicht im Vollbildmodus benutzt. Somit kann auch die Auflösung nicht ausgelesen werden.
      In Brave oder Chrome kann man zudem den “User-Agent” noch manipulieren. Das geht in den Entwicklertools oben rechts über die drei Punkte. Dort auf “More Tools -> Network Conditions”. In dem neuen Fenster kann man den User-Agent dann selbst festlegen. Ich rate stark davon ab, etwas Freies einzugeben. Ich empfehle eher einen User-Agent zu wählen der von möglichst vielen Benutzern benutzt wird um so in der “Menge unterzugehen”. Denn umso generischer man ist, umso schwieriger wird es für Webseitenbetreiber Benutzer eindeutig zuzuordnen. Der aktuell meistgenutzte User-Agent ist “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36” (https://techblog.willshouse.com/2012/01/03/most-common-user-agents/)

      Antworten
  3. AvatarHendrik

    Leider ist verstecktes Tracking im Internet zu einer regelrechten Krankheit geworden. Das Nachladen von Inhalten ist oft unumgänglich, viele E-Mails sind bspw. ohne Nachladen der eingebetteten Bilder nicht oder kaum lesbar.
    Schutz davor bietet wirklich nur das konsequente nicht-Laden von Bildern oder externen Inhalten.

    Ich persönlich setze privat auf den DNS-Blocker “piHole”, der schon viele Tracking-Inhalte daran hindert, den Server aufzulösen dem die Daten gesendet werden sollen. Funktioniert natürlich nur mit dynamischen Serveradressen. Wenn eine App oder ein Gerät “fest” den DNS-Server oder die IP des Trackers einkonfiguriert hat und auf den dynamisch per DHCP eingestellten Server nicht mehr hört, hilft nur noch eine gut konfigurierte Firewall. (Welche bei mir hauptsächlich anschlägt, wenn Android-Besuch im Haus ist)

    Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

* Ich bin damit einverstanden, dass gemäß der Datenschutzbestimmungen meine eingegebenen Daten gespeichert werden.