PHP De-Obfuscation

In den letzten Tagen hatte ich viel mit obfusciertem PHP-Quellcode (Frameworks & Schadcode) zu tun, der zumeist über einen langen String definiert war und dann mittels einfacher eval()-Funktion erst zur Laufzeit das ein oder andere dunkle Geheimnis preisgab.

Das erste Hindernis besteht darin, diesen String in lesbaren Quellcode zu formatieren. Nach kurzer Recherche im Web und ein paar Experimenten hatte ich folgendes kleine PHP-Script:

ob_start();
eval("?" . ">" . base64_decode( $code) . "<" . "?php");
$output = ob_get_contents();
ob_end_clean();
echo $output;

1. Die Funktion ob_start() aktiviert die Pufferung von Ausgaben ein. Während die Ausgabe-Pufferung aktiv ist, erfolgt keine Ausgabe an den Client. Stattdessen werden alle Ausgaben in einem internen Puffer gespeichert.

2. Die Funktion eval() wertet einen String als PHP-Code aus. Sie ist nützlich, wenn man bspw. PHP-Code aus einer Datenbank lädt. Für dieses Experiment jedoch wäre sie ungeeignet, da der PHP-Quellcode direkt ausgeführt würde. Wenn der String mit „?>“ (PHP endet) beginnt, wird der Code nicht ausgeführt und man hat eine saubere Ausgabe. Die Funktion base64_decode() war nötig, da der Code base64-kodiert war.

3. Mit der Funktion ob_get_contents() wird der Inhalt des internen Puffers in eine String-Variable kopiert. Die String-Variable enthält sämtliche Ausgaben seit dem Befehl ob_start().

4. Die Funktion ob_end_clean() löscht daraufhin den internen Ausgabepuffer und beendet das Outputbuffering.

5. Der Quellcode steht u.U immer noch in einer Zeile ist jedoch lesbar. Er kann nun angesehen und mit einer leistungsstarken IDE formatiert werden.

Im Quellcode der gegebenen PHP-Datei sind die Texte ASCII-codiert und die Strings deshalb nicht lesbar. Alle Zeichen wurden mit dem entsprechenden ASCII-Code abgebildet (z.B.: „\x73“). Das berechnen des Quellcodes mit eval() hilft hier nur soweit man während der Laufzeit noch auf diese Strings lesbar zugreifen kann. Möchte man jedoch schon den Quellcode lesen können, hilft die Funktion str_replace() weiter:

$output = str_replace("\\x73", "s", $input);

Der doppelte Backslash „\\“ ist nötig, um den Backslash selber zu escapen.

Um das an dieser Stelle zu beschleunigen:

$ascii_hex = array(
"\\x20", "\\x21", "\\x22", "\\x23", "\\x24", "\\x25", "\\x26", "\\x27", "\\x28",
"\\x29", "\\x2a", "\\x2b", "\\x2c", "\\x2d", "\\x2e", "\\x2f", "\\x30", "\\x31",
"\\x32", "\\x33", "\\x34", "\\x35", "\\x36", "\\x37", "\\x38", "\\x39", "\\x3a",
"\\x3b", "\\x3c", "\\x3d", "\\x3e", "\\x3f", "\\x40", "\\x41", "\\x42", "\\x43",
"\\x44", "\\x45", "\\x46", "\\x47", "\\x48", "\\x49", "\\x4a", "\\x4b", "\\x4c",
"\\x4d", "\\x4e", "\\x4f", "\\x50", "\\x51", "\\x52", "\\x53", "\\x54", "\\x55",
"\\x56", "\\x57", "\\x58", "\\x59", "\\x5a", "\\x5b", "\\x5c", "\\x5d", "\\x5e",
"\\x5f", "\\x60", "\\x61", "\\x62", "\\x63", "\\x64", "\\x65", "\\x66", "\\x67",
"\\x68", "\\x69", "\\x6a", "\\x6b", "\\x6c", "\\x6d", "\\x6e", "\\x6f", "\\x70",
"\\x71", "\\x72", "\\x73", "\\x74", "\\x75", "\\x76", "\\x77", "\\x78", "\\x79",
"\\x7a", "\\x7b", "\\x7c", "\\x7d", "\\x7e", "\\x7f"
);

$ascii_char = array(
" ", "!", '"', "#", "$", "%", "&", "'", "(", ")", "*", "+", ",", "-", ".", "/",
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?",
"@", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P",
"Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "[", "\", "]", "^", "_", "`", "a",
"b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r",
"s", "t", "u", "v", "w", "x", "y", "z", "{", "|", "}", "~"
);

$output = str_replace($ascii_hex, $ascii_char, $input);

So hat man schnell den lesbaren Text /PHP-Quellcode.

Sicherlich ist das nicht die eleganteste Lösung und ich lasse mich gerne von schöneren überzeugen!

Ein weiterer Teil der Strings ist wieder base64-kodiert, wie bspw.:

$output = base64_decode("aHR0cDovL3d3dy5kaXJlY3Qtd2Vic29sdXRpb25zLmRlL2Jsb2cvd2ViZGVzaWduL3BocC1kZS1vYmZ1c2NhdGlvbi10ZWlsLTMuaHRtbA==");

Um dieses Problem zu lösen, hilft die PHP-Funktion preg_replace_callback():

function decode($erg) {
    return '"' . base64_decode($erg[1]) . '"';
}
$output = preg_replace_callback("/base64_decode\('([a-z0-9+=]*)'\)/i", 'decode', $input);

Generierung einer PHP-Dokumentation mit NetBeans

PHPDoc ist eine Dokumentationslösung für PHP. Aus der Dokumentation können dann mit bspw. phpDocumentor später die Beschreibung für APIs oder die Entwicklerdokumentationen generiert werden. Auch einige IDEs wie NetBeans oder Zend Studio greifen auf diese Kommentare zurück und benutzen sie für die Codevervollständigung und Beschreibung.

Um eine solche Dokumentation mit NetBeans unter Windows mit dem phpDocumentor zu generieren, muss dieser zunächst installiert werden. Dafür ruft man am besten den Kommandozeileninterpreter von Windows auf (Start → Ausführen → „cmd“). Wichtig ist, dass das aktuelle Verzeichnis dem Benutzerverzeichnis entspricht (%HOMEPATH%). Hier gibt man dann den folgenden Befehl ein:

pear.bat install --alldeps PhpDocumentor

Dies setzt natürlich voraus, dass der Pfad zu PEAR (PHP Extension and Application Repository) in den Pfad-Variablen eingetragen ist. Der Befehl sorgt letztlich dafür, dass die benötigten Erweiterungen und deren Abhängigkeiten für den phpDocumentor heruntergeladen und eingerichtet werden.

Im Benutzerverzeichnis wird nun ein neues Verzeichnis „pear“ mit diversen Unterverzeichnissen und Dateien erstellt.

Damit NetBeans nun noch auf die Konfigurationsdatei unter „%HOMEPATH%\pear\data\PhpDocumentor\phpDocumentor.ini“ zugreifen kann muss eine kleine Änderung an der Datei phpdoc.bat vorgenommen werden. Die Datei liegt in dem PHP-Verzeichnis von Xampp. Damit das Skript die richtige Konfigurationsdatei findet, muss das Verzeichnis gewechselt werden. Dazu muss „CD %HOMEPATH%“ in der Datei eingetragen werden (am einfachsten am Anfang).

Bei Verwendung von PHP 5.3 sollte die php.ini Datei kontrolliert werden und ggf. angepasst werden. Wie unten gezeigt, sollte die folgende Zeile kein Kommentar sein:

"date.timezone = "Europe/Berlin"

Dieses findet man wenn man nach dem folgendem Block sucht:

[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = "Europe/Berlin"

Nun kann man NetBeans starten und unter „Tools → Options → PHP → PhpDoc“ den Pfad auf seine „phpdoc.bat“ Datei setzen. Der Button zur Suche funktioniert nur, wenn der Pfad in der PATH-Variable hinterlegt ist. Optionen kann man direkt hinter der Datei eintragen wie: „-o HTML:frames:earthli“. Auch andere Formate für das spätere PhPDoc sind möglich.

Mit einem Rechtsklick auf sein Projekt kann man den Menüpunkt „Generate PhpDoc“ auswählen. Bei dem ersten Aufruf wird man zur Auswahl des Ziel-Verzeichnisses aufgefordert. Das Verzeichnis kann man über den Browser auswählen, muss dann jedoch die Backslashes in normale Slashes umwandeln („\“ → „/“), da andernfalls NetBeans kommentarlos die Generierung verweigert! So kann man nun schnell und ohne Umwege die PHP Dokumentation unter NetBeans 7.0 unter Windows ausführen.

Buchempfehlung für agile Webentwicklung mit Yii

Meinung über das Buch: Agile Webapplication Developement with Yii & PHP

In dem Buch geht es um die agile Softwareentwicklung mit dem Yii-PHP5-Framework. Dabei setzt das Buch bei dem geschichtlichen Hintergrund an und führt den Leser langsam an das Framework Yii heran.

Als Grundkenntnisse setzt das Buch ein sicheres Programmieren mit PHP und Kenntnisse über das Objekt-orientierte Programmieren (kurz: OOP) voraus. Wenn man bereits Kenntnisse über andere Frameworks besitzt, wird man Parallelen bemerken (insbesondere zum PRADO-Framework).

Mit kleinen Beispielen wird man einfach an das Framework herangeführt. Sollte man noch keinen Kontakt zu solchen Frameworks gehabt haben, verläuft die Lernkurve zunächst sehr flache, steigt dann jedoch auch schnell an, sobald man ein wenig mehr als den Basisumfang nutzen möchte. So fällt der Einstieg sehr leicht (auch in das Buch), später werden jedoch über die integrierten Erweiterungen auch komplexere Themen behandelt, die mitunter schwere Kost sind. Bei dieser hilft dann auch nur die technische Dokumentation von Yii weiter.

Buchinhalt:

  • Schlüsselkonzepte von Yii (Einfachheit, Effizienz und Erweiterbarkeit)
  • Die Model-View-Controller-Architektur (kurz: MVC)
  • Das Yii-Request-Routing
  • Die Objektrelationale Abbildung (kurz: ORM)
  • Installationsanleitung
  • „Hello, World!“-Beispiel
  • Diverse weitere Beispiele und Anwendungen
  • Yii und PHPUnit
  • Funktionale Tests mit Selenium
  • Konfiguration der Datenbakverbindung
  • Create-Read-Update-Delete (kurz: CRUD) Scaffolding mit Gii
  • Das Auth-Modul von Yii (kurz: UAC und RBAC)
  • Das Template-System
  • Das Thema Internationalisierung (kurz: I18N) und Lokalisierung (kurz: L10N)
  • Das Log-System
  • Das Caching-System

Fazit:

Das Buch ist auf jeden Fall sehr gelungen und demonstriert den Umfang und die Möglichkeiten des Yii- Application-Frameworks. Es sei an dieser Stelle darauf hingewiesen, dass es in englischer Sprache verfasst ist. Auf jeden Fall ist es keine Lektüre für zwischendurch. Mit dem Werk an der Hand ist es jedoch möglich, sehr schnell einen Einstieg in das Framework zu bekommen.

Datenschutzkonformer Einsatz von Web-Tracking-Tools

Gemäß des Beschlusses (http://www.lfd.m-v.de/dschutz/beschlue/Analyse.pdf) vom 26. und 27. November 2009 des Düsseldorfer Kreises (die obersten Aufsichtsbehörden für den Datenschutz im nicht-öffentlichen Bereich) sind vollständige IP-Adressen personenbezogene Daten und dürfen im Rahmen von Webtracking-Tools nicht mehr erhoben und verarbeitet werden, ohne vorher eine bewusste und eindeutige Einwilligung des Betroffenen einzuholen. Liegt diese Einwilligung nicht vor, ist die IP-Adresse so zu kürzen, dass eine Personenbeziehbarkeit ausgeschlossen ist. Weiter muss auf die Erstellung von pseudonymen Nutzungsprofilen und die Möglichkeit zum Widerspruch in deutlicher Form im Rahmen der Datenschutzerklärung auf der Internetseite hingewiesen werden.

Werden pseudonyme Nutzungsprofile durch einen Auftragnehmer erstellt, sind darüber hinaus die Vorgaben des Bundesdatenschutzgesetzes (BDSG) zur Auftragsdatenverarbeitung durch den Anbieter einzuhalten.

Unsere Lösung

Bei dem Tracking über unsere Lösung anonymisieren wir die IP-Adressen und bieten Ihnen so pseudonyme Nutzungsprofile wie sie gemäß dem oben genannten Beschluss gefordert werden.

Im Rahmen des Setups erstellen wir Ihnen einen ergänzenden Teil für Ihre Datenschutzerklärung und befassen uns auch im Fall eines Widerrufs mit den notwendigen Handlungen.

Buchempfehlung: Webdesign und Web-Usability

Meinung über das Buch: Basiswissen für Web-Entwickler

Wer die theoretischen Ansätze hinter den „Best-Practises“ des Webdesigns und der Web-Usability verstehen möchte, dem sei zu diesem Buch geraten. Es ist ein wissenschaftlich aufgebautes Buch. Das heißt aber auch, dass man keine Anleitung erwarten darf, wie man in 3 Schritten „mal kurz“ ein Webseite technisch und inhaltlich auf Vordermann bringt. Vielmehr gibt es Einblicke in die Wissenschaft, die hinter diesem Apparat des Webdesigns und der Web-Usability zu finden ist.

Aufgrund der schnellen Veränderungen im Layout und Design im Web empfinde ich den Fokus des Buches auch nicht auf dem Webdesign, sondern vielmehr auf der Web-Usability. Web-Usability geht natürlich immer mit Webdesign einher und ohne das eine, ist an das andere nicht zu denken.

Inhalt des Buches

  • Einführung in Webdesign und Web-Usability
  • Konzept und Planung einer Webseite
  • Informationsarchitektur
  • Dialogführung & Navigation
  • Webseiten-Design
  • Farben im Web
  • Texte im Web
  • Bilder im Web
  • Multimedia im Web
  • Formulare & Tabellen
  • Barrierefreies Webdesign

Fazit

Die Autoren Balzert, Klug und Pampuch haben hier eine gute Lektüre für ansonsten eher intuitive Verfahren zusammengestellt. Dies ist sehr detailreich und mit dem Anspruch, einen Bezug zur Praxis herzustellen, gelungen.